Vous êtes sur la page 1sur 21

TRAVAUX PRATIQUES

TRAITEMENT D'IMAGES
TP1
Opérations élémentaires sur des images en couleur ou en noir et blanc.
- Lancez MS.PAINT sous Windows.
- Allez au menu « image » puis au sous menu « Attributs… »
- Choisissez « unités : pixel », « largeur : 256 », « hauteur : 256 » et « couleur » puis validez « ok ».
- Dessinez des ellipses creuses avec ou sans intersections entre elles puis coloriez les et leurs intersections
de différentes couleurs.
- Enregistrez l’image sous le nom « photo » sous le sous répertoire « work » du répertoire « matlab ».
- Quittez MS.PAINT puis lancez MATLAB.
- Sous MATLAB, exécutez la commande :
>> [A,map]=imread('photo.bmp');
- Pour afficher l’image, exécutez la commande :
>> figure; imshow(A);
- Pour obtenir les dimensions de l’image, exécutez la commande :
>> [m,n,p]=size(A)
- Pour obtenir une image en niveaux de gris à partir d’une image couleur, appliquez la formule :
I=0.299xRED+0.587xGREEN+0.114xBLUE en exécutant la commande :
>> A2=uint8(.299*double(A(:,:,1))+.587*double(A(:,:,2))+.114*double(A(:,:,3)));
sachant que l’écriture A(:,:,1) est équivalente à A(1:m,1:n,1).

- Pour obtenir une image binaire à partir d’une image à niveau de gris il suffit de fixer un seuil alors toute
valeur de A2 qui soit supérieure au seuil prend la valeur 255 (blanc) et toute valeur inférieure ou égale au
seuil prend la valeur 0 (noir) ; pour calculer, ainsi, le seuil exécuter la commande :
>> seuil=mean(mean(A2))
- Pour avoir l’image binaire, exécuter la commande :
>> [m,n]=size(A2);
>> A3=0*ones(m,n);
>> for x=1:m, for y=1:n, if A2(x,y)>seuil, A3(x,y)=255; else A3(x,y)=0; end, end, end,
- Pour afficher l’image, exécutez la commande :
>> figure; imshow(A3);
- Opérations élémentaires sur une image :
Rotation :

  m  n m
 x   x 1  2   cos()   y1  2   sin()  2 
 y      
     x  m   sin()   y  n   cos()  n 
  1 2  
1
2 2 
>> [m,n,p]=size(A);
>> A6=0*ones(m,n,p);
>> R=10*pi/180;

Page 2 / 21
>> for k=1:m, for l=1:n, x=uint8((k-m/2)*cos(R)+(l-n/2)*sin(R)+m/2); y=uint8(-(k-m/2)*sin(R)+(l-
n/2)*cos(R)+n/2); if x>m | x<1 | y>n | y<1, A6(k,l,:)=0; else A6(k,l,:)=A(x,y,:); end, end, end;
>> A6=uint8(A6);
>> figure; imshow(A6);
- Translation :

 x   x 1  Tx 
 y    y  Ty 
   1 
>> [m,n,p]=size(A);
>> A7=0*ones(m,n,p);
>> Tx=26;
>> Ty=34;
>> for k=1:m, for l=1:n, x=k-Tx; y=l-Ty; if x>m | x<1 | y>n | y<1, A7(k,l,:)=0; else A7(k,l,:)=A(x,y,:); end,
end, end,
>> A7=uint8(A7);
>> figure; imshow(A7);
- Spectre d’une image :
>> S=uint8(real(fft2(A)))
>> figure; imshow(S)

Page 3 / 21
TP2

- Pour lire l’image de la photo des fleurs, exécutez la commande :


>> A=imread('pears.png');
- Pour afficher l’image, exécutez la commande :
>> figure; imshow(A);
- Pour obtenir les dimensions de l’image, exécutez la commande :
>> [m,n,p]=size(A)
- Pour avoir une image à niveaux de gris à partir de l’image couleur, exécutez la commande :
>> A2=rgb2gray(A);
- Pour afficher l’image, exécutez la commande :
>> figure; imshow(A2);
- Pour obtenir une image binaire à partir d’une image à niveau de gris il suffit de fixer un seuil alors toute
valeur de A2 qui soit supérieure au seuil prend la valeur 1 (blanc) et tout valeur inférieure ou égale au seuil
prend la valeur 0 (noir) : exécuter la commande afin de calculer le seuil :
>> seuil=mean2(A2)/255
- Pour avoir l’image binaire, exécuter la commande :
>> A3=im2bw(A2,seuil);
- Pour afficher l’image, exécutez la commande :
>> figure; imshow(A3);
- Pour afficher les trois histogrammes (rouge, vert et bleu) de l’image couleur, exécutez les commandes :
>> figure;subplot(2,2,1);imhist(A(:,:,1));title('histogramme du rouge');
>> subplot(2,2,2);imhist(A(:,:,2));title('histogramme du vert');
>> subplot(2,2,3);imhist(A(:,:,3));title('histogramme du bleu');
- Pour afficher l’histogramme de l’image en niveau de gris, exécutez la commande :
>> subplot(2,2,4);imhist(A2);title('histogramme image en gris');
- Pour afficher l’histogramme de l’image binaire exécuter la commande :
>> figure;imhist(A3);title('histogramme image binaire');
- Pour convertir une image RGB en une image HSV, exécutez la commande :
>> A4=rgb2hsv(A);
Sachant que la relation entre les couleurs (R, G et B) et (H, S et V) est :
V=(R+G+B)/3
S=1- 3 min(R,G,B)/(R+G+B)
H=arccos((1/2(R-G)+1/2(R-B))/sqrt((R-G)²+(R-B)(G-B)))
- Pour afficher l’image, exécutez la commande :
>> figure; imshow(A4);
- Pour convertir une image RGB en une image YCbCr, exécutez la commande :
>> A5=rgb2ycbcr(A);

