Python OpenCV常用滤波器详解:均值、中值、高斯与双边滤波

晚来风
晚来风
发布时间:2026-10-16 | 6人浏览过
原创

本文详解OpenCV中四种常用图像滤波器:均值滤波通过求平均去噪,中值滤波利用排序取中间值有效去除椒盐噪声,高斯滤波引入权重矩阵实现磨砂效果并保留更多细节,双边滤波则在平滑图像的同时保护边缘信息。文章结合Python代码示例,对比不同核大小及参数对《龙门石窟》图像的处理效果,帮助开发者根据需求选择合适的滤波算法。

1. 滤波器

1.1 什么是滤波器

滤波器是图像处理中用于执行平滑操作的核心工具。

所谓平滑处理,是指在尽可能保留原始图像信息的前提下,对像素值进行微调,使相邻像素的数值差异缩小,从而达到“平滑”状态。这一过程旨在去除图像噪声并降低细节层次。本文将重点介绍OpenCV库中的均值滤波器、中值滤波器、高斯滤波器以及双边滤波器的具体应用。

滤波器的基本算法逻辑如下:首先指定一个滤波核的尺寸(该尺寸定义了参与计算的像素范围),然后将图像中的每个像素视为滤波核的中心,利用该范围内的像素数据,按照特定的计算规则进行运算,最终将计算结果赋值给中心像素。

1.2 关于滤波核

以大小为n×n的滤波核为例,对于图像中的每一个像素,我们可以提取出一个以该像素为中心的n×n矩阵。这个矩阵包含了参与计算的所有数据范围(即边界),这种矩阵结构在图像处理中被称为“滤波核”。

1.3 素材选择

本文使用的测试图像为《龙门石窟》(longmen.jpg),其图像形状(shape)为:(350, 600, 3)。

2.均值滤波器 cv2.blur()

2.1 语法简介

均值滤波器,在信号处理领域也常被称为低通滤波器。

顾名思义,均值滤波器的核心原理是对滤波核覆盖区域内的所有像素值求算术平均值,然后将该平均值赋值给滤波核中心位置的像素。

在OpenCV中,可以使用cv2.blur()函数来实现均值滤波。

cv2.blur()函数的语法结构如下:

dst = blur(src, ksize, dst=None, anchor=None, borderType=None)

各参数含义如下:

  • src:输入图像。
  • ksize:滤波核的大小。该参数以元组形式表示,格式为(a, b),其中a代表高度(height),b代表宽度(width)。
  • anchor:滤波核的锚点位置,默认位于中心。
  • borderType:边界填充类型,用于处理图像边缘像素。

下文将以3×3、5×5和10×10三种不同尺寸的滤波核为例,分别展示图像经过均值滤波器处理后的视觉效果。

2.2 代码示例

2.2.1 3×3 滤波核为例

import cv2
img = cv2.imread("longmen.jpg")
dst1 = cv2.blur(img, (3, 3))
cv2.imshow("3*3", dst1)
cv2.waitKey()
cv2.destroyAllWindows()

滤波后的效果如下:

2.2.2 5×5 滤波核为例

import cv2
img = cv2.imread("longmen.jpg")
dst2 = cv2.blur(img, (5, 5))
cv2.imshow("5*5", dst2)
cv2.waitKey()
cv2.destroyAllWindows()

滤波后的效果如下:

2.2.3 10×10滤波核为例

import cv2
img = cv2.imread("longmen.jpg")
dst3 = cv2.blur(img, (10, 10))
cv2.imshow("10*10", dst3)
cv2.waitKey()
cv2.destroyAllWindows()

从上述结果可以看出,随着滤波核尺寸的增大,图像的模糊程度也随之增加。

3. 中值滤波器 cv2.medianBlur()

中值滤波器的工作原理是:对滤波核覆盖区域内的所有像素值进行排序,然后取中间位置的数值(中位数)赋值给滤波核中心位置的像素。

函数调用格式为:medianBlur(src, ksize, dst=None)。

