在数字图像处理常见的变换核及其用途中,已经说明了线性滤波。线性滤波是算术运算,有固定的模板,即:变换核。
中值滤波是非线性滤波,没有固定的变换核。它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。
百度百科中是这样描述中值滤波的原理:
中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为3*3,5*5区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。
在OpenCV中,我们都是去取一个奇数的正方形模板,例如:3*3,5*5,7*7等。
中值滤波对脉冲噪声(椒盐噪声)有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘,使之不被模糊。这些优良特性是线性滤波方法所不具有的。此外,中值滤波的算法比较简单,也易于用硬件实现。(DSP芯片实现)
椒盐噪声:椒盐噪声也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。椒盐噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等。例如失效的感应器导致像素值为最小值,饱和的感应器导致像素值为最大值。
中值滤波的原理和应用我们也搞明白了,下面来看一个实际的例子。例子中的图片仍旧是来自百度百科的。
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat src = imread("C:/Users/zhou_/Desktop/3.jpg");
imshow("src", src);
Mat dst;
//中值滤波,二维模版大小取13*13
medianBlur(src, dst, 13);
imshow("result", dst);
waitKey(0);
return 0;
}
可以看到中值滤波的效果还是非常显著的,它有效的去除了图中的椒盐噪声。
需要说明的一点是邻域的大小与平滑的效果直接相关,邻域越大平滑的效果越好,但邻域过大,平滑会使边缘和轮廓信息损失的越大,从而使输出的图像变得模糊,因此需合理选择邻域的大小。如果在这个程序中选择的邻域范围是3*3,那么几乎不会有什么效果。