Page 4 / 21
- Pour afficher l’image, exécutez la commande :
>> figure; imshow(A5);
- Opérations élémentaires sur une image :
Rotation :
>> A6=imrotate(A,10);
>> figure; imshow(A6);
- Translation :

 x   x 1  Tx 
 y    y  Ty 
   1 
>> [m,n,p]=size(A);
>> A7=0*ones(m,n,p);
>> Tx=26;
>> Ty=34;
>> for k=1:m, for l=1:n, x=k-Tx; y=l-Ty; if x>m | x<1 | y>n | y<1, A7(k,l,:)=0; else A7(k,l,:)=A(k-Tx,l-Ty,:);
end, end, end,
>> A7=uint8(A7);
>> figure; imshow(A7);

- Zoom :
Pour réduire la taille de l’image avec un facteur 0,6 :
>> A8=imresize(A,0.6);
>> figure; imshow(A8);
Pour agrandir la taille de l’image avec un facteur 2 :
>> A8=imresize(A,2);
>> figure; imshow(A8);

Page 5 / 21
TP3
Filtrage passe bas et débruitage de l’image.
- Lecture et affichage de l’image :
>> A=imread('pears.png');
>> figure; imshow(A);
- Génération d’un bruit additif :
>> B1=uint8(double(A)+25*randn(size(A)));
>> figure; imshow(B1);
- Génération d’un bruit multiplicatif :
>> B2=uint8(double(A)+.6*double(A).*rand(size(A)));
>> figure; imshow(B2);
- Génération d’un bruit impulsionnel:
>> B=A; x=rand(size(A)); B(find(x<.05))=0; B(find(x>.8 & x<.5))=1; B3=uint8(B);
>> figure; imshow(B3);
- Filtrage de l’image bruitée :
- filtrage de la moyenne par une fenêtre d’analyse :
>> M=1/9*[1 1 1; 1 1 1; 1 1 1];
- filtre de la moyenne appliqué sur le bruit B1 :
>> F1(:,:,1)=uint8(conv2(M,B1(:,:,1)));
>> F1(:,:,2)=uint8(conv2(M,B1(:,:,2)));
>> F1(:,:,3)=uint8(conv2(M,B1(:,:,3)));
>> figure; imshow(F1);
- filtre de la moyenne appliqué sur le bruit B2 :
>> F2(:,:,1)=uint8(conv2(M,B2(:,:,1)));
>> F2(:,:,2)=uint8(conv2(M,B2(:,:,2)));
>> F2(:,:,3)=uint8(conv2(M,B2(:,:,3)));
>> figure; imshow(F2);
- filtre median appliqué sur le bruit B3:
>> F3=B3; [m,n,p]=size(B3); for x=2:m-1, for y=2:n-1, F3(x,y)=median(double([B3(x-1,y-1:y+1) B3(x,y-
1:y+1) B3(x+1,y-1:y+1)])); end, end, F3=uint8(F3);
>> figure; imshow(F3); f
- filtre morphologique avec élément structurant : carré
- dilatation:
>> [m,n,p]=size(B3); for x=2:m-1, for y=2:n-1, F5(x,y)=max([B3(x-1,y-1:y+1) B3(x,y-1:y+1) B3(x+1,y-
1:y+1)]); end, end,
>> figure; imshow(F5);
- erosion:
>> [m,n,p]=size(B3); for x=2:m-1, for y=2:n-1, F6(x,y)=min([B3(x-1,y-1:y+1) B3(x,y-1:y+1) B3(x+1,y-
1:y+1)]); end, end,
>> figure; imshow(F6);

Page 6 / 21
- faites une ouverture= erosion puis une dilatation: dilatation(erosion(I))
- faites une fermeture= dilatation puis erosion: erosin(dilatation(I))
- filtrage de Gabor:
>> gabor=[-.38 1 1.85 1 -.38; 1 -2.61 -4.85 -2.61 1; 1.85 -4.85 16 -4.85 1.85; 1 -2.61 -4.85 -2.61 1; -.38 1
1.85 1 -.38]
>> F9(:,:,1)=conv2(gabor,A(:,:,1));
>> F9(:,:,2)=conv2(gabor,A(:,:,2));
>> F9(:,:,3)=conv2(gabor,A(:,:,3));
>> figure; imshow(uint8(F9));

Page 7 / 21
TP4
Avec la boite à outils « image processing » de MATLAB
- Lecture et affichage d’une autre image :
>> A2=imread('cameraman.tif'); figure; imshow(A2)
- Pour introduire un bruit additif à l’image :
>> B1=imnoise(A2,'gaussian'); figure; imshow(B1)
- Pour filtrer par un moyenneur le bruit de l’image :
 1 1 1
1
M  1 1 1
9
 1 1 1

