2286 字
11 分钟
OpenCV:空域滤波【平滑处理】

1. 介绍#

尽量保留图像原有信息的情况下,过滤掉图像内部的噪声,这一过程称为对图像的 平滑处理 ,所得的图像称为平滑图像

​ 图像平滑处理的基本原理是,将噪声所在像素点的像素值处理为其周围临近像素点的值的近似值。常见的平滑处理方式有: 均值滤波方块滤波高斯滤波中值滤波双边滤波 等。

2. 均值滤波#

2.1 原理#

​ 均值滤波是指用当前像素点周围N * N个像素值的均值代替当前像素值

​ 针对边缘像素点,可以只取图像内存在的周围邻域点的像素值均值

2.2 使用方法#

  • 通过函数cv2.blur()实现均值滤波
  • 函数原型dst = cv2.blur( src, ksize, anchor, borderType )
  • 参数说明
    • dst:表示目标图像
    • src:表示原始图像
    • ksize:表示滤波核的大小。滤波核大小是指在滤波处理过程中,邻域图像的高度和宽度。
      • 例如,5x5的滤波器可记为(5, 5),表示如下的滤波器:5x5均值滤波器
      • 卷积核越大,去噪效果越好,花费的计算时间越长,图像失真越严重。
    • anchor:表示锚点,默认值是(-1, -1),表示当前计算均值的点位于核的中心点位置。
    • borderType:表示边界样式,决定了以何种方式处理边界。

2.3 示例#

import cv2
src = cv2.imread("logo_noise.png")
dst = cv2.blur(src, (5, 5))
cv2.imwrite("mean_blur.png", dst)
原图噪声图均值滤波
原图噪声图均值滤波

3. 方框滤波#

3.1 原理#

​ 在方框滤波中,可以自由选择地选择滤波结果是邻域像素值之和的平均值,还是邻域像素值之和,以代替当前像素值

3.2 使用方法#

  • 通过函数cv2.boxFilter()实现方框滤波
  • 函数原型dst = cv2.boxFilter( src, ddepth, ksize, anchor, normalize, borderType )
  • 参数说明
    • dst:表示目标图像
    • src:表示原始图像
    • ddepth:表示处理结果图像的图像深度,一般使用-1,即与原始图像使用相同的图像深度
    • ksize:表示滤波核的大小。滤波核大小是指在滤波处理过程中,邻域图像的高度和宽度。
      • 例如,5x5的滤波器可记为(5, 5),表示如下的滤波器:5x5方框滤波器
    • anchor:表示锚点,默认值是(-1, -1),表示当前计算均值的点位于核的中心点位置。
    • normalize:表示是否进行归一化处理。默认为0。
      • normalize=1时,表示要进行归一化处理,要用邻域像素值的和除以面积
      • normalize=0时,表示不需要进行归一化处理,直接使用邻域像素值的和。如果不做归一化处理,滤波得到的值很可能超过当前像素值范围的最大值,从而被截断为最大值,这样会得到一幅纯白色的图像。
    • borderType:表示边界样式,决定了以何种方式处理边界。

3.3 示例#

import cv2
src = cv2.imread("logo_noise.png")
dst = cv2.boxFilter(src, -1, (5, 5), normalize=0)
cv2.imwrite("boxFilter_unnormalized.png", dst)
dst = cv2.boxFilter(src, -1, (5, 5), normalize=1)
cv2.imwrite("boxFilter_normalized.png", dst)
原图噪声图方框滤波:不归一化方框滤波:归一化
原图噪声图方框滤波:不归一化方框滤波:归一化

4. 高斯滤波#

4.1 原理#

​ 在进行均值滤波方框滤波时,其邻域内每个像素的权重是相等的。在高斯滤波中,会将中心点的权重值加大,远离中心点的权重值减小,在此基础上计算邻域内各个像素值不同权重的和。

常见的高斯滤波器如:

​ 对于高斯滤波器而言,同一尺寸的卷积核可以有不同的权重比

4.2 使用方法#

  • 通过函数cv2.GaussianBlur()实现高斯滤波
  • 函数原型dst = cv2.GaussianBlur( src, ksize, sigmaX, sigmaY, borderType )
  • 参数说明
    • dst:表示目标图像
    • src:表示原始图像
    • ksize:表示滤波核的大小。滤波核的值必须是奇数
    • sigmaX:表示卷积核在水平方向(X轴方向)的标准差,控制其权重比例。
      • 不同的sigmaX决定的卷积核,它们在水平方向上的标准差不同。
    • sigmaY:表示卷积核在竖直方向(Y轴方向)的标准差,控制其权重比例。
      • 如果将该值设置为0,则只采用sigmaX的值
      • 如果sigmaX 和sigmaY都是0,则通过ksize.width和ksize.height计算得到
        • sigmaX = 0.3 × [(ksize.width - 1) × 0.5 - 1] + 0.8
        • sigmaY = 0.3 × [(ksize.height - 1) × 0.5 - 1] + 0.8
    • borderType:表示边界样式,决定了以何种方式处理边界。

