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时,由于不进行归一化处理,因此滤波得到的值很可能超过当前像素值范围的最大值,从而被截断为最大值

通常情况下,在使用方框滤波函数时,对于参数 anchornormalizeborderType,直接采用其默认值即可。因此,函数 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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