>> M=1/9*[1 1 1; 1 1 1; 1 1 1];


>> F11=uint8(filter2(M,B1)); figure; imshow(F11)
- Filtrez l’image affectée par un bruit additif par un filtre de la moyenne uniforme, dont le noyau est :
1 1 1 1 1
1 1 1 1 1
1 
M1  1 1 1 1 1
25  
1 1 1 1 1
 1 1 1 1 1
>> FM1=uint8(filter2(M1,B1)); figure; imshow(FM1)
- Filtrez l’image affectée par un bruit additif par un filtre de la moyenne circulaire, dont le noyau est :
 0 1 1 1 0
 1 1 1 1 1
1 
M2   1 1 1 1 1
21  
 1 1 1 1 1
 0 1 1 1 0
>> FM2=uint8(filter2(M2,B1)); figure; imshow(FM2)
- Filtrez l’image affectée par un bruit additif par un filtre de la moyenne conique, dont le noyau est :
 0 0 1 0 0
 0 2 2 2 0
1 
M3   1 2 5 2 1
25  
 0 2 2 2 0
 0 0 1 0 0
>> FM3=uint8(filter2(M3,B1)); figure; imshow(FM3)
- Filtrez l’image affectée par un bruit additif par un filtre de la moyenne pyramidale, dont le noyau est :
 1 2 3 2 1
 2 4 6 4 2
1 
M4   3 6 9 6 3
81  
 2 4 6 4 2
 1 2 3 2 1 
>> FM4=uint8(filter2(M4,B1)); figure; imshow(FM4)

Page 8 / 21
- Comparez les résultats des filtrages et remplir le tableau par MAUVAIS, MOYEN ou BIEN en fonction
de l’effet du filtre sur le bruit :
Filtre de la moyenne Bruit additif
uniforme
circulaire
conique
pyramidale
- Pour introduire un bruit multiplicatif à l’image :
>> B2=imnoise(A2,'speckle'); figure; imshow(B2)
- Pour filtrer par un Wiener le bruit de l’image :
>> F22=wiener2(B2); figure; imshow(F22)
- Pour introduire un bruit impulsionnel à l’image :
>> B3=imnoise(A2,'salt & pepper'); figure; imshow(B3)
- Pour filtrer par un median le bruit de l’image :
>> F33=medfilt2(B3); figure; imshow(F33)
- Appliquez un filtre de la moyenne sur l’image affectée par un bruit multiplicatif (B2) :
>> F12=uint8(filter2(M,B2)); figure; imshow(F12)
- Appliquez un filtre de la moyenne sur l’image affectée par un bruit impulsionnel (B3) :
>> F13=uint8(filter2(M,B3)); figure; imshow(F13)
- Appliquez le filtre de Wiener sur l’image affectée par un bruit additif (B1) :
>> F21=wiener2(B1); figure; imshow(F21)
- Appliquez le filtre de Wiener sur l’image affectée par un bruit impulsionnel (B3) :
>> F23=wiener2(B3); figure; imshow(F23)
- Appliquez un filtre médian sur l’image affectée par un bruit additif (B1) :
>> F31=medfilt2(B1); figure; imshow(F31)
- Appliquez un filtre médian sur l’image affectée par un bruit multiplicatif (B2) :
>> F32=medfilt2(B2); figure; imshow(F32)
- Comparez les résultats des filtrages ; remplir le tableau par MAUVAIS, MOYEN ou BIEN en fonction
de l’effet du filtre sur le bruit :
Bruit additif Bruit multiplicatif Bruit impulsionnel
Filter de la moyenne
Filter de Wiener
Filter median

- Appliquez sur l’image affectée par un bruit additif (B1) un filtre morphologique érosion, dont l’élément
structurant est carré de rayon 1 :
>> SE=[1 1 1;1 1 1;1 1 1];
>> F41=imerode(B1,SE); figure; imshow(F41)
- Appliquez sur l’image affectée par un bruit additif (B1) un filtre morphologique dilation, dont l’élément
structurant est carré de rayon 1 :
>> SE=[1 1 1;1 1 1;1 1 1];
>> F42=imdilate(B1,SE); figure; imshow(F42)

Page 9 / 21
- Appliquez sur l’image affectée par un bruit additif (B1) un filtre morphologique ouverture, dont
l’élément structurant est carré de rayon 1 :
>> SE=[1 1 1;1 1 1;1 1 1];
>> F43=imopen(B1,SE); figure; imshow(F43)
- Appliquez sur l’image affectée par un bruit additif (B1) un filtre morphologique fermeture, dont
l’élément structurant est carré de rayon 1 :
>> SE=[1 1 1;1 1 1;1 1 1];
>> F44=imclose(B1,SE); figure; imshow(F44)
- Appliquez sur l’image affectée par un bruit impulsionnel (B3) les mêmes filtres morphologiques que
précédents : F51, F52, F53, F54
- Commentez les résultats

Page 10 / 21
TP5
Filtrage passe haut, détection de contours dans l’image et squelettisation

- Lecture et affichage de l’image :