需要注意的是,ksize参数必须为奇数,如果传入偶数将会引发报错。

与均值滤波器cv2.blur()不同,cv2.blur()的ksize参数是一个表示宽高的元组,而cv2.medianBlur()的ksize参数是一个单一的整数值(通常假设核为正方形)。

代码示例

import cv2
img = cv2.imread("longmen.jpg")
dst1 = cv2.medianBlur(img, 3)
cv2.imshow("3*3", dst1)
cv2.waitKey()
cv2.destroyAllWindows()

滤波后的效果如下:

4. 高斯滤波器 cv2.GaussianBlur()

高斯滤波器也常被称为高斯模糊或高斯平滑。

高斯滤波器能够在降低图像噪声和细节层次的同时,保留更多的图像信息,使处理后的图像呈现出类似“磨砂玻璃”的柔和滤镜效果。

在使用均值滤波时,滤波核内的每个像素具有相同的权重。而高斯滤波器计算的是加权平均值,即越靠近中心像素的权重越大,越靠近边缘的像素权重越小。

与滤波核对应的、由每个数据权重组成的矩阵结构称为卷积核。卷积核中所有权重值的总和必须为1。卷积核中的具体数值会随核大小的变化而变化。

OpenCV通过cv2.GaussianBlur()方法实现高斯滤波,其语法如下:

GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)

参数说明如下:

  • src:目标输入图像。
  • ksize:滤波核大小,宽度和高度必须均为奇数。格式为元组形式。

修改sigmaX和sigmaY的值会改变卷积核中的权重分布,这涉及卷积运算的相关知识。

borderType:边界类型,用于处理图像边缘。

以下以9×9的滤波核为例进行演示。

import cv2
img = cv2.imread("longmen.jpg")
dst1 = cv2.GaussianBlur(img, (9, 9), 0, 0)
cv2.imshow("9*9", dst1)
cv2.waitKey()
cv2.destroyAllWindows()

滤波后的效果如下:

5. 双边滤波器 cv2.bilateralFilter()

前三种滤波方式在使图像平滑的同时,往往也会导致图像边缘区域变得模糊不清。

双边滤波是一种能够在滤波过程中有效保护图像边界信息的操作。

其核心逻辑为:

如果像素位于图像的边缘区域,则增大该边缘像素的权重,从而尽可能保持边缘区域的像素值不变;如果像素不在边缘区域(即位于平坦区域),则采用类似高斯滤波器的算法进行平滑处理。

双边滤波器的语法为:

bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)

src:目标图像。

d:过滤期间使用的每个像素邻域的直径。如果设为非正值,则根据sigmaSpace自动计算。例如,若d为15,则表示使用15×15的滤波核。

sigmaColor:参与计算的像素颜色范围阈值。只有当像素值与中心像素的差值小于该值时,以其为核心的滤波核才参与计算;否则不参与。当sigmaColor值为255时,表示所有像素值为核心的滤波核都会参与计算。

sigmaSpace:坐标空间的σ值。σ值越大,参与计算的像素数量就越多,影响范围越广。

borderType:边界样式,用于处理图像边缘。

继续以图片"longmen.jpg"为例进行演示。

选择20×20的滤波核(通过d=15及sigmaSpace计算得出,此处指代处理范围)。

参与计算的像素值范围阈值为:小于125的像素差值。

坐标空间的σ值为:200。

import cv2
img = cv2.imread("longmen.jpg")
# 双边滤波,选取范围直径为15,颜色范围为125
dst = cv2.bilateralFilter(img, 15, 125, 200)
cv2.imshow("bilateral", dst)
cv2.waitKey()
cv2.destroyAllWindows()

双边滤波效果如下:

与上述几种滤波效果相比,双边滤波能够保留较为清晰的图像边缘信息,同时实现平滑去噪。

到此这篇关于Python OpenCV之常用滤波器使用详解的文章就介绍到这了,更多相关Python OpenCV滤波器内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表