本节介绍均值滤波与方框滤波的基本原理及函数的使用。介绍均值滤波与方框滤波的基本概念以及操作演示。

均值滤波

均值滤波是指用当前像素点周围N·N个像素值的均值来代替当前像素值。使用该方法遍历处理图像内的每一个像素点,即可完成整幅图像的均值滤波。

中心点位置的均值

一幅图像的像素值示例
$$
新值 = \frac{(197+25+106+156+159)+(149+40+107+5+71)+(163+198+226+223+156)+(222+37+68+193+157)+(42+72+250+41+75)}{25}
=126
$$

边界位置的均值

边界位置点并不存在5X5领域矩阵。例如左上角第一个位置。

针对边界点。显然是不能选取外面的区域。计算左上角的均值滤波结果时,仅取3X3领域内的像素值的平均值。

边界点的处理

卷积核

以一个5X5的矩阵为例。

针对每个像素点的均值滤波的运算示意

卷积核

M和N分别对应高度和宽度。一般情况下,M和N是相等的。

需要注意的是,如果M和N的越大,参与运算的像素点数量就越多,图像失真越严重。

函数语法及应用

函数为cv2.blur()。用法为:

dst = cv2.blur( src, ksize, anchor, borderType )
  • dst 表示返回值,表示进行均值滤波后的处理结果
  • src 是原始图像,它可以是任意数量的通道,并能对各个通道独立处理。图像深度应该是CV_8U、CV_16U、CV_16S、CV_32F或者CV_64F中的一种
  • ksize是滤波核的大小。(5,5)就表示以5X5大小的领域均值作为图像均值滤波处理
  • anchor 是锚点,其默认值为(-1,1),表示当前计算均值的点位于核的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点作为锚点
  • borderType是边界样式,该值决定以何种方式处理边界,直接采用默认值即可

anchor, borderType一般都采用默认值,所以该函数的一般形式为:

dst = cv2.blur( src , ksize)

例:针对噪声图像,使用不同大小的卷积核对其进行均值滤波。

import cv2
img = cv2.imread('noiseIMG.png')
dealimg = cv2.blur(img, (5, 5))
cv2.imshow('IMG', img)
cv2.imshow('BLUR', dealimg)
cv2.waitKey()

不同大小卷积核的滤波效果

从上面看出,卷积核越大,参与到均值运算中的像素就会越多,去燥效果越好,同时让图像失真越严重。

在实际处理中,要在失真和降噪效果之间取得平衡,选取合适大小的卷积核。

方框滤波

方框滤波不会计算像素均值。方框滤波中可以自由选择是否对均值滤波的结果进行归一化,即可以自由选择滤波结果是领域像素值之和的平均值,还是领域像素值之和。

基本原理

以5X5的矩阵为例。

如果计算的是领域像素值的均值,则滤波关系为:

计算的是领域像素值的均值

如果计算的是领域像素值之和,则滤波关系为:

计算的是领域像素值之和

函数语法

OpenCV中,实现方框滤波的函数是cv2.boxFilter(),其语法格式为:

dst = cv2.boxFilter(src, depth, ksize, anchor, normalize, borderType)
  • dst是返回值,是滤波后的结果
  • src是需要处理的图像。他可以是任意数量的通道,并能对各个通道独立处理。图像深度应该是CV_8U、CV_16U、CV_16S、CV_32F或者CV_64F中的一种
  • depth表示处理结果图像的图像深度,一般使用-1表示与原始图像相同
  • ksize是滤波核的大小。(5,5)就表示以5X5大小的领域均值作为图像均值滤波处理
  • anchor 是锚点,其默认值为(-1,1),表示当前计算均值的点位于核的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点作为锚点
  • normalize表示是否归一化
    • 当normalize=1时,表示要进行归一化处理,要用领域像素值的和除以面积
    • normalize=1是默认值
    • 当normalize=0时,表示不要进行归一化处理,直接使用领域像素值的和
  • borderType是边界样式,该值决定以何种方式处理边界,直接采用默认值即可

需要注意的是,因为不进行归一化处理,得到的图像很可能超过当前像素值的最大范围值,从而被截断成最大值,因此,会得到一个纯白色的图像。

一般参数anchor、normalize和borderType,直接采用其默认值即可。常用的形式为:

dst = cv2.boxFilter(src, depth, ksize)

案例说明

import cv2
img = cv2.imread('noiseIMG.png')
dealimg1 = cv2.boxFilter(img, -1, (5, 5))
dealimg0 = cv2.boxFilter(img, -1, (5, 5), normalize=0)
cv2.imshow('IMG', img)
cv2.imshow('BOX1', dealimg1)
cv2.imshow('BOX0', dealimg0)
cv2.waitKey()

归一化与不归一化

说明

均值滤波和方框滤波大同小异,几乎不归一化的方框滤波也没啥用处。

最大的问题是领域内每个像素值的权重都是一样的。

下一节的高斯滤波就是解决权重一样的问题。​


博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2021/OpenCV22.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 05 月 16 日
如果觉得我的文章对你有用,请随意赞赏