TP5 — Segmentation d'images | Computer Vision 2EET | 2MIQ
TRAVAUX PRATIQUES N°5
Segmentation d'images
Module : Computer Vision | Séance 5 | Durée estimée : 2h
🎯 Objectifs du TP5
À l'issue de ce TP, vous serez capable de :
Appliquer le seuillage fixe, Otsu et adaptatif pour binariser une image
Segmenter une image par couleur dans l'espace HSV
Extraire et analyser les contours d'une image binaire
Appliquer le clustering K-Means pour quantifier les couleurs d'une image
Rappels : Fonctions clés
Les fonctions suivantes seront utilisées dans ce TP.
Fonction Rôle Paramètres clés
thresh : valeur de seuil
threshold(src, dst, thresh, Seuillage fixe ou maxVal : valeur maximale assignée
maxVal, type) Otsu type = type de seuillage (THRESH_BINARY,
THRESH_OTSU, …)
method: méthode de seuillage
adaptiveThreshold(src, dst, (ADAPTIVE_THRESH_MEAN_C,
maxVal, method, type, blockSize, Seuillage ADAPTIVE_THRESH_GAUSSIAN_C), blockSize
C) adaptatif local : taille de voisinage, C : constante
soustraite du seuil (seuil =
moyenne_locale – C)
cvtColor(src, hsv, COLOR_BGR2HSV)
Conversion BGR H∈[0,179], S/V∈[0,255] en OpenCV
→ HSV
inRange(hsv, low, high, mask)
Masque binaire mask = 255 si dans plage [low, high], 0
par plage HSV sinon
Appliquer un
bitwise_and(src, src, dst, mask) masque sur une dst = src là où mask=255
image
bitwise_or(mask1, mask2, dst)
Combiner deux Pour la couleur rouge (2 plages HSV)
masques
hierarchy : relations entre contours,
Extraire les mode : mode de récupération de contours
findContours (bin, contours,
hierarchy, mode, method) contours d'une (RETR_EXTERNAL,RETR_TREE),method :
image binaire approximation des contours
(CHAIN_APPROX_NONE,CHAIN_APPROX_SIMPLE)
i : indice du contour (i = -1 pour tous),
Dessiner les color : couleur du dessin du contour,
drawContours(img, contours, i,
color, thickness, lineType) contours thickness : épaisseur de ligne (=-1 pour
détectés remplir le contour), lineType : type de
ligne (LINE_8, LINE_AA, …)
Aire (px²) et Utiliser pour filtrer les petits bruits
contourArea(c) / arcLength(c,true) périmètre d'un (éliminer les petits artefacts dus au
contour bruit)
Rectangle
Moments M = moments(c) ;
englobant / Centre de masse d’un contour c :
boundingRect(c) / moments(c) Informations Point centre(M.m10/M.m00, M.m01/M.m00);
géométriques
d’un contour
Enseignante : Amel Tilouche Page 1
TP5 — Segmentation d'images | Computer Vision 2EET | 2MIQ
Fonction Rôle Paramètres clés
pixels : ensemble de points en format
CV_32F, bestLabels : étiquette de
cluster pour chaque point, criteria :
Kmeans (pixels, k, bestLabels, condition d’arrêt, attempts : nombre de
criteria, attempts, flags,
Clustering K- réinitialisation de K-Means avec
centers) Means sur les différents centres initiaux, flags :
pixels méthode d’initialisation des centres
(KMEANS_RANDOM_CENTERS,
KMEANS_PP_CENTERS,
KMEANS_USE_INITIAL_LABELS), centers :
centres finaux des clusters
morphologyEx(bin, dst, op, k)
Nettoyage
op: opération morphologique MORPH_OPEN
morphologique puis MORPH_CLOSE
post-binarisation
Partie 1 : Seuillage
Mise en contexte
Le seuillage est la méthode de segmentation la plus simple : chaque pixel est classé en objet
(255) ou fond (0) selon qu'il dépasse un seuil T. La méthode d'Otsu calcule automatiquement le
seuil optimal en maximisant la séparation entre les deux classes. Le seuillage adaptatif calcule
un seuil local pour chaque bloc de pixels, adapté aux variations d'éclairage.
Exercice 1 : Seuillage — fixe, Otsu et adaptatif
1. Créez un projet VS nommé TP5_Exercice1
2. Chargez une image en couleur et convertissez-la en niveaux de gris
3. Appliquez un pré-lissage gaussien pour réduire le bruit
4. Appliquez le seuillage binaire fixe avec T=127
5. Appliquez le seuillage d’Otsu binaire et affichez le seuil T calculé
6. Appliquez le seuillage adaptatif gaussien (blockSize=11, C=2)
7. Testez l'effet d'un éclairage non uniforme : comparez Otsu vs adaptatif sur une image
avec ombre
8. Affichez et sauvegardez les 3 résultats
Condition d'application de la méthode d'Otsu
La méthode d'Otsu est optimale uniquement si l'histogramme de l'image présente deux pics bien séparés
(distribution bimodale : un pic pour le fond, un pour les objets). Sur des images avec éclairage variable
ou histogramme plat, le seuil adaptatif donne de meilleurs résultats.
N° Question Réponse
Quelle est la valeur du seuil T calculé par Otsu sur votre image ?
1
Est-elle cohérente avec ce que vous observez sur l'histogramme ?
Comparez le résultat du seuillage fixe (T=127) et du seuil Otsu.
2
Dans quel cas le seuillage fixe est-il suffisant ?
Sur une image avec éclairage non uniforme (ombre d'un côté),
3 quelle méthode donne les meilleurs résultats entre Otsu et le
seuillage adaptatif ? Pourquoi ?
Quel est l'effet du nettoyage morphologique (MORPH_OPEN +
4 MORPH_CLOSE) sur l'image binarisée ? Que suppriment ces
opérations ?
Enseignante : Amel Tilouche Page 2
TP5 — Segmentation d'images | Computer Vision 2EET | 2MIQ
Partie 2 : Segmentation par Couleur
Mise en contexte
La segmentation par couleur isole des objets selon leur teinte dans l'espace HSV. Contrairement
à BGR, la teinte (H) est indépendante de la luminosité, ce qui rend la détection plus robuste aux
variations d'éclairage. La fonction inRange() crée un masque binaire que l'on applique ensuite
avec bitwise_and().
Couleur Borne inférieure Borne supérieure Remarque
Combiner avec
Rouge (0, 120, 70) (10, 255, 255)
(170,120,70)→(180,255,255)
Vert (36, 100, 100) (86, 255, 255) Plage unique
Bleu (100, 150, 50) (130, 255, 255) Plage unique
Jaune (20, 100, 100) (35, 255, 255) Plage unique
Orange (10, 120, 70) (20, 255, 255) Entre rouge et jaune
Exercice 2 : Seuillage — fixe, Otsu et adaptatif
1. Créez un projet VS nommé TP5_Exercice2
2. Chargez une image couleur contenant au moins un objet d'une couleur distinctive
3. Convertissez l'image en HSV
4. Créez un masque pour isoler une couleur de votre choix
5. Appliquez le masque sur l'image pour obtenir l'objet isolé
6. Nettoyez le masque avec morphologyEx() (MORPH_OPEN puis MORPH_CLOSE)
7. Testez avec la couleur rouge
8. Affichez le masque binaire, l'objet isolé et l'image nettoyée
Plages HSV en OpenCV
En OpenCV, la teinte H est dans [0, 179] (et non [0°, 360°] comme dans le standard). La saturation S et
la valeur V sont dans [0, 255]. Une valeur S trop basse (<50) correspond à des couleurs grises/blanches.
Une valeur V trop basse (<50) correspond à des couleurs très sombres.
N° Question Réponse
Pourquoi utilise-t-on l'espace HSV plutôt que BGR pour la
1
segmentation par couleur ?
Que représente un pixel blanc dans le masque binaire ? Que
2
représente un pixel noir ?
Que se passe-t-il si vous élargissez les bornes inRange() ? Et
3
si vous les réduisez trop ?
Pourquoi la couleur rouge nécessite-t-elle deux masques
4
combinés avec bitwise_or() ?
Enseignante : Amel Tilouche Page 3
TP5 — Segmentation d'images | Computer Vision 2EET | 2MIQ
Partie 3 : Analyse des Contours
Mise en contexte
Après binarisation, findContours() extrait les frontières des régions. On peut ensuite analyser
chaque contour : calculer son aire, son périmètre, son rectangle englobant ou son centre de
masse. Un filtrage par aire permet d'éliminer les petits artefacts dus au bruit.
Paramètres de findContours()
• RETR_EXTERNAL : retourne uniquement les contours les plus externes (ignore les trous)
• RETR_TREE : retourne tous les contours avec leur hiérarchie complète (contours imbriqués)
• CHAIN_APPROX_SIMPLE : compresse les segments horizontaux/verticaux — réduit les points
stockés
• CHAIN_APPROX_NONE : conserve tous les points du contour (plus de mémoire)
Exercice 3 : findContours() — extraction et analyse des objets
1. Créez un projet VS nommé TP5_Exercice3
2. Chargez une image contenant plusieurs objets distincts
3. Binarisez avec le seuil Otsu puis nettoyez avec morphologyEx()
4. Extrayez les contours (RETR_EXTERNAL, CHAIN_APPROX_SIMPLE)
5. Filtrez les contours dont l'aire est inférieure à 500 pixels²
6. Pour chaque contour valide : dessinez le contour (vert), le rectangle englobant (rouge)
et le centre de masse (bleu)
7. Affichez le nombre d'objets détectés dans la console et calculez l'aire de chaque objet
8. Affichez et sauvegardez l'image annotée
N° Question Réponse
Combien de contours findContours() détecte-t-il avant filtrage
1
? Et après filtrage par aire (> 500 px²) ?
Que se passe-t-il si vous remplacez RETR_EXTERNAL par
2 RETR_TREE ? Observez-vous des contours supplémentaires
à l'intérieur des objets ?
Quel est l'effet du nettoyage morphologique (OPEN + CLOSE)
3
sur le nombre de contours détectés ?
Comment pourriez-vous calculer la circularité d'un contour ?
4
Donnez la formule en utilisant contourArea() et arcLength().
Partie 4 : Segmentation K-Means
Mise en contexte
Le K-Means regroupe les pixels en K clusters selon leur couleur. Contrairement au seuillage, il
ne nécessite aucune connaissance a priori des couleurs. Il est particulièrement utile pour
quantifier les couleurs d'une image ou identifier les teintes dominantes. En OpenCV, kmeans()
attend les données sous forme d'une matrice N×3 de flottants.
Valeur K Effet sur l'image Usage typique
2 régions seulement (ex. fond /
K=2 Segmentation binaire, fond uniforme
objet)
Segmentation grossière — teintes
K=4 Analyse rapide de composition colorimétrique
dominantes
Enseignante : Amel Tilouche Page 4
TP5 — Segmentation d'images | Computer Vision 2EET | 2MIQ
Valeur K Effet sur l'image Usage typique
K=8 Bonne représentation des couleurs Réduction de palette, compression d'image
Segmentation fine — presque toutes
K = 16+ Analyse détaillée, rendu artistique
les couleurs
Exercice 4 : K-Means — segmentation et quantification des couleurs
1. Créez un projet VS nommé TP5_Exercice4
2. Chargez une image couleur et reformatez-la en N×3 flottants
3. Appliquez kmeans() avec K=4 (100 itérations max, eps=0.2, 3 tentatives,
KMEANS_PP_CENTERS)
4. Reconstruisez l'image segmentée en remplaçant chaque pixel par la couleur de son
centroïde
5. Répétez avec K=2, K=8 et K=16, comparez les résultats visuellement
6. Affichez les K couleurs dominantes (centroïdes) sous forme de rectangles colorés
annotés
7. Sauvegardez l'image segmentée pour K=4 et K=8
N° Question Réponse
Quelle différence visuelle observez-vous entre K=2, K=4, K=8
1 et K=16 ? À partir de quelle valeur de K l'image vous semble-
t-elle fidèle à l'originale ?
Le K-Means donne-t-il toujours le même résultat à chaque
2 exécution ? Pourquoi ? Quel paramètre permet d'améliorer la
stabilité ?
Comparez la segmentation K-Means (K=4) avec le seuillage
3 Otsu sur la même image. Laquelle est la plus adaptée à votre
image ?
Quel est l'avantage principal du K-Means par rapport au
4 seuillage ? Dans quel cas serait-il préférable d'utiliser
inRange() plutôt que K-Means ?
Enseignante : Amel Tilouche Page 5