OpenCV还提供了方框滤波方式,与均值滤波的不同在于,方框滤波不会计算像素均值,在均值滤波中,滤波结果的像素值是任意一个点的邻域平均值,等于各邻域像素值之和除以领域面积,而在方框滤波中,可以自由选择是否对均值滤波的结果进行归一化,即可以自由选择滤波结果是邻域像素值之和的平均值,还是邻域像素值之和
7.2.1 基本原理
我们以 5x5 的邻域为例,在进行方框滤波时,如果计算的是邻域像素值的均值,则滤波关系如图 7-15 所示
微信图片_20190709202449.jpg仍然以 5×5 的邻域为例,在进行方框滤波时,如果计算的是邻域像素值之和、则滤波关系如图 7-16 所示
根据上述关系,如果计算的是邻域像素值的均值,则使用的卷积核为
微信图片_20190709202610.jpg7.2.2 函数语法
在 OpenCV中,实现方框滤波的函数是 cv2 boxFilter0,其语法格式为:
dst= cv2.boxFilter( src, ddepth, ksize, anchor, normalize, borderType)
式中
1.dst 是返回值,表示进行方框滤波后得到的处结果。
2.src是需要处理的图像,即原始图像。它能够有任意数量的通道,并能对各个通道独立 处理:图像深度应该是 CV_8U、CV_16U、CV_168、CV_32F 或者 CV_64F 中的一种
- ddepth是处理结果图像的图像深度,一般使用1 表示与原始图像使用相同的图像深度
4.ksize是滤波核的大小。滤波核大小是指在滤波处理过程中所选择的邻域图像的高度和宽度。例如,滤波核的值可以为(3,3),表示以 3×3 大小的邻域均值作为图像均值滤波处理的结果,如下式所示
5.anchor 是锚点,其默认值是(1,-1),表小当前计算均值的点位于核的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点作为锚点
6.normalize 表示在滤波时是否进行归一化(这里指将计算结果规范化为当前像素值范围内的值)处理,该参数是一个逻辑值,可能为真值为 1)或假(值为 0)
6.1当参数 normalize = 1时,表示要进行归一化处理,要用邻域像素值的和除以面积
6.2当参数 normalize =0时,表示不需要受进行一化处理,直接使用邻域像素值的和
通常情况下,针对方框滤波,卷积核可以表示为
上式对应关系:
例如,针对 5×5 邻域,当参数 normalize=1时,要进行归一化处理,此时计算的就是均值滤波,这种情况下,函数cv2.boxFilter( )和函数 cv2.blur()的作用是一样的。此时,对应的卷积核为
同样针对 5x5 邻域,当参数 normaliz=0时,不进行归一化处理,此时滤波计算的是 邻域像素值之和,使用的卷积核是
当 normalize =0 时,因为不进行归一化处理,因此滤波得到的值很可能超过当前像素值范围的最大值,从而被截断为最大值。这样,就会得到一幅纯白色的图像
borderType 是边界样式,该值决定了以何种方式处理边界
通常情况下,在使用方框滤波函数时,对于参数 anchor, normalize, borderType,,直接
使用默认值即可。因此,函数 cv2.boxFilter( )的常用形式为
dst = cv2.boxFilter( src,ddepth,ksize)
7.2.3 程序示例
【7.3】针对噪声图像,对其进行方框滤波,显示滤波结果
根据题目要求,使用方框滤波函数 cv2.boxFilter( ) 对原始图像进行滤波,设计代码如下
import cv2
o=cv2.imread("C:\\Users\\Administrator\\Desktop\\opencv\\lenaNoise.png")
r=cv2.boxFilter(o,-1,(5,5))
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
在本例中,方框滤波函数对normalize 参数使用了默认值,在默认情况下,该值为1,表示要进行归一化处理,也就是说,本何中使用的是 normalize 为默认值 True的 cv2.boxFilter()函数和函数 cv2.blur() 的滤结果是完全相同的,如图
1562677614(1).png在本例中,方框滤波语句 cv2.boxFilter(o,-1.(5.5))使用了参数 normalize 的默认值,相当于省略了 normalize=1,因此,该语与cv2.boxFilter(o,-1.(5.5), normalize=1)是等效的,当然此时该语句与均值滤波语句 5= cv2.blur(o,(5.5)也是等效的
【7.4】针对噪声图像,在方框滤波函数cv2.boxFilter()内将参数 normalize 的值设置为0显示滤波处理结果
import cv2
o=cv2.imread("C:\\Users\\Administrator\\Desktop\\opencv\\lenaNoise.png")
r=cv2.boxFilter(o,-1,(5,5),normalize=0)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
1562677957(1).png
在本例中,没有对图像进行归一化处理。在进行滤波时,计算的是 5×5 邻域的像素值之和图像的像素值基本都会超过当前像素值的最大值 255。因此,最后得到的图像接近纯白色,部分点处有颜色,部分点有颜色是因为这些点周边邻域的像素值均较小,邻域像素值在相加后仍然小于 255
【7.5】针对噪声图像,使用方框滤波函数 cv2.boxFilter() 去噪,将参数 normalize 的值置为 0,将卷积核的大小没置为 2×2,显示滤液结果
根据题目要求,编写程序代码如下:
import cv2
o=cv2.imread("C:\\Users\\Administrator\\Desktop\\opencv\\lenaNoise.png")
r=cv2.boxFilter(o,-1,(2,2),normalize=0)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
1562678170(1).png
在本例中,卷积核大小为 2×2,参数 normalize=0.因此,本例中方框滤波计算的是 2×2邻域的像素值之和,四个像素值的和不一定大于 255,因此在计算结果图像中有部分像素点不是自色。如图 7.19 所示,左图是原始图像,右图是方框滤波处理结果。
网友评论