
.. DO NOT EDIT.
.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY.
.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE:
.. "auto_examples/filters/plot_denoise_wavelet.py"
.. LINE NUMBERS ARE GIVEN BELOW.

.. only:: html

    .. note::
        :class: sphx-glr-download-link-note

        :ref:`Go to the end <sphx_glr_download_auto_examples_filters_plot_denoise_wavelet.py>`
        to download the full example code.

.. rst-class:: sphx-glr-example-title

.. _sphx_glr_auto_examples_filters_plot_denoise_wavelet.py:


=================
Wavelet denoising
=================

Wavelet denoising relies on the wavelet representation of the image.
Gaussian noise tends to be represented by small values in the wavelet domain
and can be removed by setting coefficients below a given threshold to zero
(hard thresholding) or shrinking all coefficients toward zero by a given amount
(soft thresholding).

In this example, we illustrate two different methods for wavelet coefficient
threshold selection:  BayesShrink and VisuShrink.

VisuShrink
----------
The VisuShrink approach employs a single, universal threshold to all wavelet
detail coefficients.  This threshold is designed to remove additive Gaussian
noise with high probability, which tends to result in overly smooth image
appearance.  By specifying a sigma that is smaller than the true noise standard
deviation, a more visually agreeable result can be obtained.

BayesShrink
-----------
The BayesShrink algorithm is an adaptive approach to wavelet soft thresholding
where a unique threshold is estimated for each wavelet subband.  This generally
results in an improvement over what can be obtained with a single threshold.

.. GENERATED FROM PYTHON SOURCE LINES 30-131



.. image-sg:: /auto_examples/filters/images/sphx_glr_plot_denoise_wavelet_001.png
   :alt: Noisy PSNR=18.61, Wavelet denoising (BayesShrink) PSNR=27.29, Wavelet denoising (VisuShrink, $\sigma=\sigma_{est}$) PSNR=24.06, Original, Wavelet denoising (VisuShrink, $\sigma=\sigma_{est}/2$) PSNR=25.71, Wavelet denoising (VisuShrink, $\sigma=\sigma_{est}/4$) PSNR=25.14
   :srcset: /auto_examples/filters/images/sphx_glr_plot_denoise_wavelet_001.png
   :class: sphx-glr-single-img


.. rst-class:: sphx-glr-script-out

 .. code-block:: none

    Estimated Gaussian noise standard deviation = 0.11856667581533487
    Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers). Got range [-0.042031557115135815..0.8776572320256331].
    Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers). Got range [-0.051132285956040704..0.9372905987696564].






|

.. code-block:: Python


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


.. rst-class:: sphx-glr-timing

   **Total running time of the script:** (0 minutes 0.797 seconds)


.. _sphx_glr_download_auto_examples_filters_plot_denoise_wavelet.py:

.. only:: html

  .. container:: sphx-glr-footer sphx-glr-footer-example

    .. container:: sphx-glr-download sphx-glr-download-jupyter

      :download:`Download Jupyter notebook: plot_denoise_wavelet.ipynb <plot_denoise_wavelet.ipynb>`

    .. container:: sphx-glr-download sphx-glr-download-python

      :download:`Download Python source code: plot_denoise_wavelet.py <plot_denoise_wavelet.py>`

    .. container:: sphx-glr-download sphx-glr-download-zip

      :download:`Download zipped: plot_denoise_wavelet.zip <plot_denoise_wavelet.zip>`


.. only:: html

 .. rst-class:: sphx-glr-signature

    `Gallery generated by Sphinx-Gallery <https://sphinx-gallery.github.io>`_
