不同去噪方式的Python实现与对比
针对CT图像的降噪结果对比及实现
下面是使用OpenCV实现各种图像去噪方法的教程,每个方法都有相应的代码示例,帮助你在Python中使用OpenCV库来进行图像去噪处理。
示例图像:

1. 高斯滤波
高斯滤波通过将图像与高斯核进行卷积,减少噪声。OpenCV提供了cv2.GaussianBlur()函数。
示例代码:
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取图像
image = cv2.imread('image.jpg')
# 应用高斯滤波,核大小为5x5,标准差为0
gaussian_blur = cv2.GaussianBlur(image, (5, 5), 0)
# 显示结果
plt.subplot(121), plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)), plt.title('Original Image')
plt.subplot(122), plt.imshow(cv2.cvtColor(gaussian_blur, cv2.COLOR_BGR2RGB)), plt.title('Gaussian Blur')
plt.show()

2. 中值滤波
中值滤波通过替换像素值为其邻域内像素的中值,有效去除椒盐噪声。OpenCV提供了cv2.medianBlur()函数。
示例代码:
# 应用中值滤波,核大小为5
median_blur = cv2.medianBlur(image, 5)
# 显示结果
plt.subplot(121), plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)), plt.title('Original Image')
plt.subplot(122), plt.imshow(cv2.cvtColor(median_blur, cv2.COLOR_BGR2RGB)), plt.title('Median Blur')
plt.show()
3. 双边滤波
双边滤波在减少噪声的同时保留边缘。OpenCV提供了cv2.bilateralFilter()函数。
示例代码:
# 应用双边滤波,d表示像素邻域直径,sigmaColor和sigmaSpace控制颜色和空间之间的差异
bilateral_blur = cv2.bilateralFilter(image, 9, 75, 75)
# 显示结果
plt.subplot(121), plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)), plt.title('Original Image')
plt.subplot(122), plt.imshow(cv2.cvtColor(bilateral_blur, cv2.COLOR_BGR2RGB)), plt.title('Bilateral Filter')
plt.show()
4. 非局部均值(NLM)滤波
非局部均值滤波通过在图像中寻找相似的像素块进行去噪。OpenCV提供了cv2.fastNlMeansDenoisingColored()函数。
示例代码:
# 应用非局部均值去噪
nlm_denoised = cv2.fastNlMeansDenoisingColored(image, None, 10, 10, 7, 21)
# 显示结果
plt.subplot(121), plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)), plt.title('Original Image')
plt.subplot(122), plt.imshow(cv2.cvtColor(nlm_denoised, cv2.COLOR_BGR2RGB)), plt.title('NLM Denoising')
plt.show()
5. 小波去噪
小波去噪在OpenCV中没有直接的API,但可以使用PyWavelets库来处理。
示例代码:
import pywt
from matplotlib import pyplot as plt
# 小波分解
coeffs = pywt.wavedec2(image, 'haar', level=2)
# coeffs[0] 是低频近似系数,coeffs[1:] 是每一层的细节系数
ca = coeffs[0] # 低频近似系数
details = coeffs[1:] # 细节系数(包括水平、垂直、对角线)
# 阈值处理
threshold = 20
new_details = []
for cH, cV, cD in details:
cH = pywt.threshold(cH, threshold, mode='soft') # 对水平细节系数进行软阈值处理
cV = pywt.threshold(cV, threshold, mode='soft') # 对垂直细节系数进行软阈值处理
cD = pywt.threshold(cD, threshold, mode='soft') # 对对角线细节系数进行软阈值处理
new_details.append((cH, cV, cD))
# 进行图像重构
coeffs_denoised = [ca] + new_details
denoised_image = pywt.waverec2(coeffs_denoised, 'haar')
# 可视化原始图像与去噪后的图像
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))
ax1.imshow(image, cmap='gray')
ax1.set_title('Original Image')
# 将数据裁剪到 [0, 255]
denoised_image_clipped = np.clip(denoised_image, 0, 255)
# 如果需要,先将图像数据从浮点数转换为整数
denoised_image_clipped = denoised_image_clipped.astype(np.uint8)
# 显示裁剪后的图像
plt.imshow(denoised_image_clipped, cmap='gray')
plt.title('Denoised Image')
plt.show()
plt.tight_layout()
plt.show()
6. 全变差(TV)去噪
全变差去噪在OpenCV中没有内置的函数,但可以使用scikit-image库来处理。
示例代码:
from skimage import restoration
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取图像并转换为灰度
image = cv2.imread('image.jpg', 0)
# 应用全变差去噪
tv_denoised = restoration.denoise_tv_chambolle(image, weight=0.1)
# 显示结果
plt.subplot(121), plt.imshow(image, cmap='gray'), plt.title('Original Image')
plt.subplot(122), plt.imshow(tv_denoised, cmap='gray'), plt.title('TV Denoising')
plt.show()
7. 傅里叶变换去噪
傅里叶变换通过转换图像到频域,处理高频噪声。OpenCV提供了cv2.dft()和cv2.idft()函数。
示例代码:
# 将图像转换为灰度图
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 应用傅里叶变换
dft = cv2.dft(np.float32(gray_image), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
# 创建掩码,只保留低频部分
rows, cols = gray_image.shape
crow, ccol = rows // 2 , cols // 2
mask = np.zeros((rows, cols, 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1
# 应用掩码并进行逆变换
fshift = dft_shift * mask
f_ishift = np.fft.ifftshift(fshift)
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:,:,0], img_back[:,:,1])
# 显示结果
plt.subplot(121), plt.imshow(gray_image, cmap='gray'), plt.title('Original Image')
plt.subplot(122), plt.imshow(img_back, cmap='gray'), plt.title('Fourier Denoised')
plt.show()

总结
以上是使用OpenCV和相关库实现各种图像去噪技术的代码示例。每种方法都有其特定的适用场景,选择合适的去噪方法取决于噪声类型和图像特性。
评论
目录


