You are on page 1of 10

Cours de traitement dimages - Corrig Labo 1: Familiarisation avec Matlab Manipulations de base sur les niveaux de gris Images

calcules Introduction a la Transforme de Fourier

1. Quantication dune image Limage Lena en niveaux de gris peut tre obtenue (a) soit en la lisant directement partir du disque >> X = imread(lena.tif); (b) soit partir de limage lena_color.tif. >> Y = imread(lena_color.tif); >> X = rgb2gray(Y); Pour visualiser limage avec n niveaux de gris, il existe de nombreuses variantes. (a) Utiliser les fonctionalits de imshow : >> >> >> >> >> figure(1) imshow(X); figure(2) n=128; imshow(X,n) % % % % % Slectionner la figure 1 Afficher lena avec 256 niveaux de gris Slectionner la figure 2 Choisir le nombre de niveaux de gris Afficher limage n niveaux

(b) Quantication manuelle : >> >> >> >> >> >> figure(1) imshow(X); figure(2) n=128; d=256/n; W=uint8(floor(double(X)/d)*d); Slectionner la figure 1 Afficher lena avec 256 niveaux de gris Slectionner la figure 2 Choisir le nombre de niveaux de gris Dterminer le pas de quantification Quantifier. On notera que on ne peut multiplier ou diviser un uint8, et quil faut donc passer par une conversion au format double % Afficher limage n niveaux % % % % % %

>> imshow(W)

(c) Quantication manuelle au format double : >> >> >> >> >> >> >> I=double(X)/255; % Convertir limage en double figure(1) % Slectionner la figure 1 imshow(I); % Afficher lena avec 256 niveaux de gris figure(2) % Slectionner la figure 2 n=128; % Choisir le nombre de niveaux de gris d=256/n; % Dterminer le pas de quantification imshow(floor(I*255/d)/(n-1)) % Afficher limage n niveaux

La dernire ligne applique la quantication (floor(I*255/d)), ce qui resulte dans des valeurs entires dans lintervalle [0, n 1] quon normalise ensuite lintervalle [0, 1]. 2 Quantication en utilisant la fonction gray2ind : >> I=double(X)/255; % Convertir limage en double >> figure(1) % Slectionner la figure 1 >> imshow(I); % Afficher lena avec 256 niveaux de gris >> figure(2) % Slectionner la figure 2 >> n=128; % Choisir le nombre de niveaux de gris >> [X,map]=gray2ind(I,n); % Convertir en indexe avec n niveaux >> imshow(X,map) % Afficher limage n niveaux Lapparition de faux contours est visible partir de 16 niveaux de gris environ. Bien entendu, ce seuil dpend de la qualit du systme dafchage, de la lumire ambiante, etc. 2. Loi de Weber (a) Crer une fonction weber. function img=weber(L1, L2, Lb) % % WEBER cr\eation dune image pour tester la loi de Weber % WEBER cr\ee une image de taille 600x600 dont le fond a une % intensit\e Lb, avec au centre un carr\e de taille 160x160 dont % la moiti\e gauche a une intensit\e L1 et la moiti\e droite une % intensit\e L2. % img = ones(600,600)*Lb; img(221:380,221:300)=L1; img(221:380,301:380)=L2; img=uint8(img); (b) Dterminer votre constante de Weber. Sur la gure 1, on a reprsent diffrentes valeurs de en fonction de lintensit L1 . Ces valeurs retent lacuit dun individu diffrencier des niveaux de gris, dans des circonstances particulires. Les diffrents facteurs qui inuencent ce rsultat sont : lacuit visuelle du testeur, la priode de la journe durant laquelle les mesures ont t prises, la conguration du moniteur (contraste, luminosit,...), la lumire ambiante, etc.. Comme on le voit, le rapport L/L1 nest constant que sur une certaine gamme dintensits. Pour les faibles intensits, la relation entre et L1 nest plus linaire : le systme visuel humain a plus de peine distinguer des niveaux de gris de faible intensit. Un phnomne analogue peut tre observ dans les tons clairs, mais napparat pas dans la gure 1, car la luminosit de lcran tait relativement faible lors de la mesure. 2

