Introduction `a l`image numérique Quelques expériences autour de
Transcription
Introduction `a l`image numérique Quelques expériences autour de
Introduction à l’image numérique Quelques expériences autour de la transformée de Fourier Complément au premier cours - 2012 Dans ce qui suit, on considère des images numériques a(i, j) de taille m × n (i.e. i ∈ {1, 2, . . . , m}, j ∈ {1, 2, . . . , n}), à 256 niveaux de gris (i.e. a(i, j) ∈ {1, 2, ..., 256}). On supposera que m et n sont pairs. Choisissez quelques unes de vos images personnelles ou allez sur http://www.tsi.enst.fr/∼gousseau/images/ Evitez dans un premier temps les images carte.tif, montreuil.tif, strawmat.tif, skin.tif pour des raisons qui apparaı̂tront plus loin. Récupérez également le script affiche.m qui permet de visualiser les images. Pour lire une image sous matlab, tapez a=imread(’image.tif’); la variable a est alors une matrice de valeurs entières. Si vous utilisez une image couleur, veillez à la convertir en niveaux de gris en tapant a=mean(a,3); . Visualisez a comme une image (les valeurs correspondent à des niveaux de gris, 1 est le noir et 256 le blanc) : affiche(a); puis comme une surface surfl(double(a)); colormap gray; shading interp; axis equal; view(-45+180,30); On rappelle que pour qu’une nouvelle figure n’écrase pas les précédentes, il faut faire précéder l’affichage par la commande figure; . Pour fermer toutes les fenêtres d’affichage utiliser la commande close all . Dans la suite, quelques expériences numériques élémentaires illustrant la transformée de Fourier discrète vous sont proposées. Vous pouvez par exemple suivre les questions en caractères gras. Ces expériences ont été pour la plupart commentées en cours lors de la première séance, à l’exception du zoom par 0-padding. 1 Observation du spectre d’images synthétiques Dans cette partie, on observe et explique les spectres d’images synthétiques simples. Commencez par l’image a : Sinusoı̈de horizontale x= [1:256]’; y= pi/16*ones(1,256); a= sin(x*y); Puis visualisez son spectre (on pourra écrire une fonction matlab qui charge une image et visualise son spectre) : A=fft2(a); A=fftshift(A); affiche(A); Remarque : la fonction fftshift sert a placer les basses fréquences au centre de l’image. Dans le cas d’images de taille paire, elle effectue une permutation entre le quart haut-gauche et le quart bas-droit de l’image, ainsi qu’une permutation entre quarts haut-droit et bas-gauche. Visualisez le spectre dans les cas suivants : Sinusoı̈de verticale xx= 3*pi/32*ones(1,256)’; yy= [1:256]; a= sin(xx*yy); 1 Variante x3=(3+1/8)*pi/32*ones(1,256)’; a=sin(x3*yy) Sinusoı̈de diagonale a=sin(x*y+xx*yy); Q : Dans tous les cas, expliquez avec précision les caractéristiques du spectre observé : nombre de points lumineux, disposition, distance entre les points. Pour cela on visualisera l’image d’origine et on utilisera le bouton ”data cursor” sur la fenêtre de visualisation pour en inspecter les valeurs. On pourra utiliser les flêches du clavier pour se déplacer. On s’intéresse ensuite à des images synthétiques contenant des ”contours” : Un carré a=zeros(256,256);a(63:191,63:191)=1; Une sinusoı̈de fenêtrée En partant du carré précédent, et des indices x et y précédemment définis a=a.*sin(x*y); Q : Expliquez les deux spectres observés. 2 Echantillonnage et transformée de Fourier À présent, on observe le spectre d’images naturelles. Chargez l’image maison.tif dans la variable a puis visualisez le logarithme de son spectre. A=fft2(double(a)); A=fftshift(A); affiche(log(Q+abs(A))); La fonction logarithme permet de visualiser une TFD, même lorsque la dynamique de la TFD est très grande. Q : A quoi correspondent les structures horizontales, verticales et obliques observées dans la TFD de cette image? Répétez l’expérience avec l’image carte.gif ou montreuil.tif. Q : Quelles structures supplémentaires observez-vous ? Sous-echantillonnez l’image a d’un facteur 2 (i.e. gardez un pixel sur 2 dans chaque direction). [m,n]=size(a); b=a(1:2:m,1:2:n); affiche(b); Même expérience avec l’image de la carte ou de Montreuil. Q : Expliquez précisément comment se caractérise le phénomène de repliement de spectre sur ces image. Effectuez la même expérience en filtrant préalablement l’image, de manière à atténuer ses hautes fréquences. Par exemple (on suppose ici que A est la FFT de a après application de fftshift), B=zeros(m,n); B(m/4+2:3*m/4,n/4+2:3*n/4)=A(m/4+2:3*m/4,n/4+2:3*n/4); B=fftshift(B); b=ifft2(B); affiche(real(b)); Remarque: bien que la transformée inverse de B soit réelle, on utilise la fonction real pour convertir le type de b. Q : Le résultat est-il meilleur ? pourquoi ? Quel autre type de défaut est apparu ? 2 3 Zoom par prolongement du spectre par des zéros (zéro-padding) On se propose de zoomer l’image a, par exemple d’un facteur deux dans chaque dimension. La solution la plus simple, adoptée par de nombreux logiciels d’affichage d’images, consiste à répliquer les pixels . C’est également le zoom utilisé par la fonction loupe de Matlab (icône en haut de la fenêtre de visualisation). En partant de l’image de petite taille maison.tif (que l’on suppose ici chargée dans la variable a de taille m × n), effectuez b=zeros(2*m,2*n); b(1:2:2*m,1:2:2*n)=a;b(2:2:2*m,1:2:2*n)=a;b(1:2:2*m,2:2:2*n)=a;b(2:2:2*m,2:2:2*n)=a; Q : Qu’observe-t-on, en particulier le long des bords obliques ? On s’intéresse maintenant à une méthode alternative de zoom. L’idée est d’ajouter des zéros à la TFD de l’image de manière à augmenter sa taille tout en préservant son contenu aux faibles fréquences, puis de reconstruire une image à partir de cette transformée. • calculez A, la TFD de a • prolongez A en une image 2m × 2n par ajout de zéros aux hautes fréquences (attention: les hautes fréquences sont au centre de A, et comme au paragraphe précédent, il faut utiliser la fonction fftshift avant de prolonger par des zéros). • calculez b, partie réelle de la TFD inverse de A. A=fft2(a); A=fftshift(A); B=zeros(2*m,2*n); B(m/2+2:m/2+m,n/2+2:n/2+n)=A(2:end,2:end); B=fftshift(B); b=ifft2(B); affiche(real(b)); Q : Comparez visuelement le résultat au zoom effectué par réplication des pixels. Quel est l’avantage du prolongement de spectre par des 0 ? Quel type d’artefact est néanmoins introduit par cette méthode (visible en particulier le long des discontinuités de l’image)? 4 Importance de la phase de la TFD Nous allons maintenant illustrer l’importance respective de la phase et du module des coefficients de la TFD. Nous commençons par échanger les phases des TFD de deux images. Choisissez une image b différente de a (de même taille, par exemple chapeau.tif et maison.tif). Calculez les TFD A et B respectivement de a et b. Remplacez les coefficients de B par leur modules, puis multipliez les par la phase des coefficients correspondants de A. Utilisez ifft2 et affichez le résultat A=fft2(a); B=fft2(b); B=abs(B).*exp(i*angle(A)); c=ifft2(B); affiche(real(c)); Q : L’image c vous semble-t-elle plus proche de a ou de b? 3 5 Synthèse de texture homogène par perturbation de la phase Pour illustrer le rôle du module des coefficients, on effectue l’expérience suivante: partant d’une texture relativement homogène (par exemple strawmat.tif ou skin.tif), on change la phase des coefficients de sa TFD de manière aléatoire, puis on on calcule l’image correspondante. Une solution simple pour obtenir des phases aléatoires qui respectent les symétries de la TFD est de partir d’un bruit blanc et d’utiliser les phases de sa TFD: pha=fft2(rand(m,n)); Q :Multipliez le module de la TFD de votre texture par les phases de ”pha”, effectuez la TFD inverse. Qu’observe-t-on? Effectuez la même expérience à partir d’une image synthétique simple (un carré, un disque...). 4