Total Variation Denoising

Test for Rudin-Osher-Fatemi denoising (ROF) using FB-like method.


Load image.

n = 256;
y = load_image('lena',n*2);
y = rescale(crop(y,n));
y = y + randn(n)*.06;

Display it.


We aim at minimising:

min_x 1/2*norm(y-x,'fro')^2 + lambda*norm(K(x),1)

Regularization parameter.

lambda = .2;

where K is a vectorial gradient and norm(u,1) is a vectorial L1 norme.

K = @(x)grad(x);
KS = @(x)-div(x);

It can be put as the minimization of F(K*x) + G(x)

Amplitude = @(u)sqrt(sum(u.^2,3));
F = @(u)lambda*sum(sum(Amplitude(u)));
G = @(x)1/2*norm(y-x,'fro')^2;

The proximity operator of F is the vectorial soft thresholding.

Normalize = @(u)u./repmat( max(Amplitude(u),1e-10), [1 1 2] );
ProxF = @(u,tau)repmat( perform_soft_thresholding(Amplitude(u),lambda*tau), [1 1 2]).*Normalize(u);
ProxFS = compute_dual_prox(ProxF);

The proximity operator of G.

ProxG = @(x,tau)(x+tau*y)/(1+tau);

Function to record progression of the functional. = @(x)G(x) + F(K(x));

Run the ADMM algorihtm.

options.niter = 300;
[xAdmm,EAdmm] = perform_admm(y, K,  KS, ProxFS, ProxG, options);

Display image.


Since the functional to mimize is stricly convex, we can use a FB scheme on the dual problem.

GradGS = @(x)x+y;
L = 8;
options.method = 'fista';
[xFista,EFista] = perform_fb_strongly(y, K, KS, GradGS, ProxFS, L, options);

Compare the energy decays.

plot([EAdmm(:) EFista(:)]);
axis tight;
legend('ADMM', 'FISTA');
axis([1 length(EAdmm) EFista(end)*.9 2000]);