OpenCV之滤波操作

图像滤波与滤波器

首先我们看一下图像滤波的概念。图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。
消除图像中的噪声成分叫作图像的平滑化或滤波操作。信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经常被噪声淹没。因此一个能降低高频成分幅度的滤波器就能够减弱噪声的影响。
图像滤波的目的有两个:一是抽出对象的特征作为图像识别的特征模式;另一个是为适应图像处理的要求,消除图像数字化时所混入的噪声。
而对滤波处理的要求也有两条:一是不能损坏图像的轮廓及边缘等重要信息;二是使图像清晰视觉效果好。

平滑滤波是低频增强的空间域滤波技术。它的目的有两类:一类是模糊;另一类是消除噪音。(各种“两",:))
空间域的平滑滤波一般采用简单平均法进行,就是求邻近像元点的平均亮度值。邻域的大小与平滑的效果直接相关,邻域越大平滑的效果越好,但邻域过大,平滑会使边缘信息损失的越大,从而使输出的图像变得模糊,因此需合理选择邻域的大小。
关于滤波器,一种形象的比喻法是:我们可以把滤波器想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口放到图像之上,透过这个窗口来看我们得到的图像。
滤波器的种类有很多, 在新版本的OpenCV中,提供了如下五种常用的图像平滑处理操作方法,且他们分别被封装在单独的函数中,使用起来非常方便:

  • 方框滤波——boxblur函数
  • 均值滤波(邻域平均滤波)——blur函数
  • 高斯滤波——GaussianBlur函数
  • 中值滤波——medianBlur函数
  • 双边滤波——bilateralFilter函数

滤波处理分为两大类:线性滤波和非线性滤波。

线性滤波

方框滤波、均值滤波、高斯滤波

线性滤波两个信号之和的响应和他们各自响应之和相等。换句话说,每个像素的输出值是一些输入像素的加权和,线性滤波器易于构造,并且易于从频率响应角度来进行分析。

线性滤波器:

线性滤波器经常用于剔除输入信号中不想要的频率或者从许多频率中选择一个想要的频率。

几种常见的线性滤波器:

允许低频率通过的低通滤波器。
允许高频率通过的高通滤波器。
允许一定范围频率通过的带通滤波器。
阻止一定范围频率通过并且允许其它频率通过的带阻滤波器。
允许所有频率通过、仅仅改变相位关系的全通滤波器。
阻止一个狭窄频率范围通过的特殊带阻滤波器,陷波滤波器(Band-stop filter)。
 

方框滤波(box Filter)

方框滤波(box Filter)被封装在一个名为boxblur的函数中,即boxblur函数的作用是使用方框滤波器(box filter)来模糊一张图片,从src输入,从dst输出。

函数原型如下:

void boxFilter(InputArray src,OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), boolnormalize=true, int borderType=BORDER_DEFAULT )

均值滤波


均值滤波就是方框滤波的一个特殊情况。主要方法为邻域平均法,即用一片图像区域的各个像素的均值来代替原图像中的各个像素值。

是最简单的一种滤波操作,输出图像的每一个像素是核窗口内输入图像对应像素的像素的平均值( 所有像素加权系数相等),其实说白了它就是归一化后的方框滤波。

我们在进行源码剖析时会发现,blur函数内部中其实就是调用了一下boxFilter。

均值滤波的缺点就是不能很好地保护细节,在图像去燥的同时也破坏了图像的而细节部分,从而使图像变得模糊,不能很好的去除噪点。

blur函数的原型:

C++: void blur(InputArray src, OutputArraydst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )

高斯滤波

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。

通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
从数学的角度来看,图像的高斯模糊过程就是图像与正态分布做卷积。由于正态分布又叫作高斯分布,所以这项技术就叫作高斯模糊。

GaussianBlur函数的作用是用高斯滤波器来模糊一张图片,对输入的图像src进行高斯滤波后用dst输出。它将源图像和指定的高斯核函数做卷积运算,并且支持就地过滤(In-placefiltering)。

void GaussianBlur(InputArray src,OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, intborderType=BORDER_DEFAULT )

从效果看出,高斯滤波的而模糊感明显降低。

滤波和模糊

滤波可分低通滤波和高通滤波两种。而高斯滤波是指用高斯函数作为滤波函数的滤波操作,至于是不是模糊,要看是高斯低通还是高斯高通,低通就是模糊,高通就是锐化。

高斯滤波是指用高斯函数作为滤波函数的滤波操作。

高斯模糊就是高斯低通滤波。

非线性滤波

中值滤波、双边滤波

中值滤波

基本思想就是用像素点的领域灰度的中值来代替该像素点的灰度值,该方法在去除脉冲噪声、椒盐噪声的同时又能保留图像的细节(不会出现边缘模糊的情况)。中值滤波在一定的条件下可以克服常见线性滤波器如最小均方滤波、方框滤波器、均值滤波等带来的图像细节模糊,而且对滤除脉冲干扰及图像扫描噪声非常有效,也常用于保护边缘信息, 保存边缘的特性使它在不希望出现边缘模糊的场合也很有用,是非常经典的平滑噪声处理方法。

中值滤波跟均值滤波的思想看起来很相似,只是一个取平均值,一个取中位数而已。

中值滤波与均值滤波的比较:均值滤波中噪声成分会被加入到平均计算,所以输出是受到噪声的影响的。但是中值滤波中,由于噪声成分很难选上,所以基本不影响输出。因此同样用3x3区域进行处理,中值滤波消除的噪声能力更胜一筹。中值滤波无论是在消除噪声还是保存边缘方面都是一个不错的方法。 

当然好的性能也需要付出一点代价的,中值滤波花费的时间是均值滤波的5倍以上。

中值滤波一般采用奇数的卷积核。

中值滤波对一些细节多(特别是细、尖顶的)的图像不太适合

双边滤波

双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。

双边滤波的最大特点就是做边缘保存。

效果图看来,双边滤波是所有滤波中最清晰的。

代码:

//7.滤波操作
int main()
{
	Mat img = imread("dog.jpg");
	imshow("原始图", img);
	Mat out;
	//方框滤波
	boxFilter(img, out, -1, Size(5, 5));//-1指原图深度 
	imshow("方框滤波", out);

	Mat out2;
	blur(img, out2,Size(5, 5));//-1指原图深度
	imshow("均值滤波", out2);

	Mat out3;
	GaussianBlur(img, out3, Size(3, 3), 0, 0);
	imshow("高斯滤波", out3);

	Mat out4;
	medianBlur(img, out4, 7);//第三个参数表示孔径的线性尺寸,它的值必须是大于1的奇数
	imshow("中值滤波", out4);

	Mat out5;
	bilateralFilter(img, out5, 25, 25 * 2, 25 / 2);
	imshow("双边滤波", out5);
	waitKey(0);

}

整体效果图:

参考文献:

1.https://blog.csdn.net/poem_qianmo/article/details/22745559 

猜你喜欢

转载自blog.csdn.net/Gavinmiaoc/article/details/84070459
今日推荐