B-TRAVAUX PRATIQUES DE SEGMENTATION
TP : FILTRAGE, REHAUSSEMENT DE CONTOURS ET SEGMENTATION
Ce TP a pour objectifs d’apprendre à :
Appliquer et analyser les résultats de plusieurs types de filtrage sur l’image
Appliquer différentes méthodes de seuillage et apprendre à interpréter les résultats
obtenus
Rehaussement de contours
1.1 Ra p pels de c o urs
Le but de la détection de contours est de repérer les points d’une image numérique qui
correspondent à un changement brutal de l’intensité lumineuse. Ces changements de
propriétés de l’image traduisent en général des évènements importants ou des formes qu’il
est important de détecter. Certaines méthodes de détection de contours utilisent des filtres
(linéaires ou pas), qui vont permettre de mettre en évidence les contours : on appelle cette
tâche le rehaussement de contours.
Nous allons étudier ici le problème du rehaussement des contours grâce au filtrage
linéaire. Ces filtres sont définis par leur masque h(m, n) de taille Mh × Nh. Les filtres
rehausseurs de contours sont des passe-bande ou des passe-haut, c’est-`a-dire qu’ils laissent les
moyennes ou les hautes fréquences presque inchangées et qu’ils atténuent les basses fréquences.
Ces filtres vont être conçus pour mettre en évidence des changements brutaux d’amplitude dans
une direction donnée. Nous allons considérer deux types de filtres :
• Les filtres du premier ordre (gradient et Sobel) basés sur un calcul de dérivée. Les
contours (dans la direction définie par le masque) sont visibles dans l’image filtrée car ils
correspondent aux pixels ayant des amplitudes élevées (en valeur absolue)
• Les filtres du second ordre (laplacien et LOG) sont basés sur un calcul de dérivée seconde.
Cette fois-ci, les contours correspondent dans l’image filtrée à des transitions entre des
valeurs négatives et positives.
Certains filtres vont produire des amplitudes élevées pour les changements foncé vers clair,
d’autres pour les changements clair vers foncé, et d’autres pour les deux types de
changements. Attention, même si l’image originelle prend des valeurs entre 0 et 1, l ’image
filtrée peut comporter des coefficients négatifs ou supérieurs à 1. Il faudra donc souvent
retraiter l’image filtrée avant de l’afficher (par exemple en en prenant la valeur absolue, ou
en utilisant la commande mat2gray).
1.2 Etude sous MATLAB
1. Créer une image X de taille 256 × 256 représentant un carré gris clair sur un fond gris foncé.
Le carré se situera vers le milieu de l’image.
2. Filtres gradients.
1
h1 = [1 −1] h2 = [ ]
−1
1
(a ) Appliquer le filtre de masque h1 et stocker l’image filtrée dans la matrice Y1. Afficher sur
la même figure X, mat2gray(abs(Y1)) et mat2gray(Y1). Dans quelle direction ce filtre
rehausse-t-il les con- tours ? Est-il sensible aux transitions clair/foncé, foncé/clair ou aux
deux ?
(b) Appliquer le filtre de masque h2 et stocker l’image filtrée dans la matrice Y1. Afficher sur
la même figure X, mat2gray(abs(Y2)) et mat2gray(Y2). Dans quelle direction ce filtre
rehausse-t-il les con- tours ? Est-il sensible aux transitions clair/foncé, foncé/clair ou aux
deux ?
3. F iltres de Sobel.
1 0 −1 2 1 0 1 2 1 0 1 2
h3 = [ 2 0 − 2] h4 = [ 1 0 −1 ] h5 = [ 0 0 0 ] h6 = [ −1 0 1]
1 0 −1 0 −1 −2 −1 −2 −1 −2 −1 0
(a ) Appliquer le filtre de masque h3 et stocker l’image filtrée dans la matrice Y3. Afficher sur
la même
figure X, mat2gray(abs(Y3)) et mat2gray(Y3). Dans quelle direction ce filtre rehausse-t-il
les contours ? Est-il sensible aux transitions clair/foncé, foncé/clair ou aux deux ?
Comparer les résultats avec ceux du filtre h1.
(b) Appliquer le filtre de masque h4 et stocker l’image filtrée dans la matrice Y4. Afficher sur
la même figure X, mat2gray(abs(Y4)) et mat2gray(Y4). Dans quelle direction ce filtre
rehausse-t-il les con- tours ? Est-il sensible aux transitions clair/foncé, foncé/clair ou aux
deux ?
(c) Appliquer le filtre de masque h5 et stocker l’image filtrée dans la matrice Y5. Afficher sur
la même figure X, mat2gray(abs(Y5)) et mat2gray(Y5). Dans quelle direction ce filtre
rehausse-t-il les con- tours ? Est-il sensible aux transitions clair/foncé, foncé/clair ou aux
deux ? Comparer les résultats avec ceux du filtre h2.
2
(d ) Appliquer le filtre de masque h6 et stocker l’image filtrée dans la matrice Y6. Afficher sur
la même figure X, mat2gray(abs(Y6)) et mat2gray(Y6). Dans quelle direction ce filtre
rehausse-t-il les con- tours ? Est-il sensible aux transitions clair/foncé, foncé/clair ou aux
deux ?
4. F iltre laplacien.
0 1 0
1
h7 = [ 1 −4 1]
8
0 1 0
(a ) Appliquer le filtre de masque h7 et stocker l’image filtrée dans la matrice Y7. Afficher sur la
même figure X, mat2gray(abs(Y7)) et mat2gray(Y7). Dans quelle direction ce filtre
rehausse-t-il les contours ?
5. F ilt r e LOG.
Le filtre de Marr et Hildreth, aussi appelé LOG pour Laplacien du[Of] Gaussien, est très
utilisé pour détecter les contours car il permet de résoudre certains problèmes
rencontrés avec le filtre laplacien. En effet, le filtre laplacien réalise une double dérivation,
qui est extrêmement sensible au bruit. L’idée est donc d’appliquer le laplacien non pas
directement sur l’image, mais sur une image déjà filtrée par un filtre Gaussien (donc
potentiellement débruitée). Le filtre LOG dépend donc d’un paramètre σ qui est l’écart-
type du filtre Gaussien appliqué en prétraitement. On choisit σ de façon `à réduire l’effet
nuisible dû au bruit.
Pour construire le masque d’un filtre LOG, on utilise comme d’’habitude la fonction fspecial de
MATLAB :
h = fspecial('log',[5 5],1); % Filtre LOG de taille 5 x 5 et d'ecart type 1
Appliquer un filtre LOG de taille 15 × 15 et d’écart-type σ = 1 (dont on stockera le masque dans
h8) et stocker l’image filtrée dans la matrice Y8. Afficher sur la même figure X,
mat2gray(abs(Y8)) et mat2gray(Y8). Dans quelle direction ce filtre rehausse-t-il les contours ?
(a ) Faire varier la valeur de σ et commenter.
(b) Comparer les résultats du filtre laplacien et du filtre LOG.
6. Relancer tout votre script, en définissant cette fois-ci X comme l’image [Link]
renormalisée. Commenter les résultats obtenus.
7 . Appliquer pour chacun des filtres définis ci-dessus, la commande AffichageFiltrage(X,h)pour
afficher les spectres de l’image originelle, de l’image filtrée ainsi que la réponse en fréquence
du filtre. Commenter les réponses fréquentielles des différents filtres. Attention, l’image
filtrée présentée ici n’est pas retraitée (pas de valeur absolue ni de mat2gray), ce qui
explique que tous les coefficients négatifs soient mis à 0 (noir), et que tous les coefficients
supérieur à 1 soient mis à 1 (blanc).
3
La fonction AffichageFiltrage(X,h) fournie réalise les étapes suivantes :
• Prend en entrée une image renormalisée X, et un masque de convolution h
• Calcule l’image filtrée Y
• Affiche sur la même image, de gauche à droite et de haut en bas :
• L’image originelle (en haut à gauche)
• Le spectre de l’image originelle en échelle linéair e (en haut au milieu
gauche)
• Le spectre de l’image filtrée en échelle linéaire (en haut au milieu
droit)
• La réponse en fréquence du filtre en échelle linéaire (en haut à droite)
• L’image filtrée (en bas à gauche)
• Le spectre de l’image originelle en échelle logarithmique (en bas au
milieu gauche)
• Le spectre de l’image filtrée en échelle logarithmique (en bas au milieu
droit)
• La réponse en fréquence du filtre en échelle logarithmique (en bas à
droite)
2 Segmentation d’image
La segmentation d’image est une opération de traitement d’images qui a pour but de rassembler
des pixels entre eux suivant des critères prédéfinis. Les pixels sont ainsi regroupés en régions, qui
constituent un pavage ou une partition de l’image. Il peut s’agir par exemple de séparer les
objets du fond. Il existe de nombreux types de méthodes de segmentation d’image : certaines
sont basées sur les contours, d’autres sur un seuillage des pixels en fonction de leur intensité,
d’autres découpent l’image en régions connexes, etc....
Nous allons ici considérer une image composée de pièces de monnaie sur un fond relativement
uniforme, et tenter de segmenter cette image avec différentes techniques.
4
2.1 S egmentation par seuillage d e valeurs
Nous allons dans un premier temps réaliser une segmentation grâce à un seuillage des valeurs des
pixels. Notre but ici est que les pièces apparaissent en blanc et que le fond devienne noir. Nous
allons donc créer une image binaire booléenne, composée uniquement de 0 et de 1. Nous allons
donc définir deux seuils Tmin et Tmax : tous les pixels dont la valeur sera comprise entre Tmin
et Tmax seront mis `a 1 (blanc), tandis que tous les autres seront mis `a 0 (noir). La question
restante est donc : comment choisir ces seuils ?
1. Ouvrir l’image [Link], la stocker dans une matrice X et la renormaliser. Afficher l’image.
2. Tracer l’histogramme de l’image (avec un pas de 0.001) et identifier les différents pics de
l’histogramme. Quelles sont les zones correspondant au fond ? aux pièces ?
Pour calculer et tracer un histogramme d’une image renormalisée sous MATLAB, on
peut utiliser :
bins = 0:0.001:1; % Liste des niveaux de gris que l'on veut considerer
[h]=hist(X(:),bins); % Cree l'histogramme pour les niveaux definis dans le vecteur bin s
bar(bins,h); % Trace l'histogramme sous forme de barres
3. En observant l’histogramme, déterminer les seuils Tmin et Tmax à utiliser.
4. Créer une image binaire booléenne X bin de même taille que X, valant 1 pour les pixels de X
compris entre Tmin et Tmax et 0 sinon. La zone correspondant au fond sera donc noire, et les
zones correspondant aux pièces seront blanches. Afficher X et X bin sur la même figure.
Pour créer une matrice booléenne sous MATLAB, il suffit d’écrire une condition portant
sur une matrice : tous les pixels pour lesquels cette condition est vraie seront mis à 1, et
tous les autres à 0.
X bin = (X>0.1);
% X bin a la meme taille que X : tous les pixels de X superieurs a 0.1
% sont mis a 1 dans X bin, les autres sont mis a 0 X
bin= (X>0.1 & X<0.3);
% X bin a la meme taille que X : tous les pixels de X compris entre 0.1 et 0.3
% sont mis a 1 dans X bin, les autres sont mis a 0
5. Tester plusieurs valeurs de Tmin et Tmax jusqu’à avoir une segmentation de bonne qualité.
6. Si il reste des points isolés qui ne sont pas de la bonne couleur, nous pouvons essayer
d’appliquer un filtrage médian sur l’image X bin grâce à la commande medfilt2 (comme nous
avions fait pour du bruit poivre et sel). Réaliser cette opération : vous devriez obtenir une
segmentation parfaite.
2.2 S egmentation p ar d étection d e contours
Nous allons maintenant essayer de réaliser une autre segmentation qui va se baser non pas sur
les valeurs des pixels, mais sur une détection de contours. Nous n’allons donc pas travailler sur
l’image originelle, mais sur une image filtrée ayant des contours rehaussés. Nous allons définir un
seuil T : tous les pixels de l’image rehaussée dont la valeur est supérieure à T seront mis à 1,
tandis que tous les autres seront mis `a 0. Les contours des pièces seront donc en blanc et le
reste en noir.
1. Ouvrir l’image [Link], la stocker dans une matrice X et la renormaliser.
2. Calculer les images Y1 et Y2 correspondant au filtrage de X respectivement par les masques
h1 et h2. Calculer Y=sqrt(abs(Y1).^2+abs(Y2).^2) (pseudo-gradient). Afficher Y en utilisant
mat2gray.
5
3. Tracer l’histogramme de Y (avec un pas de 0.001) afin de déterminer le seuil T à utiliser.
4. Créer une image Y_bin de même taille que Y valant 1 pour les pixels de Y supérieurs `a T et
0 sinon. Les contours des pièces seront donc blancs et tout le reste de l’image sera
noir. Afficher X et Y bin sur la même figure.
5. Tester plusieurs valeurs de T jusqu’à voir apparaître tous les contours des pièces.
6
2 . 3 F usion d es d eux m éthodes
Nous avons étudié deux méthodes de segmentation : la première méthode nous a permis de
faire une image noire avec les pièces de couleur blanche, alors que la deuxième nous a permis de
trouver les contours des pièces. En revanche la deuxième méthode a donné de moins bons
résultats : alors comment obtenir des contours de pièces de bonne qualité ? Une des façon
de résoudre le problème est de fusionner les résultats. Au lieu de détecter les contours sur
l’image originelle, nous allons détecter les contours sur l’image déjà segmentée par la première
méthode.
1. Ouvrir l’image [Link], la stocker dans une matrice X et la renormaliser.
2. Reprendre les commandes MATLAB pour générer l’image segmentée finale X_bin dela partie
segmentation par seuillage
3. Reprendre les commandes MATLAB pour générer l’image segmentée finale Y_bin de la partie
segmentation du contour, mais en prenant en entrée l’image X_bin convertie en double (et
non l’image Y).
4. Afficher sur une même figure X et Y_bin : le résultat doit être parfait
2 . 4 D écomposition Q uadTree p our la segmentation
La décomposition QuadTree permet de représenter une image sous forme de blocs cohérents
(souvent carrés), qui peuvent ensuite être fusionnés pour former une segmentation (approche split
& merge). L’idée est la suivante : on part en général d’une image originelle de taille carrée
dont la taille est une puissance de 2 (on rajoute si besoin des pixels supplémentaires si ce
n’est pas le cas). On divise l’image en 4 carrés et on regarde si chacun des carrés formés est
homogène (selon un critère à déterminer). Si le carré considéré est homogène, on passe au
carré suivant. Si le carré considéré n’est pas homogène, on le re-divise en 4 carrés plus petits
et on étudie l’homogénéité de chacun des 4 petits carrés ainsi formés. Le processus est réitéré
jusqu’à ce que tous les carrés soient homogènes, ou que les carrés atteignent une taille
suffisamment petite (par exemple 2 × 2).
Cet algorithme de décomposition prend donc en entrée deux paramètres : la taille
minimale d’un carré (critère d’arrêt), et un critère d’homogénéité. On peut par exemple décider
qu’un carré est homogène si l’écart type des pixels le composant est inférieur à un seuil. On peut
également s’intéresser à l’écart entre le pixel ayant la valeur la plus élevé et le pixel ayant la valeur la
plus faible, et décider que le carré est homogène si cet écart ne dépasse pas un seuil.
Une fois cette décomposition réalisée (phase split ), la segmentation consiste à fusionner
(phase merge) les carrés qui se ressemblent afin de former une segmentation.
La fonction splitmerge.m fournie réalise ces deux étapes et montre d’une part la décomposition
en carrés qui a été faite, et d’autre part la segmentation effectuée.
1. Ouvrir l’image [Link], la stocker dans une matrice X et la renormaliser.
2. Tester la fonction splitmerge.m sur l’image X, en choisissant une taille minimale de 2 pixels, et le
critère d’homogénéité par défaut.
Pour lancer la fonction splitmerge.m on utilisera les commandes suivantes :
taille min=2;
splitmerge(X,taille min,@predicate);
La fonction predicate.m contient le critère définissant la condition pour qu’u n carré soit subdivisé.
Un exemple est proposé par défaut, mais vous pouvez essayer de faire varier ce critère.
3. Faire varier le critère d’homogénéité dans la fonction predicate.m et commenter les résultats.