68 lines
2.2 KiB
Python
68 lines
2.2 KiB
Python
"""
|
|
========================================
|
|
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
|
|
|
|
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
|
|
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()
|