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