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