使用nlmeas对图像进行去噪
效果展示
代码实现
import cv2
import numpy as np
import matplotlib.pyplot as plt
import skimage
from skimage import data,img_as_float
from skimage.restoration import denoise_nl_means,estimate_sigma
from skimage.metrics import peak_signal_noise_ratio
from skimage.util import random_noise
def nlmeansSkimage(src):
img=skimage.io.imread(src)
img=skimage.img_as_float(img)
sigma=0.08
noisy=random_noise(img,var=sigma**2)
sigma_est=np.mean(estimate_sigma(noisy,channel_axis=-1))
print(f'the estimate Image noise is{sigma_est}')
patch_kw=dict(
patch_size=5,
patch_distance=6,
channel_axis=-1
)
denoiseNlmeans=denoise_nl_means(noisy,h=1.15*sigma_est,fast_mode=False,**patch_kw)
denoiseNlmeansSigma=denoise_nl_means(noisy,h=0.8*sigma_est,sigma=sigma_est,
fast_mode=False,**patch_kw)
denoiseNlmeansFast=denoise_nl_means(noisy,h=0.8*sigma_est,
fast_mode=True,**patch_kw)
denoiseNlmeansFastSigma=denoise_nl_means(noisy,h=0.8*sigma_est,sigma=sigma_est,
fast_mode=True,**patch_kw)
psnr_noisy=peak_signal_noise_ratio(img,noisy)
psnr_denoiseNlmeans=peak_signal_noise_ratio(img,denoiseNlmeans)
psnr_denoiseNlmeansSigma=peak_signal_noise_ratio(img,denoiseNlmeansSigma)
psnr_denoiseNlmeansFast=peak_signal_noise_ratio(img,denoiseNlmeansFast)
psnr_denoiseNlmeansFastSigma=peak_signal_noise_ratio(img,denoiseNlmeansFastSigma)
fig,ax=plt.subplots(nrows=2, ncols=3, figsize=(8,6),
sharex=True,sharey=True)
ax[0,0].imshow(noisy)
ax[0,0].axis('off')
ax[0,0].set_title(f'noisy Image\nPSNR={psnr_noisy}')
ax[0, 1].imshow(denoiseNlmeans)
ax[0, 1].axis('off')
ax[0, 1].set_title(f'non-local means\n(slow,PSNR={psnr_denoiseNlmeans})')
ax[0, 2].imshow(denoiseNlmeansSigma)
ax[0, 2].axis('off')
ax[0, 2].set_title('non-local means\n(slow,using $\\sigma_{est}$)'+f'PSNR={psnr_denoiseNlmeansSigma}')
ax[1, 0].imshow(img)
ax[1, 0].axis('off')
ax[1, 0].set_title('Original Image')
ax[1, 1].imshow(denoiseNlmeansFast)
ax[1, 1].axis('off')
ax[1, 1].set_title(f'non-local means\n(fast)PSNR={psnr_denoiseNlmeansFast}')
ax[1, 2].imshow(denoiseNlmeansFastSigma)
ax[1, 2].axis('off')
ax[1, 2].set_title('non-local means\n(fast,using $\\sigma_{est}$)'+f'PSNR={psnr_denoiseNlmeansFastSigma}')
fig.tight_layout()
plt.show()