>> A=imread(‘pears.png’);
>> figure; image(A); axis image; axis off
- Filtrage laplacien de l’image :
>> M=[0 1 0; 1 -4 1; 0 1 0];
>> F(:,:,1)=conv2(M,A(:,:,1));
>> F(:,:,2)=conv2(M,A(:,:,2));
>> F(:,:,3)=conv2(M,A(:,:,3));
>> figure; image(uint8(F)) ;axis image; axis off
- Filtrage laplacien de l’image avec un autre noyau :
>> M2=[1 1 1; 1 -8 1; 1 1 1];
>> F(:,:,1)=conv2(M2,A(:,:,1));
>> F(:,:,2)=conv2(M2,A(:,:,2));
>> F(:,:,3)=conv2(M2,A(:,:,3));
>> figure; image(uint8(F)) ;axis image; axis off
- Cas d’une image bruitée : B1=imnoise(A,’gaussian’,µb,b); or:
>> B1=uint8(double(A)+15*randn(size(A)));
>> figure; image(B1); axis image; axis off
>> F1(:,:,1)=conv2(M2,B1(:,:,1));
>> F1(:,:,2)=conv2(M2,B1(:,:,2));
>> F1(:,:,3)=conv2(M2,B1(:,:,3));
>> figure; image(uint8(F1)); axis image; axis off

Rehaussement de contraste des contours de l’image


- Convolution avec la fenêtre [[0 -1 0][-1 5 -1][0 -1 0]] :
>> M3=[0 -1 0; -1 5 -1; 0 -1 0];
>> F3(:,:,1)=conv2(M3,A(:,:,1));
>> F3(:,:,2)=conv2(M3,A(:,:,2));
>> F3(:,:,3)=conv2(M3,A(:,:,3));
>> figure; image(uint8(F3)); axis image; axis off

Page 11 / 21
TP6

- Lecture et affichage d’une autre image :


>> A2=imread('cameraman.tif'); figure; imshow(A2)
- Détection de contours par filtrage laplacian:
>> F41=uint8(filter2(M,A2)); figure; imshow(F41)
>> F42=uint8(filter2(M2,A2)); figure; imshow(F42)
- Détection de contours d’une image bruitée par filtrage laplacian:
>> B2=imnoise(A2,salt & pepper’); figure; imshow(B2)
>> F43=uint8(filter2(M,B2)); figure; imshow(F43)
>> F44=uint8(filter2(M2,B2)); figure; imshow(F44)
- Détection de contours par laplacian of gaussian :
>> F45=edge(A2,'log'); figure; imshow(F45)
- Détection de contours d’une image bruitée par laplacian of gaussian :
>> F46=edge(B2,'log'); figure; imshow(F46)
- Détection de contours par filtrage de Canny :
>> F51=edge(A2,'canny'); figure; imshow(F51)
- Détection de contours d’une image bruitée par filtrage de Canny :
>> F52=edge(B2,'canny'); figure; imshow(F52)

Proposez un filtrage morphologique pour faire une détection de contours de l’image A2.
Exemple :
FM1=filtrage dilatation (A2)
FM2=filtrage érosion (A2)
(détection de contours) = uint8(double(FM1)-double(FM2))

Squelettisation
- Squelettisation de l’image :
>> A3=im2bw(A2,mean2(A2)/255);
>> A4=imcomplement(A3);
>> F6=bwmorph(A4,'skel',Inf);
>> figure; imshow(F6)

Page 12 / 21
TP7
Rehaussement de contraste de l’image et égalisation de l’histogramme
- Lecture et affichage d’une image :
>> A=imread('cameraman.tif');
>> figure;subplot(2,2,1);imshow(A);subplot(2,2,2);imhist(A)
- Ajuster le contraste de l’image, pour ce cas c’est un éclaircissement (décalage vers le blanc) :
>> inl=0/255; inh=225/255; outl=50/255; outh=255/255; gamma=1;
>> A2=imadjust(A,[inl inh],[outl outh],gamma);
>> subplot(2,2,3);imshow(A2);subplot(2,2,4);imhist(A2)
- Interprétez l’histogramme de l’image traitée
- Un autre ajustement du contraste de l’image, pour ce cas c’est un éclaircissement (décalage vers le
blanc) :
>> inl=0/255; inh=255/255; outl=50/255; outh=255/255; gamma=1;
>> A21=imadjust(A,[inl inh],[outl outh],gamma);
>> subplot(2,2,3);imshow(A21);subplot(2,2,4);imhist(A21)
- Un autre ajustement du contraste de l’image, interprétez les images traitées et leurs histogrammes :
>> inl=50/255; inh=255/255; outl=0/255; outh=225/255; gamma=1;
>> A22= imadjust (A,[inl inh],[outl outh],gamma);
>> figure;subplot(2,2,1);imshow(A22);subplot(2,2,2);imhist(A22)
>> inl=0/255; inh=255/255; outl=50/255; outh=225/255; gamma=1;
>> A23= imadjust (A,[inl inh],[outl outh],gamma);
>> subplot(2,2,3);imshow(A23);subplot(2,2,4);imhist(A23)
- Un autre type d’ajustement du contraste de l’image est la technique de l’égalisation de l’histogramme :
>> A3=histeq(A);
>> figure;subplot(2,2,1);imshow(A);subplot(2,2,2);imhist(A)
>> subplot(2,2,3);imshow(A3);subplot(2,2,4);imhist(A3)
- Interprétez les images traitées et leurs histogrammes.
- Appliquez cette technique une deuxième fois mais sur l’image A2 :
>> A4=histeq(A2);
>> figure;subplot(2,2,1);imshow(A2);subplot(2,2,2);imhist(A)
>> subplot(2,2,3);imshow(A4);subplot(2,2,4);imhist(A4)
- Un autre type de rehaussement est l’accentuation des contours et des détails :
>> M=[0 -2 0;-2 9 -2;0 -2 0]
>> A5=uint8(filter2(M,A));figure;imshow(A5)
>> M=[0 -1 0;-1 5 -1;0 -1 0]
>> A6=uint8(filter2(M,A));figure;imshow(A6)
Utilisez un filtrage morphologique pour faire un rehaussement des détails et des contours :
Exemple : FM1=filtrage dilatation (A2)
FM2=filtrage érosion (A2)
F3=F1-F2 et A7=A2+F3

