数字图像处理:噪声模型(椒盐噪声、随机噪声、高斯噪声)和滤波方法

图像噪声是图像在获取或传输过程中受到随机信号干扰,妨碍人们对图像理解及分析的信号。很多时候将图像噪声看作多维随机过程,因而描述噪声的方法完全可以借用随机过程的描述,即使用其概率分布函数和概率密度分布函数。图像噪声的产生来自图像获取中的环境条件和传感元器件自身的质量,图像在传输过程中产生图像噪声的主要因素是所用的传输信道受到噪声污染。

一、噪声类型

1、椒盐噪声(盐=白色,椒=黑色

椒盐噪声是数字图像中的常见噪声,一般是由图像传感器、传输信道及解码处理等产生的黑白相见的亮暗点噪声,椒盐噪声常由图像切割产生。椒盐噪声是指两种噪声:盐噪声(salt noise)及椒噪声(pepper noise)。盐噪声一般是白色噪声,椒噪声一般是黑色噪声,前者高灰度噪声,后者属于低灰度噪声,一般两种噪声同时出现,呈现在图像上就是黑白杂点。图像去除脉冲干扰及椒盐噪声最常用的算法是中值滤波,图像模拟添加椒盐噪声是通过随机获取像素值点并设置为高亮点来实现的。

 

2.随机噪声

随机噪声,又称背景噪声,由时间上随机产生的大量起伏骚扰积累而造成的,其值在给定瞬间内不能预测的噪声。说实话没大理解,后来在老师的ppt课件上发现了随机值脉冲噪声,感觉它的效果和椒盐噪声很像。又百度了一下,发现脉冲噪声的特点是无规则。于是本算法基本和椒盐噪声的实现相似,可以控制噪声数量,随机生成黑白杂点,但此黑白杂点也是随机色值(a,b,c)(255-a,255-b,255-c),其中a,b,c是0-30的随机数,这些杂点在图像坐标内随机分布。
 

3.高斯噪声

高斯噪声是指概率密度函数服从高斯分布(即正态分布)的一类噪声。如果一个噪声,它的幅度服从高斯分布,而它的功率谱密度又是分布均匀的,则称它为高斯白噪声。高斯白噪声的二阶矩不想关,一阶矩为常数,是指先后信号在时间上的相关性。高斯白噪声包括热噪声和散粒噪声。高斯噪声完全由其时变平均值和两瞬时的协方差函数来确定,若噪声为平稳的,则平均值与时间无关,而协方差函数则变成仅和所考虑的两瞬时之方差有关的相关函数,它在意义上等效于功率谱密度。高斯噪声可以由大量独立的脉冲产生,从而在任何有限时间间隔内,这些脉冲中的每一个脉冲值与所有脉冲值的总和相比都可以忽略不计。

 

二、滤波

常见的滤波方式有均值滤波、中值滤波、高斯滤波等。

1、均值滤波—mean_image

       均值滤波又称作邻域平均法,是典型的线性滤波算法,理想的均值滤波是用每个像素和它周围像素计算出来的平均值替换图像中每个像素。
       从频率域观点来看均值滤波是一种低通滤波器(让图像的低频部分通过,通常弱化边缘,会得到比较平缓的图像),高频信号将会去掉,因此可以帮助消除图像尖锐噪声,实现图像平滑,模糊等功能。因为此方法不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊。采样Kernel数据通常是3X3的矩阵,如下表示:

image.png

  从左到右从上到下计算图像中的每个像素,最终得到处理后的图像。均值滤波可以加上两个参数,即迭代次数,Kernel数据大小。一个相同的Kernel,但是多次迭代就会效果越来越好。同样,迭代次数相同,Kernel矩阵越大,均值滤波的效果就越明显。

优势:消除尖锐噪声,实现图像平滑,模糊等功能。

 

2、中值滤波—median_Image,适用于椒盐噪声

       中值滤波也是消除图像噪声最常见的手段之一,特别是消除椒盐噪声,中值滤波的效果要比均值滤波更好。它的基本原理是计算出数字图像中的一点的一个邻域中的各点值的中值(中间值),并使用该中值将将该点原值代替。可以理解为使用一个窗口沿图像移动,用窗口内所有象素灰度的中值来代替窗口中心位置的象素灰度。窗口根据需要定义,可以是3* 3,5 *5的方形、十字形或者圆形等。


image.png

优势:消除椒盐噪声。

 

3、高斯滤波—gauss_image,适用于高斯噪声

       高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。可以理解为用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。

优势:消除高斯噪声。

产生原因:

图像传感器在拍摄时市场不够明亮、亮度不够均匀;
电路各元器件自身噪声和相互影响;
图像传感器长期工作,温度过高。

 

三、举例

1、halcon示例

*中值滤波,去除椒盐噪声
read_image (Image, 'D:/hellowprld/2/OtherSquare_1.jpg')
*彩色转灰度图
count_channels (Image, Channels)
if (Channels == 3 or Channels == 4)
    rgb1_to_gray (Image, Image)
endif
 
*因为边界处往往无法移动滤波窗口,因此需要对像素做补充.
*'continued'表示延伸边界像素
*'cyclic'表示循环延伸边界像素
median_image (Image, ImageMedian, 'circle', 3, 'continued')
median_image (Image, ImageMedian2, 'circle', 3, 'cyclic')
dev_display (ImageMedian)
write_image (ImageMedian, 'jpeg 100', 0, 'D:/hellowprld/2/medianBlur.jpg')
stop()

2、opencv中提供了medianBlur()函数实现了中值滤波操作,其原型如下:

void medianBlur(InputArray src, OutputArray dst, int ksize)

参数解释:

InputArray src: 输入图像,图像为1、3、4通道的图像,当模板尺寸为3或5时,图像深度只能为CV_8U、CV_16U、CV_32F中的一个,如而对于较大孔径尺寸的图片,图像深度只能是CV_8U。

OutputArray dst: 输出图像,尺寸和类型与输入图像一致,可以使用Mat::Clone以原图像为模板来初始化输出图像dst。

int ksize: 滤波模板的尺寸大小,必须是大于1的奇数,如3、5、7…… 

Mat SrcImage;
Mat DstImage;
int nkernelSize = 3;
medianBlur(SrcImage, DstImage, nkernelSize);

opencv完整版源码:

int main(int argc, char** argv)
{
	Mat SrcImage = imread("D:\\hellowprld\\2\\4.jpg", IMREAD_GRAYSCALE);
	int h = SrcImage.rows;
	int w = SrcImage.cols;
	if (h == 0 || w == 0)
	{
		return -1;
	}
 
	namedWindow("input", WINDOW_NORMAL);
	imshow("input", SrcImage);
 
	Mat DstImage;
	int nkernelSize = 3;
	cv::medianBlur(SrcImage, DstImage, nkernelSize);
	namedWindow("output", WINDOW_NORMAL);
	imshow("output", DstImage);
	imwrite("medianBlur.jpg", DstImage);
 
	waitKey(0);
}

---

参考文献:

http://blog.sina.com.cn/s/blog_159aff7940102xcme.html

https://blog.csdn.net/u013033431/article/details/50907806

https://blog.csdn.net/weixin_43197380/article/details/91045946


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年3月    »
123
45678910
11121314151617
18192021222324
25262728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864