TNI+VO · Exercice de Programmation

EP08_06 — 🟡 Bounding Boxes , Centroïdes et Propriétés des Instances avec mm.measure

8.14.6 EP08_06 🟡 Bounding Boxes, Centroïdes et Propriétés des Instances avec mm.measure

Dans l’exercice précédent (EP08_05), on peut observer comment la segmentation par composantes connexes étiquette des régions binaires contiguës pour séparer les instances. Cependant, pour les tâches de détection, de suivi et d’analyse quantitative d’objets, la simple carte d’étiquettes ne suffit pas. Il devient nécessaire d’extraire des métriques spatiales et géométriques qui caractérisent chaque instance individuellement.

Cet EP se concentre sur le calcul et l’extraction automatique des propriétés fondamentales de vision par ordinateur pour chaque composante connexe trouvée dans le masque binaire, en utilisant la méthode native mm.measure(img) de la bibliothèque morph :

  1. Boîte englobante (Bounding Box) : Le plus petit rectangle aligné sur les axes qui englobe complètement l’instance, défini par son coin supérieur gauche \((x, y)\), sa largeur \(w\) et sa hauteur \(h\).
  2. Centroïde géométrique \((\bar{x}, \bar{y})\) : Le centre de masse de l’instance sur la grille discrète, équivalent aux moments spatiaux du premier ordre \(M_{10}/M_{00}\) et \(M_{01}/M_{00}\).
  3. Aire géométrique du contour (\(A\)) : L’aire délimitée par le contour de l’instance calculée via mm.contourArea(c).

8.14.6.1 📋 Directives d’implémentation

  1. Entrée : Lire les dimensions \(H \times W\) du masque binaire, les \(H \times W\) valeurs (\(0\) ou \(1\)) et le paramètre de connectivité \(c \in \{4, 8\}\).
  2. Extraction automatique avec mm.measure : Passer l’image binarisée à la fonction mm.measure(img_bin), qui extrait les contours OpenCV et retourne une liste de dictionnaires contenant les propriétés géométriques de chaque instance.
  3. Propriétés retournées : Pour chaque dictionnaire \(m\) de la liste retournée par medidas = mm.measure(img_bin) :
    • Aire (area) : Valeur numérique de l’aire géométrique du contour mm.contourArea(c).
    • Boîte englobante (bbox) : Tuple \((x, y, w, h)\) représentant le coin supérieur gauche, la largeur et la hauteur.
    • Centroïde (center) : Tuple \((c_x, c_y)\) avec les coordonnées du centre de masse \(M_{10}/M_{00}\) et \(M_{01}/M_{00}\). Formater avec deux décimales.
  4. Sortie : Pour chaque instance \(1, \dots, K\) trouvée (triée par ordre de découverte/position dans l’image), imprimer une ligne contenant ses propriétés. Enfin, imprimer le nombre total d’instances.
    • Pour trier, utiliser medidas.sort(key=lambda m: (m['bbox'][1], m['bbox'][0])).

8.14.6.2 🧠 Fondements théoriques

Propriété dans mm.measure Calcul mathématique / Logique discrète Application pratique en vision
bbox (OpenCV) \([x, y, w, h] = [\min(c), \min(r), \Delta c + 1, \Delta r + 1]\) Format classique d’OpenCV. Remarque : des réseaux comme YOLO convertissent ce rectangle en \((c_x, c_y, w, h)\) normalisé.
center \(\bar{x} = \frac{M_{10}}{M_{00}}, \quad \bar{y} = \frac{M_{01}}{M_{00}}\) Centre de masse exact du masque (utilisé pour le suivi et l’analyse de trajectoire).
area \(A = \text{contourArea}(C)\) (Formule du polygone) Métrique continue de la surface de l’objet.

8.14.6.3 📦 Spécification d’entrée et de sortie (VPL)

Entrée :

  • Ligne 1 : Entiers \(H\) et \(W\).
  • \(H\) lignes suivantes : \(W\) entiers (\(0\) ou \(1\)) chacun.
  • Dernière ligne : Entier \(c\) (\(4\) ou \(8\)).

Sortie :

  • Une ligne par instance dans l’ordre de découverte : Instância l: Area=A, BBox=(x,y,w,h), Centroide=(cx,cy)
  • Dernière ligne : Total de instâncias: K.

8.14.6.4 📌 Exemples

Entrée Sortie Observation
6 6
0 0 0 0 0 0
0 1 1 0 0 0
0 1 1 0 0 0
0 0 0 0 0 0
0 0 0 0 1 1
0 0 0 0 1 1
8
Instância 1: Area=1.0, BBox=(1,1,2,2), Centroide=(1.50,1.50)
Instância 2: Area=1.0, BBox=(4,4,2,2), Centroide=(4.50,4.50)
Total de instâncias: 2
Blocs \(2\times2\) alignés. Le calcul de l’aire géométrique du contour donne \(1.0\). Le centroïde du bloc dans les colonnes 1–2 et les lignes 1–2 est exactement \((1.50,\,1.50)\).
4 6
0 0 0 0 0 0
0 1 1 1 1 0
0 0 0 1 0 0
0 0 0 0 0 0
4
Instância 1: Area=2.0, BBox=(1,1,4,2), Centroide=(2.40,1.20)
Total de instâncias: 1
Objet asymétrique en forme de “T” inversé. L’aire géométrique du contour est \(2.0\). Le centroïde reflète la distribution des pixels de l’objet.
🧮 Simulateur EP08_06 : Métriques morphologiques natives (mm.measure) Contour OpenCV & Moments
ACTION
Paramètre de précision (approxPolyDP) : precision = 0.01
CARTE DES ÉTIQUETTES D'INSTANCES
MÉTRIQUES EXTRAITES PAR MM.MEASURE
id aire périmètre centre (cx, cy) bBox (x,y,w,h) circularité solidité sommets
Figure 8.20: Simulador EP08_06 : Extraction de Bounding Boxes, Centroides et Propriétés avec mm.measure
%%writefile EP08_06.py
# Code Python
Overwriting EP08_06.py
TestSuite("EP08_06.py").run()
✔️ EP08_06.cases existe déjà dans casos/
📋 3 cas chargé(s) depuis casos/EP08_06.cases

🔍 Test de Python : EP08_06.py
⚠️ EP08_06.py : fichier vide (moins de 3 lignes). Tests ignorés.