Dans cet exemple, la constante de Weber vaut approximativement 1.5% lorsque Lb = 10, et 1.2% lorsque Lb = 200.
10
3

10 (%) 10

10

50

100 150 Intensit (256 niveaux)

200

250

F IG . 1 Diffrences peine perceptibles dintensit L, en fonction de L1 . o : Lb = 10, x : Lb = 200. 3. Re-chantillonnage dune image

F IG . 2 Images sous-chantillones par un facteur 2 ( gauche) et 4 ( droite) Deux solutions sont possibles : (a) Charger limage sub4=imread(sub4.tif); (b) Ecrire une fonction dans subsample.m : function Y=subsample(X) % SUBSAMPLE sous-chantillonnage dune image par 2 % SUBSAMPLE sous-chantillonne une image par un facteur 2 dans 3

% % % % % %

chaque direction. I2=SUBSAMPLE(I) retourne dans I2 la version sous-chantillonne de I. Les colonnes et les lignes sont sous-chantillonnes par 2. Cette fonction utilise une double boucle for s=size(X); height=s(1); % nombre de lignes de limage width=s(2); % nombre de colonnes de limage % Creer une matrice de zeros de taille moiti dans chaque direction Y=zeros(round(height/2),round(width/2)); % Remplir Y avec les donnes de X en prenant un pixel sur deux for i=1:round(height/2) for j=1:round(width/2) Y(i,j)=X(2*i-1,2*j-1); end end

Puis lutiliser de la faon suivante : >> >> >> >> >> Y=imread(sub4.tif); Y2=subsample(Y); image(Y2) colormap(gray) truesize

On peut galement utiliser les fonctionnalits de Matlab (beaucoup plus rapide crire et surtout excuter) : function Y=subsample2(X) % SUBSAMPLE2 sous-chantillonnage dune image par 2 (optimis) % SUBSAMPLE2 sous-chantillonne une image par un facteur 2 dans % chaque direction. % % I2=SUBSAMPLE2(I) retourne dans I2 la version sous-chantillonne % de I. Les colonnes et les lignes sont sous-chantillonnes par 2. % % Cette fonction utilise le sous-indexage Matlab s=size(X); Y=X(1:2:s(1),1:2:s(2)); Cette fonction sutilise exactement de la mme faon que la prcdente. Pour obtenir limage sous-chantillonne par 4 : >> >> >> >> Y4=subsample(Y2); image(Y4) colormap(gray) truesize

(c) Afcher limage. Voir dessus.

(d) Effets du sous-chantillonnage : Limage originale est dgrade par le sous-chantillonnage (cf. gure 2). On note lapparition de nouvelles gures gomtriques, appeles Figures de Moir, notamment dans les zones contenant des frquences spatiales leves. En effet, aprs lopration de sous-chantillonnage, le critre de Nyquist nest plus satisfait. Il y a alors repliement du spectre de limage, ce qui provoque lapparition de gures de Moir. 4. Transforme de Fourier discrte bidimensionelle (FFT) Le chargement et le calcul de la FFT et IFFT de res_chart.tif se font de la manire suivante : >> >> >> >> >> x = imread(res_chart.tif); figure(1); imshow(x); y = fft2(x); x2 = ifft2(y) figure(2); imshow(real(x2),[0,255]);

Thoriquement, on sattend a retrouver exactement limage originale. En pratique, on observe deux diffrences : premirement, alors que x tait originalement cod en uint8 (entier non sign sur 8 bits), elle est evidemment transforme en nombre rel (double) avant la transforme de Fourier, et de mme pour le rsultat x2. Une consquence de ce changement de format est que lon ne peut utiliser les paramtres par dfaut de imshow mais que lon doit lui spcier la game de valeurs que peut prendre x2, soit [0,255]. Deuximement, alors que le rsultat de la transforme inverse devrait thoriquement tre rel, on observe en pratique une partie imaginaire non nulle suite des erreurs darrondis. Cest pourquoi on afche uniquement sa partie relle real(x2). Pour les images mit.tif et camman.tif, on charge, afche, transforme et afche la FFT de la manire suivante : >> >> >> >> >> x = imread(mit.tif); figure(1); imshow(x); y=fft2(x); ymod = abs(fftshift(y)); figure(2); imshow(log(ymod),[]);

