首先说三点:
比如下面这张 lena.jpg,上面分布了很多白色像素点,在进行图像分割、轮廓查找等高级操作之前,就需要把这些白色点去掉。
在讲如何平滑之前,咱们先讲讲如何给一张清晰的照片添加噪声。有了噪声,后面才好进行平滑处理。这一篇文章也算是一个实际的小案例应用。比如我们有这么一张清晰的照片:
微小斑点的噪声也就是椒盐噪声,其中椒噪声可以理解为黑点点,盐噪声可以理解为白点点。执行以下代码,为图片添加噪声:
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);
参数说明:
输出结果如下图所示:
仔细看输出结果,是不是清晰的图片上多了很多黑色的点点,这个就是椒噪声。
前面的噪声是一个像素值,如果想要制造更大的噪声呢,看下面的代码:
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);
参数说明:
提示:不论是黑色椒噪声,还是白色盐噪声,都是越小越好处理,越大的噪声,处理完图像丢失的细节就越多。下一篇开始详细举例子。
原创不易,请勿抄袭。共同进步,相互学习。