TP - Inria

Transcription

TP - Inria
Course Compressive Sensing, 5 GM, Insa Rennes
Aline Roumy
TP acquisition comprimée IRM
Ce TP utilise Matlab et s’intéresse à l’acquisition comprimée d’image IRM. L’objectif est de montrer le lien entre le problème de débruitage d’un signal parcimonieux et le sous-échantillonnage, tel
que effectué en compressive sensing. Afin de gagner en intuition, on considère tout d’abord un signal
synthétique 1D.
Partie 1 Débruitage d’un signal parcimonieux 1D
Créez un fichier script tp1.m contenant les instructions décrites ci-dessous.
(a) Créez un vecteur x de taille 1x128 avec 5 coefficients non nuls ([1:5]/5) et appliquez une
permutation aléatoire.
(b) Affichez-le (Utiliser la fonction Matlab stem).
(c) Ajoutez un bruit additif blanc Gaussien d’écart type σ = 0.05 au signal, i.e. y = x + n
(d) Affichez le signal bruité (Utiliser la fonction Matlab stem).
(e) Le problème d’optimisation l1 :
1
x̂ = arg min ||z − y||22 + λ||z||21
z 2
(1)
admet ici une solution analytique (pourquoi a-t-on une solution analytique dans ce
cas ? Si vous avez le temps en séance, démontrez pourquoi la solution est celle
ci-dessous?)

 y + λ si y ≤ −λ
0 si |y| < λ
x̂ =
(2)

y − λ si y ≥ λ
qui est souvent appelée SoftThresholding ou Shrinkage. Ecrire une fonction Matlab y =
SoftThresh(x,lambda), et appelée SoftThresh.m, qui implémente (2).
(f) Appliquez l’opérateur de seuillage au signal bruité y pour λ ∈ {0.01, 0.05, 0.1, 0.2} et affichez
le signal débruité x̂. Ce signal x̂ est-il parcimonieux ?
Partie 2 Sous-échantillonnage dans le domaine fréquentiel et repliement du signal (aliasing)
L’objectif de cette partie est d’observer l’effet d’un sous échantillonnage régulier puis aléatoire
du signal dans le domaine fréquentiel.
Créez un fichier script tp2.m contenant les instructions décrites ci-dessous.
(a) (idem Partie 1) Créez un vecteur x de taille 1x128 avec 5 coefficients non nuls ([1:5]/5) et
appliquez une permutation aléatoire.
(b) (idem Partie 1) Affichez-le (Utiliser la fonction Matlab stem).
(c) Calculez la transformée de Fourier centrée
X = fftc(x,2);
(d) Sous-échantillonnez X, afin de ne garder que 1 coefficient sur 4. Les autres coefficients sont
mis à zéro. Appelez Xu ce vecteur de 128 coefficients, qui ne compte que 32 coefficients
non-nuls.
(e) Appliquez la transformée de Fourier inverse
xu = ifftc(Xu,dim)*4;
en corrigeant par un facteur 4 pour tenir compte du fait que l’on a sous-échantillonné par
un facteur 4.
1
(f) Affichez les parties réelle et imaginaire du signal real(xu) imag(xu) (Utiliser la fonction
Matlab stem).
Qu’observez-vous ? Peut-on récupérer le signal x ? Si oui, comment ?
(g) Sous-échantillonnez maintenant Xu de manière aléatoire. Appelez Xr ce vecteur de 128
coefficients, qui ne compte que 32 coefficients non-nuls et dont les positions sont choisies
aléatoirement (utilisez randperm).
(h) Appliquez la transformée de Fourier inverse
xr = ifftc(Xr,dim)*4;
en corrigeant par un facteur 4 pour tenir compte du fait que l’on a sous-échantillonné par
un facteur 4.
(i) Affichez les parties réelle et imaginaire du signal real(xr) imag(xr) (Utiliser la fonction Matlab
stem).
Qu’observez-vous ? Peut-on récupérer le signal x ? Si oui, comment ? En quoi
le sous-échantillonnage ressemble au problème de débruitage ?
Partie 3. Reconstruction après acquisition comprimée d’une image IRM
Créez un fichier script tp3.m contenant les instructions décrites ci-dessous.
(a) Chargez le fichier brain.mat et affichez l’image IRM.
load brain.mat
figure(1), imshow(abs(im),[])
(b) Sous-échantillonnage fréquentiel aléatoire. Deux motifs de sous-échantillonnage vous sont
proposés : mask unif, mask vardens . Le premier est un sous-échantillonnage selon une distribution uniforme, alors que le second favorise les basses fréquences. Appliquez l’échantillonnage
selon les deux filtres, afin d’obtenir les matrices Mu, Mv, avec le code :
M = fft2c(im);
M_us = (M.*mask_vardens)./pdf_vardens;
(c) Réalisez l’estimation linéaire sans tenir compte que le signal est parcimonieux.
(d) Affichez les images (domaine image / domaine fréquentiel / erreur de reconstruction) avec
le code
figure(3), imshow(abs(cat(2,im,im_us, (im_us-im)*10)),[0,1])
Est-ce que le bruit de repliement ressemble à un bruit blanc ? Pour quel(s) filtre(s) de sous échantillonnage ? Quel filtre allez-vous utiliser pour reconstruire
le signal ?
(e) L’image IRM est assez parcimonieuse dans le domaine image mais l’est encore plus dans
le domaine ondelettes. Vérifiez cela en visualisant la transformée en ondelettes de l’image
brain. On utilisera les fonctions de la boı̂te à outil WaveLab écrite par David Donoho.
W = Wavelet;
im_W = W*im;
figure(6), imshowWAV(im_W);
(f) Pour reconstruire l’image on utilisera donc la reconstruction de la transformée en ondelettes
de l’image. En pratique, il faut ajouter la transformée en ondelettes avant d’appliquer votre
implémentation préférée du problème l1 (par exemple POCS), puis appliquer la transformée
en ondelettes inverse. Afin de choisir λ, vous pouvez visualiser quels coefficients seront
gardés après seuillage avec le code :
2
lambda=.25;
imuW = W*im_u;
figure(7),imshow(abs(imuW)>lambda,[]);
(g) Implémentez POCS pour l’image brain, pour les deux filtres. Affichez l’image reconstruite
à chaque itération.
3