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的滤波器可记为(5, 5),表示如下的滤波器:
- 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的滤波器可记为(5, 5),表示如下的滤波器:
- 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决定的卷积核,它们在水平方向上的标准差不同。

- 不同的sigmaX决定的卷积核,它们在水平方向上的标准差不同。
- sigmaY:表示卷积核在竖直方向(Y轴方向)的标准差,控制其权重比例。
- 如果将该值设置为0,则只采用sigmaX的值。
- 如果sigmaX 和sigmaY都是0,则通过ksize.width和ksize.height计算得到:
sigmaX = 0.3 × [(ksize.width - 1) × 0.5 - 1] + 0.8sigmaY = 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 cv2import 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)| 原图 | 噪声图 | 自定义卷积 | 均值滤波 |
|---|---|---|---|
![]() | ![]() | ![]() | ![]() |