Page 13 / 21
Recap TP:1 - 7
Analysez le résultat de chaque ligne
>>A=imread('autumn.tif'); figure; imshow(A);title('image couleur')
>>A2=rgb2gray(A);figure;imshow(A2);title('image niveau de gris')
>>figure;imhist(A2);title('histogramme: niveau de gris')
>>A3=im2bw(A2,mean2(A2)/255);figure;imshow(A3);title('image binaire')
>>figure;imhist(A3);title('histogramme: binaire')
>>A4=imcomplement(A3);figure;imshow(A4);title('image binaire inverse')
>>figure;imhist(A4);title('histogramme: binaire inverse')
>>A5=rgb2hsv(A);figure;imshow(A5);title('image en HSV')
>>A6=rgb2ycbcr(A);figure;imshow(A6);title('image en YCbCr')
>>B1=imnoise(A2,'gaussian',0,0.004);figure;imshow(B1);title('bruit additif')
>>B2=imnoise(A2,'speckle',0.005);figure;imshow(B2);title('bruit multiplicatif')
>>B3=imnoise(A2,'salt & pepper');figure;imshow(B3);title('bruit impulsionnel')
>>F11=uint8(filter2(1/9*[1 1 1;1 1 1;1 1 1],B1));figure;imshow(F11);title('filtrage de la moyenne')
>>F12=uint8(filter2(1/9*[1 1 1;1 1 1;1 1 1],B2));figure;imshow(F12);title('filtrage de la moyenne')
>>F13=uint8(filter2(1/9*[1 1 1;1 1 1;1 1 1],B3));figure;imshow(F13);title('filtrage de la moyenne')
>>F21=uint8(filter2(1/16*[1 2 1;2 4 2;1 2 1],B1));figure;imshow(F21);title('filtrage moyenne pyramidale')
>>F22=uint8(filter2(1/16*[1 2 1;2 4 2;1 2 1],B2));figure;imshow(F22);title('filtrage moyenne pyramidale')
>>F23=uint8(filter2(1/16*[1 2 1;2 4 2;1 2 1],B3));figure;imshow(F23);title('filtrage moyenne pyramidale')
>>F31=wiener2(B1);figure;imshow(F31);title('filtrage de Wiener')
>>F32=wiener2(B2);figure;imshow(F32);title('filtrage de Wiener')
>>F33=wiener2(B3);figure;imshow(F33);title('filtrage de Wiener')
>>F41=medfilt2(B1);figure;imshow(F41);title('filtrage median')
>>F42=medfilt2(B2);figure;imshow(F42);title('filtrage median')
>>F43=medfilt2(B3);figure;imshow(F43);title('filtrage median')
>>F51=imopen(B1,strel('square',3));figure;imshow(F51);title('ouverture avec carre 3x3');
>>F52=imopen(B2,strel('square',3));figure;imshow(F52);title('ouverture avec carre 3x3');
>>F53=imopen(B3,strel('square',3));figure;imshow(F53);title('ouverture avec carre 3x3');
>>F61=imclose(B1,strel('square',3));figure;imshow(F61);title('fermeture avec carre 3x3');
>>F62=imclose(B2,strel('square',3));figure;imshow(F62);title('fermeture avec carre 3x3');
>>F63=imclose(B3,strel('square',3));figure;imshow(F63);title('fermeture avec carre 3x3');
>>F71=uint8(filter2(1/9*[1 1 1;1 3 1;1 1 1],B1));figure;imshow(F71);
>>F72=uint8(filter2(1/9*[1 1 1;1 3 1;1 1 1],B2));figure;imshow(F72);
>>F73=uint8(filter2(1/9*[1 1 1;1 3 1;1 1 1],B3));figure;imshow(F73);
>>F711=uint8(filter2(1/8*[1 1 1;1 -16/11 1;1 1 1],F71));figure;imshow(F711);title('F moyenne special')
>>F721=uint8(filter2(1/8*[1 1 1;1 -16/11 1;1 1 1],F72));figure;imshow(F721);title('F moyenne special')
>>F731=uint8(filter2(1/8*[1 1 1;1 -16/11 1;1 1 1],F73));figure;imshow(F731);title('F moyenne special')
>>A7=imread('eight.tif'); figure;imshow(A7);
>>A8=im2bw(A7,mean2(A7)/255);figure;imshow(A8);title('image binaire')
>>C1=uint8(filter2([0 1 0;1 -4 1;0 1 0],255*double(A8)));figure;imshow(C1);title('filtrage laplacien')
>>C2=edge(A8,'log');figure;imshow(C2);title('laplacian of gaussian')

