Image deblurring#
Recovery of a sharp image from its blurred version, with a known point-spread function.
True model: the sharp image.
Operator:
pylops.signalprocessing.Convolve2D, a 2D convolution with a Gaussian point-spread function.Data: the blurred image, plus optional white Gaussian noise (
noise_std, drawn with a fixedseed).
Solvers compared:
Solver |
Formulation |
|---|---|
|
Regularized least squares with a Laplacian (smoothness) regularizer, solved with LSQR |
|
L1 (soft thresholding) or L0 (hard thresholding) sparsity-promoting inversion in the wavelet domain (2D DWT as preconditioner), solved with FISTA |
|
Anisotropic total variation regularization, solved with Split Bregman |
|
Anisotropic total variation plus L1 sparsity in the wavelet domain, solved with Split Bregman |
|
Isotropic total variation regularization, with or without bound constraints on the pixel values, solved with the primal-dual algorithm (PyProximal) |
|
L1 sparsity of the image in one or more wavelet domains (analysis form, e.g. Haar, db4 or both stacked), solved with the primal-dual algorithm (PyProximal) |
|
Relaxed Mumford-Shah (truncated quadratic) penalty on the image gradient, nonconvex, solved with the linearized ADMM (PyProximal) |
|
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 wavelet transforms are pylops.signalprocessing.DWT2D with 3 levels.
Source: benchmarks/image_deblurring.
Results#
Raw results: results/image_deblurring.csv.
Python logo#
Python logo (126 x 126 pixels, values in 0-255), blurred by a separable Gaussian point-spread function of 15 x 25 samples, plus white Gaussian noise.
Dataset parameters: noise_std=5, seed=0

Rank |
Solver |
Parameters |
MAE |
PSNR [dB] |
Time [s] |
Figure |
|---|---|---|---|---|---|---|
1 |
box=True |
7.84 |
22.22 |
2.186 |
||
2 |
10.11 |
21.66 |
24.690 |
|||
3 |
8.343 |
21.66 |
4.620 |
|||
4 |
9.389 |
21.38 |
22.057 |
|||
5 |
box=False |
8.999 |
21.27 |
2.170 |
||
6 |
niter=1500, wavelets=haar+db4 |
14.34 |
19.09 |
5.617 |
||
7 |
18.41 |
18.49 |
0.086 |
|||
8 |
14.94 |
18.36 |
0.259 |
|||
9 |
niter=500, wavelets=haar |
17.67 |
18.15 |
1.843 |
||
10 |
15.85 |
17.83 |
0.433 |
|||
11 |
niter=500, wavelets=db4 |
20.13 |
17.80 |
1.876 |
||
12 |
eps=0.1, threshkind=soft |
20.83 |
17.78 |
0.312 |
||
13 |
eps=1, threshkind=hard |
25.46 |
17.08 |
0.303 |