OpenCV 提供了多种图像去噪的方法,以下是一些常见的去噪技术以及相应的 Python 代码示例:
-
均值滤波:使用像素邻域的灰度均值代替该像素的值。
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread("4.jpg") result = cv2.blur(img, (5, 5)) # 传入读取的图像和核尺寸 cv2.imshow("Noise", img) cv2.imshow("Mean Filter", result) cv2.waitKey(0)
-
高斯滤波:适用于消除高斯噪声,通过加权平均邻域内的像素值来计算中心像素的新值。
result = cv2.GaussianBlur(img, (5, 5), 0) # 高斯核尺寸和标准差 cv2.imshow("Gaussian Filter", result)
-
中值滤波:选择一个含有奇数点的窗口,取窗口中像素灰度值的中位数来代替中心像素的值,有效去除椒盐噪声。
result = cv2.medianBlur(img, 5) # 核大小必须是大于1的奇数 cv2.imshow("Median Filter", result)
-
方框滤波:类似于均值滤波,但可以选择是否对结果进行归一化。
result = cv2.boxFilter(img, -1, (5, 5), normalize=True) # normalize=True 进行归一化 cv2.imshow("Box Filter", result)
-
双边滤波:在滤波时同时考虑空间邻近度与像素值相似度,保留边缘信息。
result = cv2.bilateralFilter(img, 9, 75, 75) # 直径、颜色空间的标准差和坐标空间的标准差 cv2.imshow("Bilateral Filter", result)
-
非局部均值去噪(NLM):使用图像中的所有像素进行去噪,根据相似度加权平均。
dst = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21) plt.subplot(121),plt.imshow(img) plt.subplot(122),plt.imshow(dst) plt.show()
-
高通滤波:保留高频部分,常用于边缘增强。
x = cv2.Sobel(img, cv2.CV_16S, 1, 0) y = cv2.Sobel(img, cv2.CV_16S, 0, 1) absx = cv2.convertScaleAbs(x) absy = cv2.convertScaleAbs(y) dist = cv2.addWeighted(absx, 0.5, absy, 0.5, 0) cv2.imshow('High Pass Filter', dist)
请注意,上述代码中的 img
变量需要先加载一个图像,cv2.imread
函数用于读取图像,cv2.imshow
用于显示图像,cv2.waitKey(0)
用于等待用户按键操作,plt.show()
用于显示 Matplotlib 图像。在实际使用中,需要根据具体情况调整核尺寸、标准差等参数。