FakeOrange
预计阅读时间:5分钟14秒

不同去噪方式的Python实现与对比

针对CT图像的降噪结果对比及实现

0
0

下面是使用OpenCV实现各种图像去噪方法的教程,每个方法都有相应的代码示例,帮助你在Python中使用OpenCV库来进行图像去噪处理。


示例图像:

data/68124a6a-212d-4a9e-85b7-7abd0a34a07e/46c3b80e-d198-40fb-a700-921dfc65bae9images.jpg


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()

data/68124a6a-212d-4a9e-85b7-7abd0a34a07e/f55a7cc0-7684-4210-b3c2-6570934111d4image.png



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()

data/68124a6a-212d-4a9e-85b7-7abd0a34a07e/164df2b0-0cd5-4a54-81a9-111d35a486201729666167993.jpg



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()

data/68124a6a-212d-4a9e-85b7-7abd0a34a07e/44708a4c-279d-4054-a863-811735c818aa1729666269148(1).jpg


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()

data/68124a6a-212d-4a9e-85b7-7abd0a34a07e/02cfccf9-3825-4e98-8976-4b5d10daa1fbimage.png



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()



data/68124a6a-212d-4a9e-85b7-7abd0a34a07e/ee69196d-8b90-4fd0-b552-325f401eef80image.png



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()

data/68124a6a-212d-4a9e-85b7-7abd0a34a07e/40aaf8fd-2d71-42d3-9016-6a0353b6974eimage.png


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()

data/68124a6a-212d-4a9e-85b7-7abd0a34a07e/862bc20f-603f-4c89-8a7f-fc316f1ca512image.png



总结

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



评论
Copyright Created by DataER | 沪ICP备2024052789号-5 | 沪公网安备31010402336337号