Denoising

In this simple notebook, we look at a denoising problem and how the linearized bregman iterations provide a simple and efficient solution.

Packages setup

# ] registry add https://github.com/slimgroup/SLIMregistryJL.git
# ] add LinearAlgebra, JOLI, TestImages, ImageView
using SlimOptim, LinearAlgebra, JOLI, TestImages, PyPlot

Use a standard reference image

n = 256
n1, n2 = 2*256, 256
img = Float32.(testimage("lena_gray_16bit.png"));
imshow(img, cmap="magma", vmin=-.5, vmax=.5);

png

Measurment operator

A = [joRomberg(n, n; DDT=Float32, RDT=Float32);joRomberg(n, n; DDT=Float32, RDT=Float32)];

Setup transform domain operator

# Sparse in wavelet domain
W = joDWT(n, n; DDT=Float32, RDT=Float32);
# Or with curvelet ifi nstalled
# W = joCurvelet2D(128, 128; DDT=Float32, RDT=Float32);

Measurements

# Make noisy data
b = A*vec(img);
imshow(reshape(b, n1, n2), cmap="magma", vmin=-.5, vmax=.5, aspect=.5)

png

PyObject <matplotlib.image.AxesImage object at 0x14ac18c70>

Linearized bregman

We solve the following l1-l2 optimization problem:

$

\begin{align} \minx & \ \ \lambda || W x||1 + \frac{1}{2} ||W x ||_2^2 \ & \text{s.t. } Ax = b \end{align} $

where $W$ is the sparsity promoting transform, $x$ is the unknown image and $A$ is a tall measuremment operator.