Pour afcher la transforme de Fourier (complexe !) de limage. Il est intressant de reprsenter la norme de la transforme de Fourier, qui reprsente lamplitude des frquences spatiales de limage. La fonction fftshift permet de recentrer y pour visualiser lamplitude du contenu frquentiel avec les basses frquences au centre de limage (domaine principal). Etant donn la grande variabilit des amplitudes possible, il est plus informatif de les afcher en chelle logarithmique, i.e. log(ymod). Enn, comme on ne connat pas a priori la gamme des valeur que peut prendre log(ymod), on donne lintervalle vide [] comme argument imshow, qui lajuste automatiquement aux valeurs minimales et maximales de limage fcher. Notons que de manire alternative, on aurait pu utiliser de la fonction imagesc qui elle aussi utilise toute la gamme dynamique de limage pour la visualisation, et permet en outre de choisir une carte de couleur quelconque. Par exemple, pour afcher limage en niveau de gris, on peut crire >> figure(2); imagesc(log(ymod)); colormap(gray); truesize Une proprit intressante de la transforme de Fourier discrte est sa valeur lorigine pour laquelle on peut vrier que sum(sum(x)) = y(1,1) = max(max(y)). La phase du contenu frquentiel de limage est plus difcile apprhender. An de se rendre compte de limportance de linformation contenue dans la phase, on peut visualiser limage de phase comme suit : >> z = ifft2(y./abs(y)); >> imshow(real(z),[-0.01,0.01]); 5

Ces rsultats sont donns dans la gure 3. On notera que lon utilise un intervalle [-0.01,0.01] pour visualiser real(z). On aurait pu se contenter de lintervalle par dfault [], mais lalternative que lon a choisi permet une meilleure visualisation des rsultats. Limage de la gure 4 reprsente limage de la

F IG . 3 Image originale ( gauche), logarithme du module de la transforme de Fourier recentre (au centre) et image de phase ( droite). transforme inverse de la transforme forme de la phase de la transforme de limage mit avec le module de la transforme de limage camman. Les commandes pour obtenir ce rsultat sont les suivantes : >> >> >> >> >> Fcamman=fft2(camman); Fmit=fft2(mit); Fmix=abs(Fcamman).*exp(i*angle(Fmit)); mix=ifft2(Fmix); imshow(real(mix),[0,255]);

Linformation porte par la phase de limage semble nettement plus signicative que celle porte par le module (cf. g 4). En effet, la phase informe sur lemplacement et lorientation de tous les contours de limage, alors que le module ne renseigne que sur lintensit de ces contours.

F IG . 4 Importance de linformation contenue dans la phase de la transforme de Fourier 5. Manipulations dans le domaine de Fourier :

crire deux versions des fonctions suivantes, une qui travaille dans le domaine de Fourier, lautre dans le domaine spatial. (a) Le calcul de la moyenne de limage peut videmment seffectuer via mean2(). On peut galement recrire cette fonction de diverses mani` res. Dans le domaine spatial, avec une double boucle for : function m = moyenne(X) # MOYENNE # MOYENNE(X) retourne la valeur moyenne de limage; somme = 0; for a=1:size(X,1) for b=1:size(X,2) somme = somme + X(a,b); end end m = somme / ( size(X,1) * size(X,2) ); Les boucles for sont malheureusement trs inefcaces sous matlab. Dans le domaine spatial, on ` prfrera : function m = moyenne(X) # MOYENNE # MOYENNE(X) retourne la valeur moyenne de limage; m = sum(sum(X))/prod(size(X)); Dans le domaine de Fourier, le coefcient lorigine de la FFT correspond la somme des valeurs de limage. On peut donc crire la fonction comme suit : function m = moyenne(X) # MOYENNE # MOYENNE(X) retourne la valeur moyenne de limage; FX = fft2(X); m = FX(1,1)/prod(size(X)); (b) Pour effectuer une symtrie centrale dans le domaine spatial, on pourrait de nouveau appliquer une double boucle for. On peut tre beaucoup plus efcace comme suit : function Y = symcentre(X) # SYMCENTRE # SYMCENTRE(X) inverse limage par sym{\e}trie centrale Y(size(X,1):-1:1,size(X,2):-1:1) = X; Pour effectuer cette symtrie dans le domaine de Fourier, on note que la symtrie centrale revient appliquer une transformation y(m,n) = x(-m,-n) une translation prs. Dans lexpression de la transforme de Fourier, inverser le signe des coordonnes spaciales entrane une inversion de la phase du coefcient de Fourier. Ds lors, la FFT de x(-m,-n) est simplement le conjugu complexe de la FFT de x. La fonction scrit comme suit : function Y = symcentre(X) # SYMCENTRE 7

