1.基本原理
与均值滤波不同的是,方框滤波不会计算像素的均值
。在均值滤波中,滤波结果的像素值是任意一个点的邻域平均值,等于各邻域像素值之和除以邻域面积。而在方框滤波中,可以自由选择是否对均值滤波的结果进行归一化,即可以自由选择滤波结果是邻域像素值之和的平均值,还是邻域像素值之和。以5×5的邻域为例
,在进行方框滤波时,如果计算的是邻域像素值的均值,则滤波关系如图1-1所示;如果计算的是邻域像素值之和,则滤波关系如图1-2所示。图1-1 方框滤波关系示例–计算邻域像素值均值
图1-2 方框滤波关系示例–计算邻域像素值之和
根据上述关系,如果计算的是领域像素值的均值,则使用的卷积核如图1-3所示
图1-3 计算邻域像素值均值所用的卷积核示例
如果计算的是邻域像素值之和,则使用的卷积核如图1-4所示:
图1-4 计算邻域像素值之和所用的卷积核示例
2.函数语法
在OpenCV中,实现方框滤波的函数是cv2.boxFilter(),其语法格式为:
dst = cv2.boxFilter( src, ddepth, ksize, anchor, normalize, borderType )
参数解析:
dst
:返回值,表示经过方框滤波处理后的结果。
src
:需要被处理的图像,即原始图像。它能够有任意数量的通道,并能对各个通道独立处理。图像深度可以是 CV_8U、CV_16U、CV_16S、CV_32F 或者 CV_64F 中的一种。
ddepth
:处理后结果图像的深度,一般使用-1表示与原始图像使用相同的图像深度。
ksize
:滤波核的大小。滤波核大小是指在滤波处理过程中所选择的邻域图像的高度和宽度。例如,滤波核的值可以为(3,3),表示以3×3大小的邻域均值作为图像均值滤波处理的结果,如下图2-1所示。
图2-1 3×3大小的滤波核
anchor
:锚点,默认值为(-1, -1),表示当前计算均值的点位于核的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点作为锚点。
normalize
:表示在滤波时是否进行归一化(这里指将计算结果规范化为当前像素值范围内的值)处理,该参数是一个逻辑值,可能为真(值为 1)或假(值为 0)
当参数
normalize=0
时,
表示不需要进行归一化处理,直接使用邻域像素值的和。
当参数
normalize=1
时,
表示要进行归一化处理,要用邻域像素值的和除以面积。
通常情况下,针对方框滤波,卷积核可以如下图2-2表示:
图2-2 方框滤波卷积核示意图
上述对应关系如图2-3所示:
图2-3 卷积核中的对应关系
例如,针对5×5邻域,当参数normalize=1时,要进行归一化处理,此时计算的就是均值滤波。这种情况下,函数 cv2.boxFilter()和函数 cv2.blur()的作用是一样的。此时,对应的卷积核如图2-4所示:
图2-4 参数 normalize=1时的卷积核
同样针对5×5邻域,当参数normalize=0时,不进行归一化处理,此时滤波计算的是邻域像素值之和,使用的卷积核如图2-5所示:
图2-5 参数normalize=0时的卷积核
当 normalize=0时,由于不进行归一化处理,
因此滤波得到的值很可能超过当前像素值范围的最大值,从而被截断为最大值
。
通常情况下,在使用方框滤波函数时,对于参数
anchor
、
normalize
和
borderType
,直接采用其默认值即可。因此,函数 cv2.boxFilter()的常用形式为:
dst = cv2.boxFilter( src, ddepth, ksize )
3.程序示例
针对一幅噪声图像,使用方框滤波函数 cv2.boxFilter()内将参数 normalize 的值分别设置为0和1,分别显示其滤波处理结果。
import cv2
Gn=cv2.imread("Gaussian_noise.jpg")
Bf0=cv2.boxFilter(Gn,-1,(2,2),normalize=0)
Bf1=cv2.boxFilter(Gn,-1,(2,2),normalize=1)
cv2.imshow("噪声图像",Gn)
cv2.imshow("不进行归一化处理",Bf0)
cv2.imshow("进行归一化处理",Bf1)
cv2.waitKey()
cv2.destroyAllWindows()
图3-1 噪声图像
图3-2 不进行归一化处理的结果图像
图3-3 进行归一化处理的结果图像
从图3-3可以看出,
设置参数normalize为1时(默认值) 时,滤波结果与函数均值滤波cv2.blur()的结果是完全相同的
。
从图3-2是将参数normalize设置为0的滤波处理结果,即没有对图像进行归一化处理。所以在进行滤波时,计算的是 2×2 邻域的像素值之和,图像的像素值基本都会超过当前像素值的最大值 255。因此,最后得到的图像接近纯白色,部分点处有颜色。
部分点有颜色是因为这些点周边邻域的像素值均较小,邻域像素值在相加后仍然小于255
。