TP5 Segmentation D'images
TP5 Segmentation D'images
TP5 Segmentation D'images
Manipulation
1. Lire l'image 'medtest.png', affectez-la à la variable I, puis afficher-là.
2. Afficher son histogramme. Distinguer les zones séparables sur histogramme.
3. calculer un seuil de segmentation (𝑁 = 1)
1
4. segmenter l'image I, pour obtenir la matrice Is.
ouvrir la matrice Is, et vérifier que son contenu est formé de 0 et 1
Afficher le résultat de segmentation
5. calculer deux seuils de segmentation (𝑁 = 2)
6. segmenter l'image I, pour obtenir la matrice étiquette Is,
ouvrir la matrice Is, et vérifier que son contenu est formé de 0, 1 et 2
convertissez-la en une image couleur
Afficher le résultat de segmentation
commenter
7. Refaire la question 6. pour 𝑁 = 3, puis 4
Manipulation
2
3. Appliquer l'algorithme de croissance de région, pour segmenter une région d'écart type 0.2,
autour de ce germe-là. Vous obtiendrez une image (matrice) d'étiquettes 𝐽, qu'on appellera
image segmentée.
4. Afficher l'image segmentée sur l'image initiale
figure, imshow(I+J);
5. Essayez à présent de segmenter une région dont vous sélectionnerez le germe au moyen de la
souris.
6. Variez l'écart type 0.2, 0.3 ou 0.4. Commenter.
7. On voudrait à présent segmenter 4 régions, suivant les étapes suivantes :
a) lire l'image 'medtest.png' et affecter-là à I, puis afficher dans la figure (3)
b) initialiser la matrice des étiquettes à 0: Js=zeros(size(I));
c) effectuer une boucle pour i=1:4 (4 est le nombre des régions)
1. afficher la figure (3)
2. sélectionner un germe avec la souris
3. segmenter la région J autour du germe pour un écart type 0.2 (ou 0.3 ou 0.4 ou ...)
4. Additionner la région segmentée à la matrice des étiquettes, après l'avoir étiquetée
(à i, par exemple) : Js=Js+J*i;
5. convertir la matrice des étiquettes en une image couleur, puis afficher dans la
figure(4)
6. effectuer une pause avant de passer à la prochaine itération : pause;
Commenter les résultats.
Est-ce que l'algorithme converge toujours?
Commandes Matlab:
Permet de classer les points du vecteur X en k classes
Idx : résultat de la classification, vecteur des étiquettes (label
vector)
o Idx est de la même taille que X.
[idx,C] = kmeans(X,k); o L'étiquette (classification) de chaque point de X d'indice i,
est contenue dans Idx au même indice i.
o Les valeurs possibles de Idx sont les valeurs des étiquettes
(classes) : 1, 2, 3, ..., k.
C : un vecteur de taille (𝟏 × 𝒌), il contient les k-centres des
classes.
Manipulation:
1. Lire et afficher l’image à niveau de gris ‘medtest.png’, affecter-la à la variable I
2. Réarranger les pixels de I en une seule colonne II
3. appliquer l'algorthme des k-means pour classer les points de II, en 2 régions. Vous obtiendrez le
vecteur des étiquettes (idx) et les centres des classes (C)
quelles sont les centres des régions.
4. Réarranger le vecteur des étiquettes idx, en une matrice Is, puis afficher-la.
Observer les 2 régions
5. changer le nombre de classes (régions) à 3 puis à 4.
commenter.
C'est une méthode qui vise d'abord à diviser l'image en régions homogènes selon un certain
critère (prédicat)
Puis opère à fusionner les régions obtenues et qui sont semblables selon ce même prédicat, en
une seule région
Commandes Matlab:
Permet de segmenter l'image I par la méthode de division/fusion.
a: est la taille minimal des blocs d'image lors de l'opération de
J = splitmerge(I, a,
@predicate);
division. C'est un nombre 2 puissance : 1, 2, 4, 8, 16, ...
@predicate : est une fonction qui contient les critères de
divion/fusion
la matrice obtenue J est une matrice d'étiquettes.
Fonctions Matlab:
function flag = predicate(region) Aller dans la fonction "predicate" et changer les
sd = std2(region); paramètres suivant par les valeurs voulues :
m = mean2(region); ecart_type : ecart type de la région à
ecart_type = 20; %%%
val_min = 0; %%% segmenter
val_max = 200; %%% val_min : vleur minimale du niveau de gris
flag = (sd > ecart_type) ... dans la région à segmenter
& (m > val_min) & (m < val_max); val_max : valeur maximal du niveau de gris
dans la région à segmenter
4
Manipulation:
1. Lire et afficher l’image à niveau de gris ‘medtest.png’, affecter-la à la variable I
2. Appliquer l'algorithme de division/fusion,
en divisant l'image en des blocs, de taille minimale 2
selon les prédicats :
o écart type = 20
o valeur de gris minimale = 0
o valeur de gris maximale = 200
Afficher le résultat de la segmentation
commenter
3. Changer la taille minimale de division : 2 , 2 , 2 , 2
commenter
4. Pour une taille minimale de division = 2 , changer les valeurs des prédicats, et commenter.
5
seuillage d'histogramme
I =imread('medtest.png');
imshow(I);figure, imhist(I);
thres = multithresh(I,4);
Is = imquantize(I, thres);
Irgb = label2rgb(Is);
figure;
imshow(Irgb)
k-means
I = imread('medtest.png');
II=im2col(I,size(I));
[idx,C] = kmeans(II,4);
Is=col2im(idx,[1, 1],size(I));
Is=label2rgb(Is);
'growing_region'
% cas1
I = im2double(imread('medtest.png'));
x=198; y=359;
J = regiongrowing(I,x,y,0.2);
figure, imshow(I+J);
% cas2
[x, y] = getpts; x=uint8(x); y=uint8(y);
J1 = regiongrowing(I,x,y,0.2);
figure, imshow(I+J+J1);
% cas 3
figure(3), imshow(I);
Js=zeros(size(I)); %image segmentée initiale à 0
for i=1:4
figure(3)
[x, y] = getpts; x=uint8(x); y=uint8(y);
sig=0.4; %écart type = 0.2; 0.3; 0.4, ... ;
J = regiongrowing(I,x,y,sig);
Js=Js+J*i; %étiqueter la région segmentée J avec i
Js_rgb=label2rgb(Js);
figure(4), imshow(Js_rgb));
pause,
end
Division/fusion
I = (imread('medtest.png'));
J = splitmerge(I, 2^2, @predicate);
Jrgb=label2rgb(J);
figure, imshow(Jrgb);