SYMCENTRE(X) inverse limage par sym{\e}trie centrale

Y = real(ifft2(conj(fft2(X)))); (c) Dans le domaine spatial : function Y = contraste(X,alpha) # CONTRASTE # CONTRASTE(X,alpha) change le contraste dun facteur alpha Y = ( ( X - mean2(X) ) * alpha ) + mean2(X); Dans le domaine de Fourier : function Y = contraste(X,alpha) # CONTRASTE # CONTRASTE(X,alpha) change le contraste dun facteur alpha FX = fft2(X); CC = FX(1,1); FY = FX * alpha; FY(1,1) = CC; Y = real(ifft2(FY)); (d) Dans le domaine spatial : function Y = translation(X,da,db) # TRANSLATION # TRANSLATION(X,da,db) translate circulairement limage X # par un vecteur (da,db) for a=1:size(X,1) for b=1:size(X,2) na = mod(a+da-1,size(X,1)) + 1; nb = mod(b+db-1,size(X,2)) + 1; Y(na,nb) = X(a,b); end end Si on considre limage x et sa translation y, on a
M N

X (f, g ) =
m=1 n=1

x(m, n).e2..i.( x(m a, n b)

m.f M

+ n.g N )

y (m, n) =

Par substitution et changement de variable m=m-a, n=n-b, et en tenant compte de ce que x peut tre conmsidr comme priodique, on trouve
M N

Y (f, g )

=
m=1 n=1

y (m, n).e2..i.(

m.f M

+ n.g N )

=
m=1 n=1 M a

x(m a, n b).e2..i.(
N b

m.f M

+ n.g N )

=
m =1a n =1b M N

x(m , n ).e2..i.( x(m , n ).e2..i.(


m =1 n =1 M N

(m +a).f M

(n +b).g ) N

= = = (

(m +a).f M

(n +b).g ) N

x(m , n ).e2..i.(
a.f

m .f M

.g + nN )

).e2..i.( M

a.f

+ b.g N )

m =1 n =1

X (f, g ).e2..i.( M

+ b.g N )

Ds lors, dans le domaine de Fourier, on peut crire translation avec une double boucle for : function Y = translation(X,da,db) # TRANSLATION # TRANSLATION(X,da,db) translate circulairement limage X # par un vecteur (da,db) s = size(X); FX = fft2(X); for k=1:s(1) for l=1:s(2) FY(k,l) = FX(k,l) * exp( -2*pi*i*(da*k/s(1)+db*l/s(2)) ); end end Y = abs(ifft2(FY)); Et de mme, sans boucle for : function Y = translation(X,da,db) # TRANSLATION # TRANSLATION(X,da,db) translate circulairement limage X # par un vecteur (da,db) FX = fft2(X); k = ones(1,size(X,1)) * [1:size(X,2)]; l = [1:size(X,1)]*ones(1,size(X,2)); FY = FX .* exp(-2*pi*i*(k*da/size(X,1)+l*db/size(X,2))); Y = abs(ifft2(FY));

F IG . 5 Image Lena originale ( gauche), rsultat de contraste(X,0.4) (centre) et de contraste(X,2.5) (droite)

F IG . 6 Image Lena originale translation(X,50,100) (droite)

gauche),

rsultat

de

symcentre(X)

(centre)

et

de

10

You might also like