滤波目的:消除图像中混入的噪声。为图像识别抽取出图像特征。
滤波要求:不能损坏图像轮廓及边缘 。图像视觉效果应当更好。
图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。消除图像中的噪声成分叫作图像的平滑化或滤波操作。
信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经常被噪声淹没。因此一个能降低高频成分幅度的滤波器就能够减弱噪声的影响。平滑滤波是低频增强的空间域滤波技术。
它的目的有两类:一类是模糊;另一类是消除噪音。空间域的平滑滤波一般采用简单平均法进行,就是求邻近像元点的平均亮度值。邻域的大小与平滑的效果直接相关,邻域越大平滑的效果越好,但邻域过大,平滑会使边缘信息损失的越大,从而使输出的图像变得模糊,因此需合理选择邻域的大小。
关于滤波器,一种形象的比喻法是:我们可以把滤波器想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口放到图像之上,透过这个窗口来看我们得到的图像。
1、方框滤波(盒式滤波)
方框滤波(盒式滤波)是一种线性滤波技术,它的实现借鉴了积分图像的原理思想,在快速积分图像求解中,将计算某个矩阵像素间的和值运算,转化为求矩阵对应边角点的求和差值运算。盒式滤波的实现最关键的步骤就是初始化数组S,数组S的每个值是存放像素邻域内的像素和值,在求解某矩形块中的像素和时,只需要索引对应区域的位置存放的和值就可以完成计算。
原理:先给出内核,用内核各点的值与对应的图像像素值相乘:
OpenCV将盒式滤波封装在boxFilter()函数中,作用是输入一副图像对其进行盒式滤波。感兴趣的同学可以看看其源代码。下面来看下boxFilter()函数的定义:
void boxFilter( InputArray src, OutputArray dst, int ddepth, Size ksize,
Point anchor=Point(-1,-1), bool normalize=true, int borderType=BORDER_DEFAULT );
参数说明:
参数1:输入要处理的图像。
参数2:得到处理后的的输出图像。
参数3:图像的深度。-1代表使用原图深度,即src.depth()。
参数4:内核的大小。一般用Size(w,h)来表示内核大小,其中w为像素宽度,h为像素高度,正奇数或0。例:Size(3,3)就代表3×3的核大小。
参数5:表示锚点,即被平滑的那个点。如果这个点坐标是负值的话,就表示取核的中心点为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。
参数6:默认值为true,一个标识符,表示内核是否被其区域归一化了,具体见下面介绍。
参数7:用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT,我们一般不用管它。
boxFilter()函数盒式滤波所用的核表示如下&