ウェーブレットノイズ除去#

ウェーブレットノイズ除去は、画像のウェーブレット表現に依存します。ガウスノイズは、ウェーブレット領域では小さな値で表現される傾向があり、所定の閾値を下回る係数をゼロに設定する(ハード閾値処理)またはすべての係数を所定の量だけゼロに近づける(ソフト閾値処理)ことによって除去できます。

この例では、ウェーブレット係数の閾値選択のための2つの異なる方法、BayesShrinkとVisuShrinkを示します。

VisuShrink#

VisuShrinkアプローチでは、すべてのウェーブレット詳細係数に単一の普遍的な閾値を使用します。この閾値は、高い確率で加法性ガウスノイズを除去するように設計されており、これは画像の外観が過度に滑らかになる傾向があります。真のノイズ標準偏差よりも小さいシグマを指定することで、より視覚的に好ましい結果を得ることができます。

BayesShrink#

BayesShrinkアルゴリズムは、ウェーブレットソフト閾値処理に対する適応型アプローチであり、各ウェーブレットサブバンドに対して固有の閾値が推定されます。これは、単一の閾値で得られるものよりも一般的に改善をもたらします。

Noisy PSNR=18.64, Wavelet denoising (BayesShrink) PSNR=27.3, Wavelet denoising (VisuShrink, $\sigma=\sigma_{est}$) PSNR=24.07, Original, Wavelet denoising (VisuShrink, $\sigma=\sigma_{est}/2$) PSNR=25.72, Wavelet denoising (VisuShrink, $\sigma=\sigma_{est}/4$) PSNR=25.14
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秒)

Sphinx-Galleryによって生成されたギャラリー