Page 14 / 21
>>C3=edge(A8,'canny');figure;imshow(C3);title('filtrage de Canny')
>>FM1=imdilate(A8,strel('square',3));figure;imshow(FM1);title('dilatation avec carre 3x3')
>>FM2=imerode(A8, strel('square',3));figure;imshow(FM2);title('erosion avec carre 3x3')
>>C4=logical(double(FM1)-double(FM2));figure;imshow(C4);title('contour par morphologie')
>>FA=uint8(filter2([0 -1 0;-1 5 -1;0 -1 0],A7));figure;imshow(FA);title('accentuation des details')
>>A9=imcomplement(A8);figure;imshow(A9);title('image binaire inverse')
>>FM3=imdilate(A9,strel('disk',1));figure;imshow(FM3);title('dilatation avec un disque de rayon=1')
>>FM4=imerode(FM3,strel('disk',2));figure;imshow(FM4);title('erosion avec un disque de rayon=2')
>>C5=bwmorph(FM4,'skel',Inf);figure;imshow(C5);title('squelettisation')
>>A10=imread('pout.tif');figure;imshow(A10);
>>figure;imhist(A10)
>>A11=histeq(A10);figure;imshow(A11);title('egalisation de l histogramme')
>>A12=imadjust(A10,[50/255 250/255],[0 1],1);figure;imshow(A12)
>>figure;imhist(A12);title('ajustement de l histogramme')
>>A13=imadjust(A10,[75/255 160/255],[0 1],1);figure;imshow(A13)
>>figure;imhist(A13);title('ajustement de l histogramme')

Page 15 / 21
TP8
La segmentation de l’image

1) Segmentation d’images par l’histogramme d’homogénéité : Méthode basée sur les pics de
l’histogramme

Soit h l’histogramme d’une image 256 niveaux. L'algorithme de recherche des pics est le suivant:

 Trouver tous les pics : trouver l'ensemble des points qui sont des maxima locaux dans
l'histogramme : P0={(i,h(i)) | h(i)>h(i-1) et h(i)>h(i+1), 1<i<254}
 Trouver les pics les plus significatifs : Les points dans P 0 forment une nouvelle courbe.
L'opération de l'étape précédente est répétée sur cet ensemble. Nous obtenons donc:
P1={(pi,h(pi)) | h(pi)>h(pi-1) et h(pi)>h(pi+1), piP0}
 Seuillage : Cette étape se décompose en trois phases :

- La première consiste à enlever les petits pics. Plus précisément, tous les pics dont la
hauteur est inférieure à 5% de la hauteur du plus grand sont enlevés.
- Ensuite, si deux pics sont trop près l'un de l'autre, on ne retient que le plus grand. Les
auteurs considèrent que deux pics sont proches quand leur distance (i2-i1) est inférieure à 15
pixels.
- Si une vallée entre deux pics n'est pas assez prononcée, alors le pic le moins haut est
éliminé. Plus précisément, si p1 et p2 sont les deux pics considérés alors la valeur moyenne
havg entre ces deux points est :
3 p 2  p1 


pi 
p p
4 h (p i )
pi  2 1
h avg  4
p 2  p1  1
En introduisant la valeur : hmean= 1/2 (h(p2)+h(p1)) qui représente la "mi-hauteur"
des deux pics, on décide que la vallée n'est pas assez profonde lorsque (havg/hmean)>0.75 ; le
pic le moins haut est alors retiré.
>>A=imread('cameraman.tif'); figure; imshow(A)
>>pr=.05;
>>distmin=15;
>>valley=.75;
>>H=imhist(A);
>>figure; bar(1:256,H,.01); title('histogramme de l image');
>>P=0*H;
>>maxpic=max(H);
>>if H(1)>H(2), P(1)=H(1); end
>>if H(256)>H(255), P(256)=H(256); end
>>for r=2:255,if H(r)>H(r-1) & H(r)>H(r+1) & H(r)>pr*maxpic, P(r)=H(r); end,end
>>for r=1:256-distmin,for q=1:distmin,if P(r)>=P(r+q), P(r+q)=0; else P(r)=0; end,end,end
>>figure; bar(1:256,P,.01); title('élimination des faibles pics');
>>n=0;
>>for r=1:256,if P(r)~=0, n=n+1; indexp(n)=r; end,end

Page 16 / 21
>>[s,sizeindex]=size(indexp);
>>figure; bar(1:256,P,.01); title('élimination des pics très proches');
>>for r=1:sizeindex-1,havg=mean(H(indexp(r):indexp(r+1)));hmean=.5*(P(indexp(r))+P(indexp(r+1)));if
(havg/hmean)>valley,if P(indexp(r))<P(indexp(r+1)), P(indexp(r))=0;else P(indexp(r+1))=0;end,end,end
>>figure; bar(1:256,P,.01); title('élimination des pics dans les vallées non profondes');
>>n=0;
>>for r=1:256,if P(r)~=0, n=n+1; indexp(n)=r; end,end
>>[s,sizeindex]=size(indexp);
>>interv(1)=1;
>>for r=2:sizeindex,interv(r)=double(uint8((indexp(r)+indexp(r-1))/2));end
>>interv(sizeindex+1)=256;
>>S=zeros(size(A)); [M,N,C]=size(A);
>>for x=1:M,for y=1:N,for r=1:sizeindex,if A(x,y)>=interv(r) & A(x,y)<interv(r+1), S(x,y)=indexp(r);
end,end,end,end
>>S=uint8(S); figure; imshow(S)
>>figure; subplot(1,2,1); imshow(label2rgb(A)); subplot(1,2,2); imshow(label2rgb(S))

