小波去噪

小波去噪依赖于图像的小波表示。高斯噪声往往由小波域中的小值表示,可以通过将低于给定阈值的系数设置为零(硬阈值)或将所有系数收缩到给定量(软阈值)来消除高斯噪声。

在这个例子中,我们说明了两种不同的小波系数阈值选择方法:BayesShrink和VisuShrink。

VisuShrink

VisuShrink方法对所有小波细节系数采用单一的通用阈值。该阈值用于去除高概率加性高斯噪声,因为加性高斯噪声往往会导致图像过于平滑。通过指定小于真实噪声标准偏差的西格玛,可以获得更符合视觉的结果。

BayesShrink

BayesShrink算法是小波软阈值的一种自适应方法,其中为每个小波子带估计唯一的阈值。这通常会导致比使用单个阈值所能获得的结果有所改善。

Noisy PSNR=18.6, Wavelet denoising (BayesShrink) PSNR=27.26, Wavelet denoising (VisuShrink, $\sigma=\sigma_{est}$) PSNR=24.03, Original, Wavelet denoising (VisuShrink, $\sigma=\sigma_{est}/2$) PSNR=25.64, Wavelet denoising (VisuShrink, $\sigma=\sigma_{est}/4$) PSNR=25.1

输出:

/scikit-image/doc/examples/filters/plot_denoise_wavelet.py:49: FutureWarning:

`multichannel` is a deprecated argument name for `estimate_sigma`. It will be removed in version 1.0. Please use `channel_axis` instead.

Estimated Gaussian noise standard deviation = 0.11837259385313008
/scikit-image/doc/examples/filters/plot_denoise_wavelet.py:54: FutureWarning:

`multichannel` is a deprecated argument name for `denoise_wavelet`. It will be removed in version 1.0. Please use `channel_axis` instead.

/scikit-image/doc/examples/filters/plot_denoise_wavelet.py:57: FutureWarning:

`multichannel` is a deprecated argument name for `denoise_wavelet`. It will be removed in version 1.0. Please use `channel_axis` instead.

/scikit-image/doc/examples/filters/plot_denoise_wavelet.py:64: FutureWarning:

`multichannel` is a deprecated argument name for `denoise_wavelet`. It will be removed in version 1.0. Please use `channel_axis` instead.

/scikit-image/doc/examples/filters/plot_denoise_wavelet.py:67: FutureWarning:

`multichannel` is a deprecated argument name for `denoise_wavelet`. It will be removed in version 1.0. Please use `channel_axis` instead.

Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).

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, multichannel=True, 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, multichannel=True, convert2ycbcr=True,
                           method='BayesShrink', mode='soft',
                           rescale_sigma=True)
im_visushrink = denoise_wavelet(noisy, multichannel=True, 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, multichannel=True, convert2ycbcr=True,
                                 method='VisuShrink', mode='soft',
                                 sigma=sigma_est/2, rescale_sigma=True)
im_visushrink4 = denoise_wavelet(noisy, multichannel=True, 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('Noisy\nPSNR={:0.4g}'.format(psnr_noisy))
ax[0, 1].imshow(im_bayes)
ax[0, 1].axis('off')
ax[0, 1].set_title(
    'Wavelet denoising\n(BayesShrink)\nPSNR={:0.4g}'.format(psnr_bayes))
ax[0, 2].imshow(im_visushrink)
ax[0, 2].axis('off')
ax[0, 2].set_title(
    'Wavelet denoising\n(VisuShrink, $\\sigma=\\sigma_{est}$)\n'
     'PSNR=%0.4g' % psnr_visushrink)
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'
     'PSNR=%0.4g' % psnr_visushrink2)
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'
     'PSNR=%0.4g' % psnr_visushrink4)
fig.tight_layout()

plt.show()

脚本的总运行时间: (0分0.303秒)

Gallery generated by Sphinx-Gallery