cv2.fastNlMeansDenoising()
是 OpenCV 中一個非常有效的去噪函數,基於非局部均值濾波算法(Non-Local Means Filtering
)。它能夠有效地去除圖像中的隨機噪聲(如高斯噪聲),並保留圖像的細節,特別適合處理含有隨機噪聲的圖像。
這個函數的主要特點是能夠根據像素周圍的鄰域進行濾波,而不僅僅依賴局部的像素值,因此可以在去除噪聲的同時,保留圖像的細節。
fastNlMeansDenoising
結果圖cv2.fastNlMeansDenoising()
函數的使用格式如下:
cv2.fastNlMeansDenoising(src, dst=None, h=3, templateWindowSize=7, searchWindowSize=21)
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 讀取原始圖像
img = cv2.imread('lena.png', 0) # 讀取灰度圖像
# 添加高斯噪聲到圖像
noise = np.random.normal(0, 25, img.shape).astype(np.uint8) # 創建高斯噪聲
noisy_img = cv2.add(img, noise) # 將噪聲加入到原始圖像
# 使用fastNlMeansDenoising進行去噪
denoised_img = cv2.fastNlMeansDenoising(noisy_img, None, h=10, templateWindowSize=7, searchWindowSize=21)
# 顯示結果
plt.figure(figsize=(12, 6))
# 顯示原始圖像
plt.subplot(1, 3, 1)
plt.imshow(img, cmap='gray')
plt.title("原始圖像")
plt.axis('off')
# 顯示加噪聲的圖像
plt.subplot(1, 3, 2)
plt.imshow(noisy_img, cmap='gray')
plt.title("加噪聲圖像")
plt.axis('off')
# 顯示去噪後的圖像
plt.subplot(1, 3, 3)
plt.imshow(denoised_img, cmap='gray')
plt.title("去噪後圖像")
plt.axis('off')
plt.show()
cv2.fastNlMeansDenoising()
去除了隨機噪聲,保留了圖像的大部分細節。import cv2
import numpy as np
import matplotlib.pyplot as plt
# 讀取原始圖像
img = cv2.imread('輸入圖像', 0) # 讀取灰度圖像
# kernel 調整
kernel = 11
# 添加高斯噪聲到圖像
noise = np.random.normal(0, 25, img.shape).astype(np.uint8) # 創建高斯噪聲
noisy_img = cv2.add(img, noise) # 將噪聲加入到原始圖像
# 1. 使用fastNlMeansDenoising進行去噪
denoised_img_nlmeans = cv2.fastNlMeansDenoising(noisy_img, None, h=45, templateWindowSize=9, searchWindowSize=21)
# 2. 使用均值濾波進行去噪
denoised_img_mean = cv2.blur(noisy_img, (kernel, kernel))
# 3. 使用高斯濾波進行去噪
denoised_img_gaussian = cv2.GaussianBlur(noisy_img, (kernel, kernel), 0)
# 4. 使用中值濾波進行去噪
denoised_img_median = cv2.medianBlur(noisy_img, kernel)
# 5. 使用雙邊濾波進行去噪
denoised_img_bilateral = cv2.bilateralFilter(noisy_img, 9, 75, 75)
# 顯示結果
plt.figure(figsize=(18, 12))
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 中文字體
plt.rcParams['axes.unicode_minus'] = False # 解決座標軸負號顯示問題
# 顯示加噪聲的圖像
plt.subplot(2, 3, 1)
plt.imshow(noisy_img, cmap='gray')
plt.title("加噪聲圖像")
plt.axis('off')
# 顯示fastNlMeansDenoising的去噪結果
plt.subplot(2, 3, 2)
plt.imshow(denoised_img_nlmeans, cmap='gray')
plt.title("非局部均值去噪")
plt.axis('off')
# 顯示均值濾波去噪結果
plt.subplot(2, 3, 3)
plt.imshow(denoised_img_mean, cmap='gray')
plt.title("均值濾波去噪")
plt.axis('off')
# 顯示高斯濾波去噪結果
plt.subplot(2, 3, 4)
plt.imshow(denoised_img_gaussian, cmap='gray')
plt.title("高斯濾波去噪")
plt.axis('off')
# 顯示中值濾波去噪結果
plt.subplot(2, 3, 5)
plt.imshow(denoised_img_median, cmap='gray')
plt.title("中值濾波去噪")
plt.axis('off')
# 顯示雙邊濾波去噪結果
plt.subplot(2, 3, 6)
plt.imshow(denoised_img_bilateral, cmap='gray')
plt.title("雙邊濾波去噪")
plt.axis('off')
plt.tight_layout()
plt.show()