4.3 示例#

import cv2
src = cv2.imread("logo_noise.png")
dst = cv2.GaussianBlur(src, (5, 5), 0, 0)
cv2.imwrite("gaussian_blur.png", dst)
原图噪声图高斯滤波
原图原图高斯滤波

5. 中值滤波#

5.1 原理#

​ 在中值滤波中,不再采用加权求均值的方式计算滤波结果,而是用邻域内所有像素值的中值替代当前像素点的像素值

  • 优点:在中值滤波处理中,噪声成分很难被选上,所以可以在几乎不影响原有图像的情况下去除全部噪声
  • 缺点:由于中值滤波需要进行内部排序操作,因此运算量相对更大一些

5.2 使用方法#

  • 通过函数cv2.medianBlur()实现中值滤波
  • 函数原型dst = cv2.medianBlur( src, ksize )
  • 参数说明
    • dst:表示目标图像
    • src:表示原始图像
    • ksize:表示滤波核的大小。滤波核的值必须是奇数,此处是一个整数值,而不用表示为~~元组形式~~。

5.3 示例#

import cv2
src = cv2.imread("logo_noise.png")
dst = cv2.medianBlur(src, 5)
cv2.imwrite("median_blur.png", dst)
原图噪声图中值滤波
原图噪声图中值滤波

6. 双边滤波#

6.1 原理#

​ 双边滤波是综合考虑空间信息和色彩信息的滤波方式,在滤波过程中能够有效地保护图像内的边缘信息

​ 在双边滤波中,当处在边缘时,与当前点色彩相近的像素点会被给予较大的权重值,而与当前色彩差别较大的像素点会被给予较小的权重值,这样就保护了边缘信息。

​ 双边滤波去除噪声的效果并不好,它的优势在于对边缘信息的保护上。

6.2 使用方法#

  • 通过函数cv2.bilateralFilter()实现双边滤波
  • 函数原型dst = cv2.bilateralFilter( src, d, sigmaColor, sigmaSpace, borderType )
  • 参数说明
    • dst:表示目标图像
    • src:表示原始图像
    • d:表示在滤波时选取的空间距离参数,这里表示以当前像素点为中心点的直径
      • 如果该值为非正数,则会自动从sigmaSpace计算得到。
      • 推荐d=5。对于较大噪声的离线滤波,可以选择d=9
    • sigmaColor:表示滤波处理时选取的颜色差值范围决定周围哪些像素点能够参与到滤波中来
      • 与当前像素点的像素值差值小于sigmaColor的像素点, 能够参与到当前的滤波中
      • sigmaColor=0,滤波失去意义。sigmaColor=255,所有点都能够参与运算。
    • sigmaSpace:表示坐标空间中的sigma值。它的值越大,说明有越多的点能够参与到滤波计算中来
      • d>0时,无论 sigmaSpace 的值如何,d都指定邻域大小;否则,d与sigmaSpace的值成比例
    • borderType:表示边界样式,决定了以何种方式处理边界。

6.3 示例#

import cv2
src = cv2.imread("logo_noise.png")
dst = cv2.bilateralFilter(src, 25, 100, 100)
cv2.imwrite("bilateral_blur.png", dst)
原图噪声图双边滤波
原图噪声图双边滤波

7. 自定义卷积核的滤波#

7.1 原理#

​ 在希望使用特定的卷积核实现卷积操作时,可以通过函数cv2.filter2D()进行自定义卷积核

7.2 使用方法#

  • 通过函数cv2.filter2D()实现自定义卷积
  • 函数原型dst = cv2.filter2D( src, ddepth, kernel, anchor, delta, borderType )
  • 参数说明
    • dst:表示目标图像
    • src:表示原始图像
    • ddepth:表示处理结果图像的图像深度,一般使用-1,即与原始图像使用相同的图像深度
    • ksize:表示卷积核,它是一个单通道的数组。如果想在处理彩色图像时,让每个通道使用不同的核,则必须将彩色图像分解后使用不同的核完成操作。
    • anchor:表示锚点,默认值是(-1, -1),表示当前计算均值的点位于核的中心点位置。
    • delta:表示修正值,如果该值存在,会在基础滤波的结果上加上该值作为最终的滤波处理结果。
    • borderType:表示边界样式,决定了以何种方式处理边界。

7.3 示例#

  • 自定义卷积核:自定义卷积核
    • 滤波效果等同于均值滤波
import cv2
import numpy as np
src = cv2.imread("logo_noise.png")
kernel = np.ones((5, 5), np.float32) / (5 * 5)
dst = cv2.filter2D(src, -1, kernel)
cv2.imwrite("conv_blur.png", dst)
原图噪声图自定义卷积均值滤波
原图噪声图自定义卷积均值滤波
封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00