美文网首页
7.2 方框滤波

7.2 方框滤波

作者: dinel | 来源:发表于2019-07-09 20:02 被阅读0次

    OpenCV还提供了方框滤波方式,与均值滤波的不同在于,方框滤波不会计算像素均值,在均值滤波中,滤波结果的像素值是任意一个点的邻域平均值,等于各邻域像素值之和除以领域面积,而在方框滤波中,可以自由选择是否对均值滤波的结果进行归一化,即可以自由选择滤波结果是邻域像素值之和的平均值,还是邻域像素值之和

    7.2.1 基本原理

    我们以 5x5 的邻域为例,在进行方框滤波时,如果计算的是邻域像素值的均值,则滤波关系如图 7-15 所示

    微信图片_20190709202449.jpg

    仍然以 5×5 的邻域为例,在进行方框滤波时,如果计算的是邻域像素值之和、则滤波关系如图 7-16 所示

    根据上述关系,如果计算的是邻域像素值的均值,则使用的卷积核为

    微信图片_20190709202610.jpg

    7.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 中的一种

    1. ddepth是处理结果图像的图像深度,一般使用1 表示与原始图像使用相同的图像深度
      4.ksize是滤波核的大小。滤波核大小是指在滤波处理过程中所选择的邻域图像的高度和宽度。例如,滤波核的值可以为(3,3),表示以 3×3 大小的邻域均值作为图像均值滤波处理的结果,如下式所示
      K = \frac{1}{5 * 5} \begin{bmatrix} 1&1&1\\ 1&1&1\\ 1&1&1\\ \end{bmatrix}

    5.anchor 是锚点,其默认值是(1,-1),表小当前计算均值的点位于核的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点作为锚点
    6.normalize 表示在滤波时是否进行归一化(这里指将计算结果规范化为当前像素值范围内的值)处理,该参数是一个逻辑值,可能为真值为 1)或假(值为 0)
    6.1当参数 normalize = 1时,表示要进行归一化处理,要用邻域像素值的和除以面积
    6.2当参数 normalize =0时,表示不需要受进行一化处理,直接使用邻域像素值的和
    通常情况下,针对方框滤波,卷积核可以表示为
    K = \frac{1}{\alpha} \begin{bmatrix} 1&1&1&{\cdots}&1&1\\ 1&1&1&{\cdots}&1&1\\ {\cdots}&{\cdots}& {\cdots}&{\cdots}&{\cdots}&{\cdots}\\ 1&1&1&{\cdots}&1&1\\ 1&1&1&{\cdots}&1&1\\ 1&1&1&{\cdots}&1&1\\ \end{bmatrix}

    上式对应关系:

    \alpha = \begin{cases} \frac{1}{width*height} & normalize =1 \\ 1 & normalize =0 \end{cases}

    例如,针对 5×5 邻域,当参数 normalize=1时,要进行归一化处理,此时计算的就是均值滤波,这种情况下,函数cv2.boxFilter( )和函数 cv2.blur()的作用是一样的。此时,对应的卷积核为

    K = \frac{1}{25} \begin{bmatrix} 1&1&1&1&1\\ 1&1&1&1&1\\ 1&1&1&1&1\\ 1&1&1&1&1\\ 1&1&1&1&1\\ \end{bmatrix}

    同样针对 5x5 邻域,当参数 normaliz=0时,不进行归一化处理,此时滤波计算的是 邻域像素值之和,使用的卷积核是

    K = \begin{bmatrix} 1&1&1&1&1\\ 1&1&1&1&1\\ 1&1&1&1&1\\ 1&1&1&1&1\\ 1&1&1&1&1\\ \end{bmatrix}

    当 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 所示,左图是原始图像,右图是方框滤波处理结果。

    相关文章

      网友评论

          本文标题:7.2 方框滤波

          本文链接:https://www.haomeiwen.com/subject/iwifkctx.html