一些简单的图像降噪算法

为什么要降噪

在图像记录过程中产生的主要退化常被称为噪声,比如电视播放视频时,其 图像就有可能因为设备原因产生噪声。可来源于测量误差,计算误差。噪声 的存在严重影响了图像的质量,因此在图像增强处理和分类处理之前,必须 予以纠正。本例中处理的常见的噪声有:

椒盐(脉冲)噪声 : 椒盐噪声就是在图像上随机出现黑色白色的像素。噪声脉 冲可正可负,负脉冲(黑色)为椒噪声,正脉冲(白色)为盐噪声。其也是呈 随机分布。每个像素都有可能受到影响而改变灰度值。 高斯噪声 : 指噪声幅度分布满足高斯分布的噪声。一个高斯随机变量 z 的 PDF 可表示为

\[ p(z) = \frac{1}{\sqrt{2\pi}\sigma}exp[-\frac{(z-u)^{2}}{2\sigma^{2}}] \]

高斯噪声的灰度值多集中在均值附近,随着离均值的距离而减少。


算法实现

下述的算法均有一些共同的特点。它们都是从一些统计学的方法来对图像进行处理。 这些滤波器都把每个处理对象看作是以当前像素点为中心的m*n大小的模板(在我的代码里默认大小是3*3)。 在这个大小的区域内对当前这个要处理的像素点做统计学上的处理(比如置为均值,中值……)。 下列噪声滤波器可以分为均值滤波器、排序滤波器和混合滤波器三大类。

均值滤波器

算术均值滤波器 对于一个 m*n 模板,覆盖的图像 f(x,y) 以 x,y 为中心的区域求算术均值。恢 复图像中对应像素点值为:

\[ \hat{f}(x, y)=\frac{1}{mn}\sum\limits_{(p,q)\in W}g(p,q) \]

几何均值滤波器 跟算术均值滤波器类似,只不过求均值的时候用的是几何均值。它的平滑作用与几何均值相当,但在恢复图像时不会像几何均值滤波那么模糊。

\[ \hat{f}(x, y)=[ \prod\limits_{(p,q)\in W}g(p,q) ]^{\frac{1}{mn}} \]

谐波均值滤波器 同上,差别是使用了谐波均值。对高斯噪声的去除效果较好。对椒盐噪声的两部分作用不对称,对盐噪声的去除效果较好。

\[ \hat{f}(x, y)=\frac{mn}{\sum\limits_{(p,q)\in W}\frac{1}{g(p,q)}} \]

排序统计滤波器

中值滤波器 中值滤波器使用覆盖区域中像素的中间值作为输出结果。

\[ \hat{f}(x, y)=median \ { g(p,q) } \]

相对其它算法,该算法在消除椒盐噪声时可以说是效果拔群了。

最大/最小值滤波器 顾名思义,使用覆盖区域中的最大或最小值作为输出结果。可以减弱低取值或者高取值的噪声。分别对消除椒噪声和盐噪声比较有效。

\[ \hat{f}(x, y)=(max\ or\ min){ g(p,q) } \]

中点滤波器 结合了最大值和最小值滤波器的算法。取最大值和最小值的平均作为输出。


用Qt操作图像

Qt5把部分图像的操作封装成了一个类:QImage。每一张图片都可以抽象成一个QImage对象并用面向对象的方法进行操作。

对于读取图片文件,Qt还特意封装了另一个类,QImageReader。在构造函数中指定文件路径就能够读取,通过方法setAutoTransfer 就能自动转换各种格式,最后通过read方法返回一个QImage对象。保存图片时只要调用QImage对象中的save方法并在参数中指定保存路径即可。

Qt中,图像的显示需要依附于一个QLabel元素。由于我们的框架是Qt\ Widget,所以可以在当前的窗体(widget)中设置一个QLabel。 可以向QLabel元素在像素级导入一个QImage对象,然后通过show方法就能显示出图像。

讲道理示例应该使用灰度图像做示例。不过由于目前绝大部分图片都是png或jpg的RGB图像,在此就选择这类图片作为处理的示例。 灰度图像,每个像素点都对应一个值。而RGB图像则能对应三个值,R(red),G(green),B(blue),也就是三原色的值。Qt中有能够返回 RGB图片某个像素点总值的函数,不过千万不能用,因为它只是对RGB三个值的简单按位运算的结果——而我们的降噪方法有不少 本质上都利用了统计学的方法,按位运算的结果不能应用在这些方法上。我们应当分别对RGB三个值进行处理。QImage提供了pixelColor方法获取RGB值,setPixel方法修改像素上的RGB值。


算法测试结果

PKapwQ.png

更新时间: