# Curvelet Denoising

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

## Contents

## Installing toolboxes and setting up the path.

You need to download the following files: signal toolbox and general toolbox.

You need to unzip these toolboxes in your working directory, so that you have `toolbox_signal` and `toolbox_general` in your directory.

**For Scilab user:** you must replace the Matlab comment '%' by its Scilab counterpart '//'.

**Recommandation:** You should create a text file named for instance `numericaltour.sce` (in Scilab) or `numericaltour.m` (in Matlab) to write all the Scilab/Matlab command you want to execute. Then, simply run `exec('numericaltour.sce');` (in Scilab) or `numericaltour;` (in Matlab) to run the commands.

Execute this line only if you are using Matlab.

```
getd = @(p)path(p,path); % scilab users must *not* execute this
```

Then you can add the toolboxes to the path.

getd('toolbox_signal/'); getd('toolbox_general/');

## 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 Curvelab implementation.

Load an image.

```
n = 256;
name = 'lena';
M = rescale(load_image(name, n));
```

Parameters for the curvelet transform.

options.null = 0; options.finest = 1; options.nbscales = 4; options.nbangles_coarse = 16; options.is_real = 1; options.n = n;

Perform the transform.

MW = perform_curvelet_transform(M, options);

Display the transform.

clf; plot_curvelet(MW, options);

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

```
T = .2;
MWT = perform_thresholding(MW, T, 'hard');
```

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

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.

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.

```
name = 'lena';
n = 128;
M0 = rescale(crop(load_image(name),n, [108 200]));
options.n = n;
```

Add some noise.

sigma = .05; M = M0 + sigma*randn(n);

*Exercice 1:* (the solution is exo1.m) Compute the best threshold to minimize the denoising error in curvelets. Call `Mcurv` the optimal denoising.

exo1;

Display.

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

*Exercice 2:* (the solution is exo2.m) Perform cycle spinning to enhance the recovery error.

exo2;

Display.

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

*Exercice 3:* (the solution is exo3.m) Compare with translation invariant hard thresholding.

exo3;

## Inverse Problem Regularization

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

*Exercice 4:* (the solution is exo4.m) Applies curvelet iterative thresholding to solve an inverse problem such as inpainting, deconvolution or compressed sending.

exo4;