OpenCV图像平滑处理详解:均值、高斯、中值及双边滤波实战

沿途有光
沿途有光
发布时间:2026-10-12 | 2人浏览过
原创

本文系统汇总OpenCV中常见的图像平滑处理方法,涵盖均值滤波、方框滤波、高斯滤波、中值滤波及双边滤波。详细解析各算法原理、参数设置及适用场景,重点介绍cv2.filter2D()函数实现自定义卷积核的技巧,帮助开发者根据需求选择最佳去噪方案,平衡去噪效果与边缘保留。

作为OpenCV图像视觉入门系列的第十篇,本文将深入探讨在图像上执行多种平滑处理技术的具体方法,包括均值滤波、方框滤波、高斯滤波、中值滤波、双边滤波以及2D卷积操作。

1 均值滤波

OpenCV中的基础滤波操作(如均值滤波或中值滤波)往往会使图像细节和边缘变得模糊。若滤波强度过大,可能导致图像失真,视觉效果反而变差。因此,必须适当控制滤波程度,以获取最佳处理效果。

import cv2
 
import numpy as np
from numpy import unicode
 
if __name__ == '__main__':
    img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg")  # 读取彩色图像(BGR)
 
    # 均值滤波 
    # 简单的平均卷积操作
    img_blur1 = cv2.blur(img1, (3, 3))  # 使用3*3的卷积核
    img_blur2 = cv2.blur(img1, (30, 30))  # 使用30*30的卷积核
 
    cv2.imshow("blur1", img_blur1)  # 显示叠加图像 dst
    cv2.imshow("blur2", img_blur2)  # 显示叠加图像 dst
    cv2.imshow("image", img1)  # 显示叠加图像 dst
 
    cv2.waitKey(0)
    cv2.destroyAllWindows()

2 方框滤波

方框滤波是OpenCV提供的一种图像平滑技术,主要用于去噪和平滑处理,从而减少图像中的锯齿状和不规则噪声。在图像处理流程中,方框滤波常作为预处理步骤,旨在提升图像质量及后续处理效果。

import cv2
 
import numpy as np
from numpy import unicode
 
if __name__ == '__main__':
    img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg")  # 读取彩色图像(BGR)
 
    # 方框滤波
    # 基本和均值一样,可以选择归一化
    img_box1 = cv2.boxFilter(img1, -1, (3, 3), normalize=True)
    img_box2 = cv2.boxFilter(img1, -1, (2, 2), normalize=False)
 
 
    cv2.imshow("box1", img_box1)  # 显示叠加图像 dst
    cv2.imshow("box2", img_box2)  # 显示叠加图像 dst
    cv2.imshow("image", img1)  # 显示叠加图像 dst
 
    cv2.waitKey(0)
    cv2.destroyAllWindows()

3 高斯滤波

高斯滤波是图像处理中广泛使用的平滑手段。在OpenCV中,它可用于降低图像噪声并模糊不清晰的细节。此外,由于高斯滤波能在去除微小干扰的同时保留图像主要特征,它也被应用于边缘检测和图像分割任务。

import cv2
 
import numpy as np
from numpy import unicode
 
if __name__ == '__main__':
    img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg")  # 读取彩色图像(BGR)
 
    # 高斯滤波
    # 高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
    img_aussian1 = cv2.GaussianBlur(img1, (5, 5), 0, 0)
    img_aussian2 = cv2.GaussianBlur(img1, (5, 5), 13, 13)
 
    cv2.imshow("aussian1", img_aussian1)  # 显示叠加图像 dst
    cv2.imshow("aussian2", img_aussian2)  # 显示叠加图像 dst
    cv2.imshow("image", img1)  # 显示叠加图像 dst
 
    cv2.waitKey(0)
    cv2.destroyAllWindows()

4 中值滤波

OpenCV中的中值滤波是一种图像去噪技术,通过选取掩码并将每个像素与周围像素值比较来计算新值,该新值为周围像素值的中位数。这种方法能有效去除噪声及椒盐噪声,使图像更加清晰和稳定。

import cv2
 
import numpy as np
from numpy import unicode
 
