# Curvelet Denoising¶


This numerical tour explores the use of curvelets to perform image denoising.

In [22]:
warning off
warning on


## Curvelet Transform¶

The curvelet tight frame was introduced by Candes and Donoho to enhance the wavelet representation of geometric cartoon images. See for instance

E.J. Cand s and D. L. Donoho, New tight frames of curvelets and optimal representations of objects with piecewise-C2 singularities, Comm. Pure Appl. Math., 57 219-266

In this tour, we use the discrete curvelet transform, detailed in

E. J. Cand s, L. Demanet, D. L. Donoho and L. Ying, Fast discrete curvelet transforms, Multiscale Model. Simul., 5 861-899

and it uses the <http://www.curvelet.org/ Curvelab> implementation.

In [3]:
n = 256;
name = 'lena';


Parameters for the curvelet transform.

In [4]:
options.null = 0;
options.finest = 1;
options.nbscales = 4;
options.nbangles_coarse = 16;
options.is_real = 1;
options.n = n;


Perform the transform.

In [5]:
MW = perform_curvelet_transform(M, options);


Display the transform.

In [6]:
clf;
plot_curvelet(MW, options);


One can perform a non-linear approximation of the image by thresholding the curvelet coefficients.

In [7]:
T = .2;
MWT = perform_thresholding(MW, T, 'hard');


One recovers the approximated image by using the inverse curvelet transform.

In [8]:
M1 = perform_curvelet_transform(MWT, options);


Display the approximation. Note that is not the best non-linear approximation since the curvelet tight frame is not an orthogonal basis.

In [9]:
clf;
imageplot(M, 'Original', 1,2,1);
imageplot(clamp(M1), 'Approximated', 1,2,2);


## Denoising with the Curvelet transform¶

Curvelet thresholding is useful to perform denoising.

We load a sub-set of the lena image.

In [10]:
name = 'lena';
n = 128;
options.n = n;


In [11]:
sigma = .05;
M = M0 + sigma*randn(n);


Exercise 1

Compute the best threshold to minimize the denoising error in curvelets. Call |Mcurv| the optimal denoising.

In [12]:
exo1()

In [13]:
%% Insert your code here.


Display.

In [14]:
clf;
imageplot(clamp(M), 'Noisy', 1,2,1);
imageplot(clamp(Mcurv), ['Denoised, SNR=' num2str(snr(M0,Mcurv),3) 'dB'], 1,2,2);


Exercise 2

Perform cycle spinning to enhance the recovery error.

In [15]:
exo2()

In [16]:
%% Insert your code here.


Display.

In [17]:
clf;
imageplot(clamp(M), 'Noisy', 1,2,1);
imageplot(clamp(Mcurv), ['Denoised, SNR=' num2str(snr(M0,Mcurv),3)], 1,2,2);


Exercise 3

Compare with translation invariant hard thresholding.

In [18]:
exo3()

In [19]:
%% Insert your code here.


## Inverse Problem Regularization¶

L1 sparsity in curvelets can be used to regularize inverse problems.

Exercise 4

Applies curvelet iterative thresholding to solve an inverse problem such as inpainting, deconvolution or compressed sending.

In [20]:
exo4()

In [21]:
%% Insert your code here.