Image denoising#
Recovery of a clean image from a version corrupted by additive random noise.
True model: the clean image.
Operator:
pylops.Identity.Data: the noisy image, i.e. the clean image plus uniform random noise (
noise_level, drawn with a fixedseed).
Solvers compared:
Solver |
Formulation |
|---|---|
|
Regularized least squares with a smoothness (Tikhonov) regularizer on the gradient, solved with LSQR |
|
Same smoothness regularizer on the gradient, solved with the linearized ADMM (PyProximal) |
|
Anisotropic total variation regularization, solved with the linearized ADMM (PyProximal) |
|
Anisotropic total variation regularization, solved with Split Bregman |
|
Nonconvex sparsity penalty (log, SCAD or ETP) on each derivative, solved with the linearized ADMM (PyProximal) |
|
Isotropic total variation regularization, solved with the proximal gradient method (PyProximal) |
|
Isotropic total variation regularization, solved with half quadratic splitting (PyProximal) |
|
Isotropic total variation regularization, solved with the primal-dual algorithm (PyProximal) |
|
L1 (soft thresholding) or L0 (hard thresholding) sparsity of the wavelet coefficients (synthesis, i.e. wavelet shrinkage), solved with FISTA |
|
L1 sparsity of the image in one or more wavelet domains (analysis, e.g. Haar, db4 or both stacked), solved with the primal-dual algorithm (PyProximal) |
|
Isotropic total variation plus L1 sparsity in the wavelet domain, solved with the primal-dual algorithm (PyProximal) |
|
L1 sparsity in overlapping local 2D DCT or FFT windows ( |
|
Plug-and-Play prior with the BM3D denoiser in place of the proximal operator of the regularizer, solved with ADMM (PyProximal) |
|
Regularization by Denoising with the BM3D denoiser, solved with fixed-point iterations (PyProximal) |
All gradients are first-order forward differences and all wavelet
transforms are pylops.signalprocessing.DWT2D. Solvers that share a
formulation solve the same problem, so they converge to the same image:
their weights are tuned so that this image has the highest PSNR, and their
iterations so that they have converged.
PnP-ADMM-BM3D and RED-BM3D use the BM3D denoiser (hard-thresholding
stage, pylops_bench.denoisers.bm3d_denoise). Since the operator is the
identity, a single call of BM3D with the noise standard deviation of the data
(about 0.115) is already a strong baseline (29.6 dB). PnP-ADMM-BM3D
reaches the same PSNR: its best denoiser strength is close to the noise
level, and the iterations do not improve on a single call. RED-BM3D behaves
differently: its fixed point balances the data with a weak denoiser applied
repeatedly, and it is best with a large RED weight and a denoiser strength
well below the noise level (sigma=5, sigmad=0.03), reaching about 0.5 dB
less than a single BM3D call. Both solvers outperform the total variation
and wavelet solvers.
Source: benchmarks/image_denoising.
Results#
Raw results: results/image_denoising.csv.
Ascent#
Ascent image from scipy.datasets (512 x 512 pixels, values scaled
to 0-1), plus uniform noise between -noise_level and noise_level
times the maximum of the image (by default ±20 %).
Dataset parameters: noise_level=0.2, seed=0

Rank |
Solver |
Parameters |
MAE |
PSNR [dB] |
Time [s] |
Figure |
|---|---|---|---|---|---|---|
1 |
0.02184 |
29.62 |
51.971 |
|||
2 |
0.02596 |
29.10 |
149.895 |
|||
3 |
eps=0.035, gamma=2, penalty=etp |
0.02712 |
27.58 |
3.031 |
||
4 |
0.02819 |
27.57 |
1.754 |
|||
5 |
eps=0.07, gamma=12.4, penalty=scad |
0.02807 |
27.56 |
1.009 |
||
6 |
0.02806 |
27.54 |
0.946 |
|||
7 |
0.02806 |
27.54 |
2.931 |
|||
8 |
0.02809 |
27.54 |
0.821 |
|||
9 |
eps=0.07, gamma=0.057, penalty=log |
0.02822 |
27.48 |
3.859 |
||
10 |
0.02847 |
27.47 |
0.720 |
|||
11 |
0.02847 |
27.47 |
2.657 |
|||
12 |
eps=0.2, transform=fft |
0.03562 |
26.18 |
11.808 |
||
13 |
0.0364 |
25.70 |
1.716 |
|||
14 |
eps=0.183, transform=dct |
0.03807 |
25.60 |
6.225 |
||
15 |
0.04052 |
25.38 |
0.158 |
|||
16 |
0.04054 |
25.38 |
0.446 |
|||
17 |
eps=0.34, level=5, threshkind=soft |
0.0401 |
25.07 |
0.066 |
||
18 |
eps=0.13, level=3, threshkind=hard |
0.03905 |
24.73 |
0.036 |