if __name__ == '__main__':
    img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg")  # 读取彩色图像(BGR)
 
    # 中值滤波
    # 相当于用中值代替
    img_median1 = cv2.medianBlur(img1, 3)  # 中值滤波
    img_median2 = cv2.medianBlur(img1, 9)  # 中值滤波
 
    cv2.imshow("median1", img_median1)  # 显示叠加图像 dst
    cv2.imshow("median2", img_median2)  # 显示叠加图像 dst
    cv2.imshow("image", img1)  # 显示叠加图像 dst
 
    cv2.waitKey(0)
    cv2.destroyAllWindows()

5 双边滤波

双边滤波是一种模糊技术,能在有效去除图像噪声的同时保持边缘清晰。该算法通过比较相邻像素的颜色差异和空间距离来确定权重,进而决定像素的最终颜色值。在OpenCV中,双边滤波可用于处理模糊、去噪及抗抖动等问题。

均值滤波、方框滤波、高斯滤波和中值滤波仅考虑像素间的空间信息进行滤波,这会导致图像边缘信息模糊,即在去噪的同时造成边界信息的丢失,这是它们的共同缺点。相比之下,双边滤波通过同时考虑像素的空间信息(距离越远权重越小)和色彩信息(色彩差异越大权重越小),能有效去噪并保护边缘,因此被称为保边去噪滤波器。

import cv2
 
import numpy as np
from numpy import unicode
 
if __name__ == '__main__':
    img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg")  # 读取彩色图像(BGR)
 
    img_bilateralFilter1 = cv2.bilateralFilter(img1, 15, 150, 1000)
    img_bilateralFilter2 = cv2.bilateralFilter(img1, 3, 255, 1000)
 
    cv2.imshow("bilateralFilter2", img_bilateralFilter2)  # 显示叠加图像 dst
    cv2.imshow("bilateralFilter1", img_bilateralFilter1)  # 显示叠加图像 dst
    cv2.imshow("image", img1)  # 显示叠加图像 dst
 
    cv2.waitKey(0)
    cv2.destroyAllWindows()

6 2D卷积(自定义卷积核实现卷积)

OpenCV中的2D卷积主要用于图像滤波,可消除噪声、提取特征或进行边缘检测。其原理是将图像中的每个像素与固定的卷积核进行卷积操作,从而实现上述目的。

当标准的均值、方框、高斯、中值或双边滤波卷积核无法满足处理需求时,我们需要更灵活的自定义卷积核。OpenCV中的cv2.filter2D()函数可实现这一功能:

cv2.filter2D(img, ddepth, kernel, anchor, delta, borderType)

  • img:待处理的原图像
  • ddepth:默认值为-1,表示输出图像深度与原图保持一致
  • kernel:卷积核,为单通道数组。处理彩色图像时,需先分解通道,再对每个通道应用不同的卷积核进行运算
  • anchor:默认值为(-1,-1),表示计算结果位于卷积核的中心位置
  • delta:可选参数。若指定,表示在卷积操作(乘加运算)后添加一个偏置值delta
  • borderType:边界处理方式,通常使用默认值即可
import cv2
 
import numpy as np
from numpy import unicode
 
if __name__ == '__main__':
    img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg")  # 读取彩色图像(BGR)
 
    kernel = np.ones((9, 9), np.float32) / 81  # 在实际中我们可以定义更复杂的卷积核,以实现自定义滤波操作
    img_kernel1 = cv2.filter2D(img1, -1, kernel)  # 这个滤波器就相当于均值滤波
 
    kernel = np.ones((18, 18), np.float32) / 81  # 在实际中我们可以定义更复杂的卷积核,以实现自定义滤波操作
    img_kernel2 = cv2.filter2D(img1, -1, kernel)  # 这个滤波器就相当于均值滤波
    
 
    cv2.imshow("kernel1", img_kernel1)  # 显示叠加图像 dst
    cv2.imshow("kernel2", img_kernel2)  # 显示叠加图像 dst
    cv2.imshow("image", img1)  # 显示叠加图像 dst
 
    cv2.waitKey(0)
    cv2.destroyAllWindows()

以上即为OpenCV实现图像平滑处理方法的完整总结,更多相关技术资料请参阅本站其他文章。

本站声明

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

Python 相关产品和应用

全部下载

专题列表