1 概述
均值滤波,是最简单的一种滤波操作,输出图像的每一个像素是核窗口内输入图像对应像素的平均值(所有像素加权系数相等),其实说白了它就是归一化后的方框滤波。我们在下文进行源码剖析时会发现,blur函数内部中其实就是调用了一下boxFilter。
下面开始讲均值滤波的内容吧。
2 均值滤波的理论简析
均值滤波是典型的线性滤波算法,主要方法为邻域平均法,即用一片图像区域的各个像素的均值来代替原图像中的各个像素值。一般需要在图像上对目标像素给出一个模板(内核),该模板包括了其周围的临近像素(比如以目标像素为中心的周围8(3x3—1)个像素,构成一个滤波模板,即去掉目标像素本身)。再用模板中的全体像素的平均值来代替原来像素值。即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度点g (x,y),即
其中m为该模板中包含当前像素在内的像素总个数。
3 均值滤波的缺陷
均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。
4 均值滤波—blur函数
blur函数的作用是:对输入的图像src进行均值滤波后用dst输出。blur 函数在OpenCV 官方文档中,给出的其核是这样的:
这个内核一看就明了,就是在求均值,即blur函数封装的就是均值滤波。blur函数的原型如下。
- 第一个参数, InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。该函数对通道是独立处理的,且可以处理任意通道数的图片。但需要注意的是,待处理的图片深度应该为CV_8U、CV_16U、CV_16S、CV_32F 以及 CV_64F之一。
- 第二个参数, OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。
- 第三个参数,Size类型(对Size类型稍后有讲解)的ksize,内核的大小。一般写作Size(w,h)来表示内核的大小(其中,w为像素宽度,h为像素高度)。Size(3,3)就表示3x3的核大小, Size(5,5)就表示5x5的核大小
- 第四个参数, Point类型的anchor,表示锚点(即被平滑的那个点),注意它有默认值Point(—1,—1)。如果这个点坐标是负值,就表示取核的中心为锚点,所以默认值Point(—1,—1)表示这个锚点在核的中心。
- 第五个参数, int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。
5 示例
代码
原图
效果图
对比图