OpenCV图像平滑处理详解:均值、高斯、中值及双边滤波实战
本文系统汇总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实现图像平滑处理方法的完整总结,更多相关技术资料请参阅本站其他文章。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