2) Segmentation d’images par régions : Méthode basée sur l’accroissement de régions

>>A=imread('cameraman.tif'); figure; imshow(A)


>>critere=20;
>>S=double(A); [M,N,C]=size(A);
>>x=1; for y=2:N, if abs(S(x,y)-S(x,y-1))<critere, S(x,y)=S(x,y-1); end, end
>>y=1; for x=2:M, if abs(S(x,y)-S(x-1,y))<critere, S(x,y)=S(x-1,y); end, end
>>y=N; for x=2:M, if abs(S(x,y)-S(x-1,y))<critere, S(x,y)=S(x-1,y); end, end
>>x=M; for y=2:N, if abs(S(x,y)-S(x,y-1))<critere, S(x,y)=S(x,y-1); end, end
>>for x=2:M-1, for y=2:N-1, d1=abs(S(x,y)-S(x,y-1)); d2=abs(S(x,y)-S(x-1,y)); d3=abs(S(x,y)-S(x-1,y-1));
d4=abs(S(x,y)-S(x-1,y+1)); if d1<critere & d1<=d2 & d1<=d3 & d1<=d4, S(x,y)=S(x,y-1); else if
d2<critere & d2<=d1 & d2<=d3 & d2<=d4, S(x,y)=S(x-1,y); else if d3<critere & d3<=d1 & d3<=d2 &
d3<=d4, S(x,y)=S(x-1,y-1); else if d4<critere & d4<=d1 & d4<=d2 & d4<=d3, S(x,y)=S(x-1,y+1); end,
end, end, end, end, end
>>S=uint8(S); figure; imshow(S)
>>figure; subplot(1,2,1); imshow(label2rgb(A)); subplot(1,2,2); imshow(label2rgb(S))

Page 17 / 21
TP9

Segmentation d’images par classification

clear all, close all,clc

A7=imread('eight.tif'); figure;imshow(A7);
NR=2; AS=A7; % nombre de régions est NR; l’image à segmenter est AS
[M,N,C]=size(AS); AS=double(AS);
for x=1:M, for y=1:N, R(x,y)=floor(x*y/M/N*(NR-1)+1.5); end, end
Rold=0*R;
while sum(sum(R-Rold))~=0, Rold=R; for r=1:NR, TMP=find(R==r); if size(TMP)==[0
1], end, CN(r)=median(AS(TMP)); end, for x=1:M, for y=1:N, for r=1:NR,
d(r)=uint8(abs(AS(x,y)-CN(r))); end, [V,I]=min(d); R(x,y)=I; end, end, end
S=zeros(size(AS)); for x=1:M, for y=1:N, S(x,y)=CN(R(x,y)); end, end, S=uint8(S);
figure; imshow(S); title('image segmentee par Kmeans')
figure; subplot(1,2,1); imshow(label2rgb(AS)); subplot(1,2,2); imshow(label2rgb(S))

A=double(A7);
nombregion=2;
[CN,U,obj]=fcm(A(:),nombregion,[2 100 1e-5 0]);
[M,N,C]=size(A);
for x=1:M, for y=1:N, [V,Id]=max(U(:,(y-1)*M+x)); R(x,y)=Id; end, end
S=zeros(size(A));
for x=1:M, for y=1:N, S(x,y)=CN(R(x,y)); end, end
S=uint8(S); figure; imshow(S); title('image segmentee par FCM')
figure; subplot(1,2,1); imshow(label2rgb(A)); subplot(1,2,2); imshow(label2rgb(S))

NR=3; AS=A7;
[M,N,C]=size(AS); AS=double(AS);
for x=1:M, for y=1:N, R(x,y)=floor(x*y/M/N*(NR-1)+1.5); end, end
Rold=0*R;
while sum(sum(R-Rold))~=0, Rold=R; for r=1:NR, TMP=find(R==r); if size(TMP)==[0
1], end, CN(r)=median(AS(TMP)); end, for x=1:M, for y=1:N, for r=1:NR,
d(r)=uint8(abs(AS(x,y)-CN(r))); end, [V,I]=min(d); R(x,y)=I; end, end, end
S=zeros(size(AS)); for x=1:M, for y=1:N, S(x,y)=CN(R(x,y)); end, end, S=uint8(S);
figure; imshow(S); title('image segmentee par Kmeans')
figure; subplot(1,2,1); imshow(label2rgb(AS)); subplot(1,2,2); imshow(label2rgb(S))

nombregion=3;
[CN,U,obj]=fcm(A(:),nombregion,[2 100 1e-5 0]);
[M,N,C]=size(A);
for x=1:M, for y=1:N, [V,Id]=max(U(:,(y-1)*M+x)); R(x,y)=Id; end, end
S=zeros(size(A));
for x=1:M, for y=1:N, S(x,y)=CN(R(x,y)); end, end
S=uint8(S); figure; imshow(S); title('image segmentee par FCM')
figure; subplot(1,2,1); imshow(label2rgb(A)); subplot(1,2,2); imshow(label2rgb(S))

Page 18 / 21
TP10

Segmentation d’images par classification

