注意
前往結尾以下載完整的範例程式碼。或透過 Binder 在您的瀏覽器中執行此範例
小波去噪#
小波去噪依賴於影像的小波表示。高斯雜訊往往以小值表示在小波域中,並且可以透過將低於給定閾值的係數設定為零(硬閾值處理)或將所有係數朝零方向縮小給定的量(軟閾值處理)來移除。
在此範例中,我們說明兩種不同的小波係數閾值選擇方法:BayesShrink 和 VisuShrink。
VisuShrink#
VisuShrink 方法對所有小波細節係數採用單一的通用閾值。此閾值旨在高機率地移除加性高斯雜訊,這往往會導致影像外觀過於平滑。透過指定小於真實雜訊標準差的 sigma,可以獲得更視覺上令人滿意的結果。
BayesShrink#
BayesShrink 演算法是一種小波軟閾值處理的自適應方法,其中針對每個小波子頻帶估計唯一的閾值。這通常會比單一閾值所能獲得的結果有所改進。

Estimated Gaussian noise standard deviation = 0.1179913573463555
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers). Got range [-0.02308914292237688..0.852072291119182].
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers). Got range [-0.05623687585380091..0.9301300180245746].
import matplotlib.pyplot as plt
from skimage.restoration import denoise_wavelet, estimate_sigma
from skimage import data, img_as_float
from skimage.util import random_noise
from skimage.metrics import peak_signal_noise_ratio
original = img_as_float(data.chelsea()[100:250, 50:300])
sigma = 0.12
noisy = random_noise(original, var=sigma**2)
fig, ax = plt.subplots(nrows=2, ncols=3, figsize=(8, 5), sharex=True, sharey=True)
plt.gray()
# Estimate the average noise standard deviation across color channels.
sigma_est = estimate_sigma(noisy, channel_axis=-1, average_sigmas=True)
# Due to clipping in random_noise, the estimate will be a bit smaller than the
# specified sigma.
print(f'Estimated Gaussian noise standard deviation = {sigma_est}')
im_bayes = denoise_wavelet(
noisy,
channel_axis=-1,
convert2ycbcr=True,
method='BayesShrink',
mode='soft',
rescale_sigma=True,
)
im_visushrink = denoise_wavelet(
noisy,
channel_axis=-1,
convert2ycbcr=True,
method='VisuShrink',
mode='soft',
sigma=sigma_est,
rescale_sigma=True,
)
# VisuShrink is designed to eliminate noise with high probability, but this
# results in a visually over-smooth appearance. Repeat, specifying a reduction
# in the threshold by factors of 2 and 4.
im_visushrink2 = denoise_wavelet(
noisy,
channel_axis=-1,
convert2ycbcr=True,
method='VisuShrink',
mode='soft',
sigma=sigma_est / 2,
rescale_sigma=True,
)
im_visushrink4 = denoise_wavelet(
noisy,
channel_axis=-1,
convert2ycbcr=True,
method='VisuShrink',
mode='soft',
sigma=sigma_est / 4,
rescale_sigma=True,
)
# Compute PSNR as an indication of image quality
psnr_noisy = peak_signal_noise_ratio(original, noisy)
psnr_bayes = peak_signal_noise_ratio(original, im_bayes)
psnr_visushrink = peak_signal_noise_ratio(original, im_visushrink)
psnr_visushrink2 = peak_signal_noise_ratio(original, im_visushrink2)
psnr_visushrink4 = peak_signal_noise_ratio(original, im_visushrink4)
ax[0, 0].imshow(noisy)
ax[0, 0].axis('off')
ax[0, 0].set_title(f'Noisy\nPSNR={psnr_noisy:0.4g}')
ax[0, 1].imshow(im_bayes)
ax[0, 1].axis('off')
ax[0, 1].set_title(f'Wavelet denoising\n(BayesShrink)\nPSNR={psnr_bayes:0.4g}')
ax[0, 2].imshow(im_visushrink)
ax[0, 2].axis('off')
ax[0, 2].set_title(
'Wavelet denoising\n(VisuShrink, $\\sigma=\\sigma_{est}$)\n'
f'PSNR={psnr_visushrink:0.4g}'
)
ax[1, 0].imshow(original)
ax[1, 0].axis('off')
ax[1, 0].set_title('Original')
ax[1, 1].imshow(im_visushrink2)
ax[1, 1].axis('off')
ax[1, 1].set_title(
'Wavelet denoising\n(VisuShrink, $\\sigma=\\sigma_{est}/2$)\n'
f'PSNR={psnr_visushrink2:0.4g}'
)
ax[1, 2].imshow(im_visushrink4)
ax[1, 2].axis('off')
ax[1, 2].set_title(
'Wavelet denoising\n(VisuShrink, $\\sigma=\\sigma_{est}/4$)\n'
f'PSNR={psnr_visushrink4:0.4g}'
)
fig.tight_layout()
plt.show()
腳本的總執行時間: (0 分鐘 1.148 秒)