OpenCV 提供了多種圖像去噪的方法,以下是一些常見的去噪技術以及相應的 Python 代碼示例:
-
均值濾波:使用像素鄰域的灰度均值代替該像素的值。
import cv2 import numpy as np import matplotlib.pyplot as pltimg = 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 圖像。在實際使用中,需要根據具體情況調整核尺寸、標準差等參數。