文章目录
- 前言
- 一、什么样的图像需要平滑?
- 二、平滑的办法有哪些
- 三、制作需要平滑的图片
- 1.制作微小斑点的噪声
- 2.制作稍大一点的噪声
- 总结
前言
首先说三点:
- 图像平滑,一般就是指对图像进行模糊或去噪,平滑后的图像减少了噪声,也会减少图像细节纹理。
- 本单元讲的都是空间域滤波,也就是通过目标像素点的周围(邻域)的像素值,根据一定的数学运算,替换原有像素值。还有一种是频率域滤波---------------傅里叶滤波,这个后面单独再讲。
- 图像平滑很重要,特别是在图像计算的预处理阶段,读者们要好好体会。
一、什么样的图像需要平滑?
比如下面这张 lena.jpg,上面分布了很多白色像素点,在进行图像分割、轮廓查找等高级操作之前,就需要把这些白色点去掉。
二、平滑的办法有哪些
- 最大值滤波
- 最小值滤波
- 均值滤波
- 方框滤波
- 高斯滤波
- 中值滤波
- 保边滤波等等…
三、制作需要平滑的图片
在讲如何平滑之前,咱们先讲讲如何给一张清晰的照片添加噪声。有了噪声,后面才好进行平滑处理。这一篇文章也算是一个实际的小案例应用。比如我们有这么一张清晰的照片:
1.制作微小斑点的噪声
微小斑点的噪声也就是椒盐噪声,其中椒噪声可以理解为黑点点,盐噪声可以理解为白点点。执行以下代码,为图片添加噪声:
int width = srcMat.Cols;
int height = srcMat.Rows;
int blueValue = Convert.ToInt16(TextBoxBlue.Text.Trim().ToString());
int greenValue = Convert.ToInt16(TextBoxGreen.Text.Trim().ToString());
int redValue = Convert.ToInt16(TextBoxRed.Text.Trim().ToString());
int noiseNum = Convert.ToInt32(TextBoxNum.Text.Trim().ToString());
Random rand = new Random();
Mat tempMat = srcMat.Clone();
Image<Bgr, int> dstImage = tempMat.ToImage<Bgr, int>();
int i;
int j;
for (int k = 0; k < noiseNum; k++)
{i = rand.Next(0, height);j = rand.Next(0, width);dstImage.Data[i, j, 0] = blueValue;dstImage.Data[i, j, 1] = greenValue;dstImage.Data[i, j, 2] = redValue;
}Mat dstMat = dstImage.Mat;
dstMat.ConvertTo(dstMat, DepthType.Cv8U);
CvInvoke.Imshow("Add noise,point, " + dstMat.Size.ToString(), dstMat);
参数说明:
- width:原始图像宽度
- height:原始图像高度度
- blueValue:噪声点蓝色通道值,这里为0
- greenValue:噪声点绿色通道值,这里为0
- redValue:噪声点红色通道值,这里为0
- noiseNum:噪声点数量,这里为4000
输出结果如下图所示:
仔细看输出结果,是不是清晰的图片上多了很多黑色的点点,这个就是椒噪声。
2.制作稍大一点的噪声
前面的噪声是一个像素值,如果想要制造更大的噪声呢,看下面的代码:
Mat dstMat = srcMat.Clone();
int width = srcMat.Cols;
int height = srcMat.Rows;
int blueValue = Convert.ToInt16(TextBoxBlue.Text.Trim().ToString());
int greenValue = Convert.ToInt16(TextBoxGreen.Text.Trim().ToString());
int redValue = Convert.ToInt16(TextBoxRed.Text.Trim().ToString());
int noiseNum = Convert.ToInt32(TextBoxNum.Text.Trim().ToString());
Random rand = new Random();int i;
int j;
for (int k = 0; k < noiseNum; k++)
{i = rand.Next(0, height);j = rand.Next(0, width);CvInvoke.Circle(dstMat, new System.Drawing.Point(j, i), 3, new MCvScalar(blueValue, greenValue, redValue), -1, LineType.EightConnected, 0); // thickness = -1,代表实心圆
}CvInvoke.Imshow("Add noise,circle, " + dstMat.Size.ToString(), dstMat);
参数说明:
- width:原始图像宽度
- height:原始图像高度度
- blueValue:噪声点蓝色通道值,这里为255
- greenValue:噪声点绿色通道值,这里为255
- redValue:噪声点红色通道值,这里为255
- noiseNum:噪声点数量,这里为4000
这段程序为原始图像添加了4000个白色的圆,圆半径为3像素,输出结果如下图所示:
总结
提示:不论是黑色椒噪声,还是白色盐噪声,都是越小越好处理,越大的噪声,处理完图像丢失的细节就越多。下一篇开始详细举例子。
原创不易,请勿抄袭。共同进步,相互学习。