Méthode K-means
CREATION DE LA FONCTION: segkmeans
function S=segkmeans(A,NR)
% segmentation: S=segkmeans(image,nombre_de_regions) des images
% par la méthode de classification Kmeans
% par défaut nombre_de_regions=2
warning off MATLAB:divideByZero
warning off MATLAB:colon:operandsNotRealScalar
if nargin==1 | NR< 2, NR=2; end

[M,N,C]=size(A); A=double(A);
if C==3, S=km3(A,NR);
else S=km(A,NR);
end

% ------------------------------ km -----------------------------
function S=km(A,NR)
% détermination des régions selon la fonction Kmeans de MATLAB
% [D,CN]=kmeans(A(:),NR);
% [M,N,C]=size(A); A=double(A);
% for y=1:N, R(1:M,y)=D((y-1)*M+1:y*M); end
[M,N,C]=size(A);
A=double(A);
% initialisation de la matrice des régions : R
for x=1:M,
for y=1:N,
R(x,y)=floor(x*y/M/N*(NR-1)+1.5); % R(x,y)=floor(rand(1)*NR+1);
end
end

Rold=0*R;
while sum(sum(R-Rold))~=0,
Rold=R;
% calcul de la moyenne des intensités pour chaque région : C
for r=1:NR,
TMP=find(R==r);
if size(TMP)==[0 1], end
CN(r)=median(A(TMP));
end

% redistribution des appartenances des points aux différentes régions


for x=1:M,
for y=1:N,
for r=1:NR,
% distances du point traité par rapport aux centres des régions
d(r)=uint8(abs(A(x,y)-CN(r)));
end
[V,I]=min(d);
R(x,y)=I;
end
end
end
% S : segmentation de l'image selon la répartition des régions
S=zeros(size(A));
for x=1:M,

Page 19 / 21
for y=1:N,
S(x,y)=CN(R(x,y));
end
end
S=uint8(S);

% ------------------------------ km3 -----------------------------


function S=km3(A,NR)
% initialisation de la matrice des régions : R
[M,N,C]=size(A); A=double(A);
A1=A(:,:,1); A2=A(:,:,2); A3=A(:,:,3);
for x=1:M,
for y=1:N,
R(x,y)=floor(x*y/M/N*(NR-1)+1.5);
end
end

Rold=0*R;
while sum(sum(R-Rold))~=0,
Rold=R;
% calcul de la moyenne des intensités pour chaque région : C
for r=1:NR,
TMP=find(R==r);
CN(r,1)=median(A1(TMP)); CN(r,2)=median(A2(TMP));
CN(r,3)=median(A3(TMP));
end
d=uint8(255*ones([NR 1]));
% redistribution des appartenances des points aux différentes régions
for x=1:M,
for y=1:N,
for r=1:NR,
% distances du point traité par rapport aux centres des régions
% calcul de la distance euclidienne entre les composantes couleurs
d(r)=uint8(sqrt(1/3*((A(x,y,1)-CN(r,1))^2+(A(x,y,2)-CN(r,2))^2+
(A(x,y,3)-CN(r,3))^2)));
end
[V,I]=min(d); R(x,y)=I;
end
end
end
% S : segmentation de l'image selon la répartition des régions
S=zeros(size(A));
for x=1:M,
for y=1:N,
S(x,y,1)=CN(R(x,y),1); S(x,y,2)=CN(R(x,y),2); S(x,y,3)=CN(R(x,y),3);
end
end
S=uint8(S);

>> figure; subplot(1,2,1); imshow(label2rgb(A)); subplot(1,2,2); imshow(label2rgb(segkmeans(A,2)))


>> figure; subplot(1,2,1); imshow(label2rgb(A)); subplot(1,2,2); imshow(label2rgb(segkmeans(A,3)))

Page 20 / 21
Méthode basée sur la Classification Moyenne Floue

CREATION DE LA FONCTION: segfcm


function S=segfcm(A,NR)
% segmentation: Segmentée=segfcm(image,nombre_régions) des images
% par la méthode de classification fcm
% par défaut nombre_de_regions=2
warning off MATLAB:divideByZero
if nargin==1 | NR<2, NR=2; end

[M,N,C]=size(A); S=A;
if C==3, S(:,:,1)=f(A(:,:,1),NR);
S(:,:,2)=f(A(:,:,2),NR);
S(:,:,3)=f(A(:,:,3),NR);
elseif C==1, S=f(A,NR);
else disp('not possible');
end

% ---------------------- f -------------------------
function S=f(A,NR)
% détermination des régions selon la fonction fcm de MATLAB
[CN,U,obj]=fcm(double(A(:)),NR,[2 100 1e-5 0]);
[M,N,C]=size(A);
% redistribution des appartenances des points aux différentes régions
for x=1:M,
for y=1:N,
[V,Id]=max(U(:,(y-1)*M+x));
R(x,y)=Id;
end
end
% S : segmentation de l'image selon la répartition des régions
S=zeros(size(A));
for x=1:M,
for y=1:N,
S(x,y)=CN(R(x,y));
end
end
S=uint8(S);

>> figure; subplot(1,2,1); imshow(label2rgb(A)); subplot(1,2,2); imshow(label2rgb(segfcm(A,2)))


>> figure; subplot(1,2,1); imshow(label2rgb(A)); subplot(1,2,2); imshow(label2rgb(segfcm(A,3)))

Page 21 / 21

Vous aimerez peut-être aussi