.. only:: html

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

        Click :ref:`here <sphx_glr_download_auto_examples_filters_plot_j_invariant.py>`     to download the full example code or to run this example in your browser via Binder
    .. rst-class:: sphx-glr-example-title

    .. _sphx_glr_auto_examples_filters_plot_j_invariant.py:


========================================
Calibrating Denoisers Using J-Invariance
========================================

In this example, we show how to find an optimally calibrated
version of any denoising algorithm.

The calibration method is based on the `noise2self` algorithm of [1]_.

.. [1] J. Batson & L. Royer. Noise2Self: Blind Denoising by Self-Supervision,
       International Conference on Machine Learning, p. 524-533 (2019).

.. seealso::
   More details about the method are given in the full tutorial
   :ref:`sphx_glr_auto_examples_filters_plot_j_invariant_tutorial.py`.

Calibrating a wavelet denoiser


.. code-block:: default


    import numpy as np
    from matplotlib import pyplot as plt

    from skimage.data import chelsea
    from skimage.restoration import calibrate_denoiser, denoise_wavelet

    from skimage.util import img_as_float, random_noise
    from functools import partial

    # rescale_sigma=True required to silence deprecation warnings
    _denoise_wavelet = partial(denoise_wavelet, rescale_sigma=True)

    image = img_as_float(chelsea())
    sigma = 0.3
    noisy = random_noise(image, var=sigma ** 2)

    # Parameters to test when calibrating the denoising algorithm
    sigma_range = np.arange(0.05, 0.5, 0.05)

    parameter_ranges = {'sigma': np.arange(0.1, 0.3, 0.02),
                        'wavelet': ['db1', 'db2'],
                        'convert2ycbcr': [True, False],
                        'multichannel': [True]}

    # Denoised image using default parameters of `denoise_wavelet`
    default_output = denoise_wavelet(noisy, multichannel=True, rescale_sigma=True)

    # Calibrate denoiser
    calibrated_denoiser = calibrate_denoiser(noisy,
                                             _denoise_wavelet,
                                             denoise_parameters=parameter_ranges)

    # Denoised image using calibrated denoiser
    calibrated_output = calibrated_denoiser(noisy)

    fig, axes = plt.subplots(1, 3, sharex=True, sharey=True, figsize=(15, 5))

    for ax, img, title in zip(
            axes,
            [noisy, default_output, calibrated_output],
            ['Noisy Image', 'Denoised (Default)', 'Denoised (Calibrated)']
    ):
        ax.imshow(img)
        ax.set_title(title)
        ax.set_yticks([])
        ax.set_xticks([])

    plt.show()



.. image:: /auto_examples/filters/images/sphx_glr_plot_j_invariant_001.png
    :class: sphx-glr-single-img


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

 Out:

 .. code-block:: none

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





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

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


.. _sphx_glr_download_auto_examples_filters_plot_j_invariant.py:


.. only :: html

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


  .. container:: binder-badge

    .. image:: https://mybinder.org/badge_logo.svg
      :target: https://mybinder.org/v2/gh/scikit-image/scikit-image/v0.17.x?filepath=notebooks/auto_examples/filters/plot_j_invariant.ipynb
      :width: 150 px


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

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



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

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


.. only:: html

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

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