This numerical tour explores the use of curvelets to perform image denoising.
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.
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);
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.
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.
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.
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.