双边滤波是综合考虑空间信息和色彩信息的滤波方式,在滤波过程中能够有效地保护图像内的边缘信息。2D卷积可以使用特定的卷积核实现卷积操作。

双边滤波

前面所学的滤波方式只考虑了空间的权重信息,计算方便,但是在边缘信息的处理上存在较大的问题。

 边界模糊是滤波处理过程中对领域像素取均值造成的,上述滤波处理过程单纯地考虑空间信息,造成了边界模糊和部分信息丢失。

基本原理

双边滤波综合考虑距离和色彩的权重结果,既能够有效地去除噪声,又能够较好地保护边缘信息。

在双边滤波中,当处在边缘时,与当前点色彩相近的像素点(颜色距离很近)会被基于较大的权重值;而与当前色彩差别较大的像素点(颜色距离很远)会被给予较小的权重值,这样就保护了边缘信息。

在双边滤波中,在计算白色区域边缘点的滤波结果时:

  • 对于白色的点,权重较大
  • 对于黑的点,权重较小

在双边滤波中,在计算黑色区域边缘点的滤波结果时:

  • 对于黑色的点,权重较大
  • 对于白的点,权重较小

函数使用

OpenCV中,实现双边滤波的函数是cv2.bilateraFliter()

dst = cv2.GaussianBlur( src, d, sigmaColor, sigmaSpace, borderType )
  • d是在滤波时选取的颜色差值范围,表示以当前像素点为中心点的直径。如果该值为非正数,则会自动从参数sigmaSpace计算得到。大于5时,则速度较慢。所以在实际使用中,推荐d=5。对于较大噪声的离线滤波,可以选择d=9
  • sigmaColor是滤波处理时选取的颜色差值范围,该值决定了周围哪些像素点能够参与到滤波中来,与当前像素点差值小于sigmaColor的像素点,能够参与当前滤波
    • 该值为0时,失去意义
    • 该值为255时,指定直径内的所有点都能参与运算
  • sigmaSpace是坐标空间中的sigma值,它的值越大,说明有越多的点参与。
    • 当d>0,无论sigmaSpace的值如何,d都指定领域大小
    • 否则,d与sigmaSpace成正比
  • sigmaSpace为边界样式,默认值即可

程序示例

针对噪声图像,分别对其进行高斯滤波和双边滤波,比较不同滤波对边缘的处理效果。

import cv2
img = cv2.imread('whiteblack.png')
dealimgGs = cv2.GaussianBlur(img, (15, 15), 0, 0)
dealimgBi = cv2.bilateralFilter(img, 55, 100, 100)
cv2.imshow('IMG', img)
cv2.imshow('Gaussian', dealimgGs)
cv2.imshow('bilateral', dealimgBi)
cv2.waitKey()

双边滤波与高斯滤波效果对比

2D卷积

有时,希望使用特定的卷积核实现卷积操作。

在OpenCV中,允许用户自定义卷积核实现卷积操作,函数为cv2.filter2D(),语法格式为:

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

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

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