# setup bregman
opt = bregman_options(maxIter=200, verbose=2, quantile=.1)
SlimOptim.BregmanParams(2, 1.0e-8, 200, false, true, 0.1)
sol = bregman(A, W, zeros(Float32, n*n), b, opt);
Running linearized bregman...
Progress tolerance: 1.00e-08
Maximum number of iterations: 200
Anti-chatter correction: 1
 Iteration     Step Length Bregman residual ||A*x - b||_2^2     λ
         1     1.25000e-01     1.48864e+02     4.75737e+03     2.99459e-04 
         2     1.25000e-01     4.55724e+02     2.67720e+03     2.99459e-04 
         3     1.25000e-01     7.95676e+02     1.50593e+03     2.99459e-04 
         4     1.25000e-01     1.11241e+03     8.47091e+02     2.99459e-04 
         5     1.25000e-01     1.38470e+03     4.76491e+02     2.99459e-04 
         6     1.25000e-01     1.60846e+03     2.68028e+02     2.99459e-04 
         7     1.25000e-01     1.78728e+03     1.50766e+02     2.99459e-04 
         8     1.25000e-01     1.92757e+03     8.48065e+01     2.99459e-04 
         9     1.25000e-01     2.03627e+03     4.77039e+01     2.99459e-04 
        10     1.25000e-01     2.11975e+03     2.68337e+01     2.99459e-04 
        11     1.25000e-01     2.18632e+03     1.50940e+01     1.42984e-03 
        12     1.25000e-01     2.23547e+03     8.81974e+00     1.42984e-03 
        13     1.25000e-01     2.27269e+03     4.96397e+00     1.42984e-03 
        14     1.25000e-01     2.30081e+03     2.79504e+00     1.42984e-03 
        15     1.25000e-01     2.32200e+03     1.57486e+00     1.42984e-03 
        16     1.25000e-01     2.33796e+03     8.88252e-01     1.42984e-03 
        17     1.25000e-01     2.34997e+03     5.01863e-01     1.42984e-03 
        18     1.25000e-01     2.35899e+03     2.84326e-01     1.42984e-03 
        19     1.25000e-01     2.36577e+03     1.61829e-01     1.42984e-03 
        20     1.25000e-01     2.37086e+03     9.28416e-02     1.42984e-03 
        21     1.25000e-01     2.37761e+03     5.40014e-02     2.52146e-03 
        22     1.25000e-01     2.38118e+03     1.31801e-01     2.52146e-03 
        23     1.25000e-01     2.38383e+03     8.25535e-02     2.52146e-03 
        24     1.25000e-01     2.38582e+03     5.43265e-02     2.52146e-03 
        25     1.25000e-01     2.38732e+03     3.78512e-02     2.52146e-03 
        26     1.25000e-01     2.38844e+03     2.79190e-02     2.52146e-03 
        27     1.25000e-01     2.38929e+03     2.16570e-02     2.52146e-03 
        28     1.25000e-01     2.38993e+03     1.74611e-02     2.52146e-03 
        29     1.25000e-01     2.39042e+03     1.44713e-02     2.52146e-03 
        30     1.25000e-01     2.39080e+03     1.21932e-02     2.52146e-03 
        31     1.25000e-01     2.39378e+03     1.03789e-02     3.49909e-03 
        32     1.25000e-01     2.39453e+03     9.09539e-02     3.49909e-03 
        33     1.25000e-01     2.39511e+03     6.70223e-02     3.49909e-03 
        34     1.25000e-01     2.39556e+03     5.15073e-02     3.49909e-03 
        35     1.25000e-01     2.39591e+03     4.11505e-02     3.49909e-03 
        36     1.25000e-01     2.39618e+03     3.39748e-02     3.49909e-03 
        37     1.25000e-01     2.39639e+03     2.88185e-02     3.49909e-03 
        38     1.25000e-01     2.39656e+03     2.49902e-02     3.49909e-03 
        39     1.25000e-01     2.39669e+03     2.20824e-02     3.49909e-03 
        40     1.25000e-01     2.39679e+03     1.98347e-02     3.49909e-03 
        41     1.25000e-01     2.39923e+03     1.80850e-02     4.33748e-03 
        42     1.25000e-01     2.39967e+03     9.52648e-02     4.33748e-03 
        43     1.25000e-01     2.40002e+03     7.99760e-02     4.33748e-03 
        44     1.25000e-01     2.40031e+03     6.95839e-02     4.33748e-03 
        45     1.25000e-01     2.40054e+03     6.21067e-02     4.33748e-03 
        46     1.25000e-01     2.40073e+03     5.63292e-02     4.33748e-03 
        47     1.25000e-01     2.40090e+03     5.15754e-02     4.33748e-03 
        48     1.25000e-01     2.40105e+03     4.74253e-02     4.33748e-03 
        49     1.25000e-01     2.40118e+03     4.36792e-02     4.33748e-03 
        50     1.25000e-01     2.40129e+03     4.01961e-02     4.33748e-03 
        51     1.25000e-01     2.40320e+03     3.69216e-02     4.96721e-03 
        52     1.25000e-01     2.40359e+03     9.53462e-02     4.96721e-03 
        53     1.25000e-01     2.40391e+03     8.20759e-02     4.96721e-03 
        54     1.25000e-01     2.40419e+03     7.17705e-02     4.96721e-03 
        55     1.25000e-01     2.40442e+03     6.33917e-02     4.96721e-03 
        56     1.25000e-01     2.40463e+03     5.63082e-02     4.96721e-03 
        57     1.25000e-01     2.40481e+03     5.01847e-02     4.96721e-03 
        58     1.25000e-01     2.40497e+03     4.47861e-02     4.96721e-03 
        59     1.25000e-01     2.40511e+03     3.99913e-02     4.96721e-03 
        60     1.25000e-01     2.40525e+03     3.57015e-02     4.96721e-03 
        61     1.25000e-01     2.40736e+03     3.18678e-02     5.65533e-03 
        62     1.25000e-01     2.40780e+03     9.48295e-02     5.65533e-03 
        63     1.25000e-01     2.40817e+03     7.93026e-02     5.65533e-03 
        64     1.25000e-01     2.40849e+03     6.75133e-02     5.65533e-03 
        65     1.25000e-01     2.40875e+03     5.82329e-02     5.65533e-03 
        66     1.25000e-01     2.40898e+03     5.06981e-02     5.65533e-03 
        67     1.25000e-01     2.40918e+03     4.44525e-02     5.65533e-03 
        68     1.25000e-01     2.40936e+03     3.91909e-02     5.65533e-03 
        69     1.25000e-01     2.40951e+03     3.47124e-02     5.65533e-03 
        70     1.25000e-01     2.40965e+03     3.08569e-02     5.65533e-03 
        71     1.25000e-01     2.41192e+03     2.75181e-02     6.38341e-03 
        72     1.25000e-01     2.41240e+03     9.30221e-02     6.38341e-03 
        73     1.25000e-01     2.41281e+03     7.65585e-02     6.38341e-03 
        74     1.25000e-01     2.41314e+03     6.43722e-02     6.38341e-03 
        75     1.25000e-01     2.41343e+03     5.50533e-02     6.38341e-03 
        76     1.25000e-01     2.41367e+03     4.77050e-02     6.38341e-03 
        77     1.25000e-01     2.41388e+03     4.17815e-02     6.38341e-03 
        78     1.25000e-01     2.41406e+03     3.69022e-02     6.38341e-03 
        79     1.25000e-01     2.41422e+03     3.28233e-02     6.38341e-03 
        80     1.25000e-01     2.41436e+03     2.93602e-02     6.38341e-03 
        81     1.25000e-01     2.41674e+03     2.63915e-02     7.13889e-03 
        82     1.25000e-01     2.41725e+03     9.33843e-02     7.13889e-03 
        83     1.25000e-01     2.41768e+03     7.64113e-02     7.13889e-03 
        84     1.25000e-01     2.41803e+03     6.40490e-02     7.13889e-03 
        85     1.25000e-01     2.41833e+03     5.47431e-02     7.13889e-03 
        86     1.25000e-01     2.41858e+03     4.75155e-02     7.13889e-03 
        87     1.25000e-01     2.41880e+03     4.17613e-02     7.13889e-03 
        88     1.25000e-01     2.41898e+03     3.70686e-02     7.13889e-03 
        89     1.25000e-01     2.41914e+03     3.31771e-02     7.13889e-03 
        90     1.25000e-01     2.41928e+03     2.98934e-02     7.13889e-03 
        91     1.25000e-01     2.42174e+03     2.70862e-02     7.91021e-03 
        92     1.25000e-01     2.42228e+03     9.49944e-02     7.91021e-03 
        93     1.25000e-01     2.42273e+03     7.76408e-02     7.91021e-03 
        94     1.25000e-01     2.42310e+03     6.50968e-02     7.91021e-03 
        95     1.25000e-01     2.42341e+03     5.57374e-02     7.91021e-03 
        96     1.25000e-01     2.42366e+03     4.85352e-02     7.91021e-03 
        97     1.25000e-01     2.42388e+03     4.28481e-02     7.91021e-03 
        98     1.25000e-01     2.42407e+03     3.82393e-02     7.91021e-03 
        99     1.25000e-01     2.42423e+03     3.44296e-02     7.91021e-03 
       100     1.25000e-01     2.42437e+03     3.12197e-02     7.91021e-03 
       101     1.25000e-01     2.42689e+03     2.84783e-02     8.68707e-03 
       102     1.25000e-01     2.42745e+03     9.65193e-02     8.68707e-03 
       103     1.25000e-01     2.42791e+03     7.90365e-02     8.68707e-03 
       104     1.25000e-01     2.42829e+03     6.64621e-02     8.68707e-03 
       105     1.25000e-01     2.42860e+03     5.71290e-02     8.68707e-03 
       106     1.25000e-01     2.42887e+03     4.99854e-02     8.68707e-03 
       107     1.25000e-01     2.42909e+03     4.43675e-02     8.68707e-03 
       108     1.25000e-01     2.42928e+03     3.98289e-02     8.68707e-03 
       109     1.25000e-01     2.42945e+03     3.60829e-02     8.68707e-03 
       110     1.25000e-01     2.42959e+03     3.29215e-02     8.68707e-03 
       111     1.25000e-01     2.43216e+03     3.02073e-02     9.47051e-03 
       112     1.25000e-01     2.43274e+03     9.89313e-02     9.47051e-03 
       113     1.25000e-01     2.43321e+03     8.12606e-02     9.47051e-03 
       114     1.25000e-01     2.43361e+03     6.85909e-02     9.47051e-03 
       115     1.25000e-01     2.43393e+03     5.92209e-02     9.47051e-03 
       116     1.25000e-01     2.43420e+03     5.20683e-02     9.47051e-03 
       117     1.25000e-01     2.43443e+03     4.64455e-02     9.47051e-03 
       118     1.25000e-01     2.43463e+03     4.18961e-02     9.47051e-03 
       119     1.25000e-01     2.43480e+03     3.81351e-02     9.47051e-03 
       120     1.25000e-01     2.43494e+03     3.49568e-02     9.47051e-03 
       121     1.25000e-01     2.43754e+03     3.22196e-02     1.02485e-02 
       122     1.25000e-01     2.43813e+03     1.00318e-01     1.02485e-02 
       123     1.25000e-01     2.43862e+03     8.27781e-02     1.02485e-02 
       124     1.25000e-01     2.43902e+03     7.02139e-02     1.02485e-02 
       125     1.25000e-01     2.43935e+03     6.09267e-02     1.02485e-02 
       126     1.25000e-01     2.43963e+03     5.38352e-02     1.02485e-02 
       127     1.25000e-01     2.43986e+03     4.82562e-02     1.02485e-02 
       128     1.25000e-01     2.44006e+03     4.37412e-02     1.02485e-02 
       129     1.25000e-01     2.44023e+03     3.99959e-02     1.02485e-02 
       130     1.25000e-01     2.44038e+03     3.68180e-02     1.02485e-02 
       131     1.25000e-01     2.44302e+03     3.40751e-02     1.10259e-02 
       132     1.25000e-01     2.44362e+03     1.02179e-01     1.10259e-02 
       133     1.25000e-01     2.44412e+03     8.46594e-02     1.10259e-02 
       134     1.25000e-01     2.44453e+03     7.21285e-02     1.10259e-02 
       135     1.25000e-01     2.44487e+03     6.28762e-02     1.10259e-02 
       136     1.25000e-01     2.44516e+03     5.58117e-02     1.10259e-02 
       137     1.25000e-01     2.44540e+03     5.02531e-02     1.10259e-02 
       138     1.25000e-01     2.44560e+03     4.57472e-02     1.10259e-02 
       139     1.25000e-01     2.44577e+03     4.20006e-02     1.10259e-02 
       140     1.25000e-01     2.44592e+03     3.88105e-02     1.10259e-02 
       141     1.25000e-01     2.44856e+03     3.60418e-02     1.17898e-02 
       142     1.25000e-01     2.44917e+03     1.02472e-01     1.17898e-02 
       143     1.25000e-01     2.44968e+03     8.53659e-02     1.17898e-02 
       144     1.25000e-01     2.45009e+03     7.31150e-02     1.17898e-02 
       145     1.25000e-01     2.45044e+03     6.40482e-02     1.17898e-02 
       146     1.25000e-01     2.45073e+03     5.71030e-02     1.17898e-02 
       147     1.25000e-01     2.45097e+03     5.16177e-02     1.17898e-02 
       148     1.25000e-01     2.45118e+03     4.71545e-02     1.17898e-02 
       149     1.25000e-01     2.45135e+03     4.34283e-02     1.17898e-02 
       150     1.25000e-01     2.45150e+03     4.02401e-02     1.17898e-02 
       151     1.25000e-01     2.45420e+03     3.74608e-02     1.25622e-02 
       152     1.25000e-01     2.45484e+03     1.04930e-01     1.25622e-02 
       153     1.25000e-01     2.45536e+03     8.75396e-02     1.25622e-02 
       154     1.25000e-01     2.45579e+03     7.51056e-02     1.25622e-02 
       155     1.25000e-01     2.45614e+03     6.59137e-02     1.25622e-02 
       156     1.25000e-01     2.45644e+03     5.88758e-02     1.25622e-02 
       157     1.25000e-01     2.45669e+03     5.33115e-02     1.25622e-02 
       158     1.25000e-01     2.45690e+03     4.87786e-02     1.25622e-02 
       159     1.25000e-01     2.45708e+03     4.49885e-02     1.25622e-02 
       160     1.25000e-01     2.45724e+03     4.17442e-02     1.25622e-02 
       161     1.25000e-01     2.45994e+03     3.89159e-02     1.33246e-02 
       162     1.25000e-01     2.46059e+03     1.05203e-01     1.33246e-02 
       163     1.25000e-01     2.46112e+03     8.80553e-02     1.33246e-02 
       164     1.25000e-01     2.46156e+03     7.57770e-02     1.33246e-02 
       165     1.25000e-01     2.46192e+03     6.66882e-02     1.33246e-02 
       166     1.25000e-01     2.46222e+03     5.97201e-02     1.33246e-02 
       167     1.25000e-01     2.46247e+03     5.42062e-02     1.33246e-02 
       168     1.25000e-01     2.46269e+03     4.97058e-02     1.33246e-02 
       169     1.25000e-01     2.46287e+03     4.59313e-02     1.33246e-02 
       170     1.25000e-01     2.46303e+03     4.26935e-02     1.33246e-02 
       171     1.25000e-01     2.46575e+03     3.98715e-02     1.40819e-02 
       172     1.25000e-01     2.46641e+03     1.05433e-01     1.40819e-02 
       173     1.25000e-01     2.46695e+03     8.84902e-02     1.40819e-02 
       174     1.25000e-01     2.46739e+03     7.63617e-02     1.40819e-02 
       175     1.25000e-01     2.46776e+03     6.73878e-02     1.40819e-02 
       176     1.25000e-01     2.46806e+03     6.05122e-02     1.40819e-02 
       177     1.25000e-01     2.46832e+03     5.50697e-02     1.40819e-02 
       178     1.25000e-01     2.46854e+03     5.06265e-02     1.40819e-02 
       179     1.25000e-01     2.46872e+03     4.69040e-02     1.40819e-02 
       180     1.25000e-01     2.46888e+03     4.37125e-02     1.40819e-02 
       181     1.25000e-01     2.47164e+03     4.09215e-02     1.48376e-02 
       182     1.25000e-01     2.47231e+03     1.06274e-01     1.48376e-02 
       183     1.25000e-01     2.47286e+03     8.94202e-02     1.48376e-02 
       184     1.25000e-01     2.47331e+03     7.73723e-02     1.48376e-02 
       185     1.25000e-01     2.47368e+03     6.84566e-02     1.48376e-02 
       186     1.25000e-01     2.47400e+03     6.16259e-02     1.48376e-02 
       187     1.25000e-01     2.47426e+03     5.62199e-02     1.48376e-02 
       188     1.25000e-01     2.47448e+03     5.18038e-02     1.48376e-02 
       189     1.25000e-01     2.47466e+03     4.80991e-02     1.48376e-02 
       190     1.25000e-01     2.47483e+03     4.49140e-02     1.48376e-02 
       191     1.25000e-01     2.47755e+03     4.21247e-02     1.55749e-02 
       192     1.25000e-01     2.47823e+03     1.05078e-01     1.55749e-02 
       193     1.25000e-01     2.47878e+03     8.88411e-02     1.55749e-02 
       194     1.25000e-01     2.47923e+03     7.72112e-02     1.55749e-02 
       195     1.25000e-01     2.47960e+03     6.85885e-02     1.55749e-02 
       196     1.25000e-01     2.47991e+03     6.19594e-02     1.55749e-02 
       197     1.25000e-01     2.48017e+03     5.66954e-02     1.55749e-02 
       198     1.25000e-01     2.48039e+03     5.23860e-02     1.55749e-02 
       199     1.25000e-01     2.48058e+03     4.87545e-02     1.55749e-02 
       200     1.25000e-01     2.48074e+03     4.56219e-02     1.55749e-02

Plot result and convergence

figure(figsize=(8,8));
subplot(221)
imshow(img, cmap="magma", vmin=-.5, vmax=.5)
title("True")
subplot(222)
imshow(reshape(b, n1, n2), cmap="magma", vmin=-.5, vmax=.5, aspect=.5)
title("Measurment")
subplot(223)
imshow(reshape(sol.x, n, n), cmap="magma", vmin=-.5, vmax=.5)
title("recovered")
subplot(224)
imshow(img - reshape(sol.x, n, n), cmap="seismic", vmin=-.5e-2, vmax=.5e-2)
title("Difference x100")
tight_layout()

png

figure()
subplot(121)
plot(sol.ϕ_trace/sol.ϕ_trace[1], label="Objective")
legend()
subplot(122)
plot(sol.r_trace/sol.r_trace[1], label="||A*x -b||_2^2")
legend()

png

PyObject <matplotlib.legend.Legend object at 0x14aef2d60>