Python OpenCV 图像模糊处理:均值、高斯与双边滤波详解
本文详细介绍 Python OpenCV 中的三种图像模糊(滤波)技术:均值滤波、高斯滤波及高斯双边滤波。通过解析 cv2.blur、cv2.GaussianBlur 和 cv2.bilateralFilter 函数的参数与原理,对比它们在去除椒盐噪声、高斯噪声及保边去噪方面的特性与适用场景,帮助开发者根据实际需求选择合适的滤波算法。
在深度学习中常用的卷积操作,在 OpenCV 中也有对应的实现方式,具体表现为图像的模糊(或称滤波)处理。
均值滤波
OpenCV 中通过 cv2.blur(src, ksize) 函数实现均值滤波。该函数的主要参数如下:
src 代表输入的原图像,ksize 定义模糊核的大小。
其工作原理是计算内核区域内所有像素的平均值,并用该平均值替换中心像素的值。以 3x3 标准化盒式过滤器为例,其结构如下:

该方法的特征是核内各区域对结果的贡献率相同。主要作用是对椒盐噪声具有较好的滤除效果。
# -*-coding:utf-8-*-
"""
File Name: image_deeplearning.py
Program IDE: PyCharm
Date: 2021/10/17
Create File By Author: Hong
"""
import cv2 as cv
def image_blur(image_path: str):
"""
图像卷积操作:设置卷积核大小,步距
:param image_path:
:return:
"""
img = cv.imread(image_path, cv.IMREAD_COLOR)
cv.imshow('input', img)
# 模糊操作(类似卷积),第二个参数ksize是设置模糊内核大小
result = cv.blur(img, (5, 5))
cv.imshow('result', result)
cv.waitKey(0)
cv.destroyAllWindows()
if __name__ == '__main__':
path = 'images/2.png'
image_blur(path)
处理结果展示:

高斯滤波
高斯滤波通过调用 cv2.GuassianBlur(img, ksize,sigmaX,sigmaY) 函数来实现。
参数说明:sigmaX 和 sigmaY 分别表示 X 轴和 Y 方向的标准偏差。若仅指定了 sigmaX,则 sigmaY 将默认与 sigmaX 保持一致;若两者均设为零,系统将根据内核大小自动计算标准偏差。
该方法的特征是核内区域的贡献率与距离中心的远近成正比,权重遵循高斯分布规律。
其主要作用是高效地从图像中去除高斯噪声。
def image_conv(image_path: str):
"""
高斯模糊
:param image_path:
:return:
"""
img = cv.imread(image_path, cv.IMREAD_COLOR)
cv.imshow('img', img)
# 高斯卷积(高斯滤波), 可以设置ksize,必须为奇数,不为0时,后面的步骤不起作用;也可以设置成(0,0),然后通过sigmaX和sigmaY计算标准偏差
result = cv.GaussianBlur(img, (0, 0), 15)
cv.imshow('result', result)
cv.waitKey(0)
cv.destroyAllWindows()
if __name__ == '__main__':
path = 'images/2.png'
image_conv(path)
处理结果展示:

高斯双边滤波
双边滤波(模糊)功能由 cv2.bilateralFilter(img,d, sigmaColor, sigmaSpace) 函数提供。
参数说明:d 指定邻域直径,sigmaColor 为空间高斯函数的标准差;参数值越大,影响范围越广,远处像素的影响越小。
sigmaSpace 为灰度值相似性高斯函数的标准差;参数值越大,颜色相近的像素对结果的影响越大。
双边滤波是一种非线性滤波方法,它综合了图像的空间邻近度与像素值相似度进行折衷处理,同时考虑空间信息与灰度相似性,从而实现保边去噪。该方法具有简单、非迭代和局部处理的特点。其保边去噪的能力源于滤波器由两部分构成:一部分由几何空间距离决定滤波器系数,另一部分由像素差值决定滤波器系数。
该方法的特征是处理耗时较长。主要作用是在滤波的同时保留一定的边缘信息。
# 边缘保留滤波器——高斯双边模糊
def image_bifilter(image_path: str):
"""
高斯双边模糊
:param image_path: 图片文件
:return: 无返回值
"""
img = cv.imread(image_path, cv.IMREAD_COLOR)
cv.imshow('input', img)
# 第三个参数是设置色彩、第四个参数是设置图像坐标
result = cv.bilateralFilter(img, 0, 50, 10)
cv.imshow('result', result)
cv.waitKey(0)
cv.destroyAllWindows()
if __name__ == '__main__':
path = 'images/2.png'
image_bifilter(path)
处理结果展示:

关于 Python OpenCV 图像模糊处理的介绍至此结束。如需了解更多相关内容,请查阅本站往期文章或继续浏览后续内容,感谢支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













