【Emgu CV教程】6.1、图像平滑之添加雪花噪声

发布时间:2024年01月24日


前言

首先说三点:

  1. 图像平滑,一般就是指对图像进行模糊或去噪,平滑后的图像减少了噪声,也会减少图像细节纹理。
  2. 本单元讲的都是空间域滤波,也就是通过目标像素点的周围(邻域)的像素值,根据一定的数学运算,替换原有像素值。还有一种是频率域滤波---------------傅里叶滤波,这个后面单独再讲。
  3. 图像平滑很重要,特别是在图像计算的预处理阶段,读者们要好好体会。

一、什么样的图像需要平滑?

比如下面这张 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像素,输出结果如下图所示:
    在这里插入图片描述

总结

提示:不论是黑色椒噪声,还是白色盐噪声,都是越小越好处理,越大的噪声,处理完图像丢失的细节就越多。下一篇开始详细举例子。

原创不易,请勿抄袭。共同进步,相互学习。

文章来源:https://blog.csdn.net/sswss12345/article/details/135740247
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。