EDI+VA · Esercizio di Programmazione

EP08_06 — 🟡 Bounding Boxes , Centroidi e Proprietà delle Istanze con mm.measure

8.14.6 EP08_06 🟡 Bounding Boxes, Centroidi e Proprietà delle Istanze con mm.measure

Nell’esercizio precedente (EP08_05), si osserva come la segmentazione per componenti connesse etichetti regioni binarie contigue per separare le istanze. Tuttavia, per attività di rilevamento, tracciamento e analisi quantitativa degli oggetti, la semplice mappa delle etichette non è sufficiente. Diventa necessario estrarre metriche spaziali e geometriche che caratterizzino ciascuna istanza individualmente.

Questo EP si concentra sul calcolo e sull’estrazione automatica delle proprietà fondamentali della visione artificiale per ogni componente connessa trovata nella maschera binaria, utilizzando il metodo nativo mm.measure(img) della libreria morph:

  1. Bounding Box: Il più piccolo rettangolo allineato agli assi che racchiude completamente l’istanza, definito dal suo angolo superiore sinistro \((x, y)\), larghezza \(w\) e altezza \(h\).
  2. Centroide Geometrico \((\bar{x}, \bar{y})\): Il centro di massa dell’istanza sulla griglia discreta, equivalente ai momenti spaziali del primo ordine \(M_{10}/M_{00}\) e \(M_{01}/M_{00}\).
  3. Area Geometrica del Contorno (\(A\)): L’area racchiusa dal contorno dell’istanza, calcolata tramite mm.contourArea(c).

8.14.6.1 📋 Linee Guida di Implementazione

  1. Input: Leggere le dimensioni \(H \times W\) della maschera binaria, i valori \(H \times W\) (\(0\) o \(1\)) e il parametro di connettività \(c \in \{4, 8\}\).
  2. Estrazione Automatica con mm.measure: Passare l’immagine binarizzata alla funzione mm.measure(img_bin), che estrae i contorni OpenCV e restituisce una lista di dizionari contenenti le proprietà geometriche di ciascuna istanza.
  3. Proprietà Restituite: Per ogni dizionario \(m\) della lista restituita da medidas = mm.measure(img_bin):
    • Area (area): Valore numerico dell’area geometrica del contorno mm.contourArea(c).
    • Bounding Box (bbox): Tupla \((x, y, w, h)\) che rappresenta l’angolo superiore sinistro, la larghezza e l’altezza.
    • Centroide (center): Tupla \((c_x, c_y)\) con le coordinate del centro di massa \(M_{10}/M_{00}\) e \(M_{01}/M_{00}\). Formattare con due cifre decimali.
  4. Output: Per ogni istanza \(1, \dots, K\) trovata (ordinata per ordine di scoperta/posizione nell’immagine), stampare una riga contenente le sue proprietà. Infine, stampare il numero totale di istanze.
    • Per ordinare, usare medidas.sort(key=lambda m: (m['bbox'][1], m['bbox'][0])).

8.14.6.2 🧠 Fondamenti Teorici

Proprietà in mm.measure Calcolo Matematico / Logica Discreta Applicazione Pratica nella Visione Artificiale
bbox (OpenCV) \([x, y, w, h] = [\min(c), \min(r), \Delta c + 1, \Delta r + 1]\) Formato classico di OpenCV. Nota: reti come YOLO convertono questo rettangolo in \((c_x, c_y, w, h)\) normalizzato.
center \(\bar{x} = \frac{M_{10}}{M_{00}}, \quad \bar{y} = \frac{M_{01}}{M_{00}}\) Centro di massa esatto della maschera (usato nel tracciamento e nell’analisi delle traiettorie).
area \(A = \text{contourArea}(C)\) (Formula del Poligono) Metrica continua della superficie dell’oggetto.

8.14.6.3 📦 Specifica di Input e Output (VPL)

Input:

  • Riga 1: Interi \(H\) e \(W\).
  • Prossime \(H\) righe: \(W\) interi (\(0\) o \(1\)) ciascuna.
  • Ultima riga: Intero \(c\) (\(4\) o \(8\)).

Output:

  • Una riga per istanza nell’ordine di scoperta: Istanza l: Area=A, BBox=(x,y,w,h), Centroide=(cx,cy)
  • Ultima riga: Totale istanze: K.

8.14.6.4 📌 Esempi

Input Output Osservazione
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
Istanza 1: Area=1.0, BBox=(1,1,2,2), Centroide=(1.50,1.50)
Istanza 2: Area=1.0, BBox=(4,4,2,2), Centroide=(4.50,4.50)
Totale istanze: 2
Blocchi \(2\times2\) allineati. Il calcolo dell’area geometrica del contorno risulta in \(1.0\). Il centroide del blocco nelle colonne 1–2 e righe 1–2 è esattamente \((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
Istanza 1: Area=2.0, BBox=(1,1,4,2), Centroide=(2.40,1.20)
Totale istanze: 1
Oggetto asimmetrico a forma di “T” invertita. L’area geometrica del contorno è \(2.0\). Il centroide riflette la distribuzione dei pixel dell’oggetto.
🧮 Simulatore EP08_06: Metriche Morfologiche Native (mm.measure) Contorno OpenCV & Momenti
AZIONE
Parametro di Precisione (approxPolyDP): precisione = 0.01
MAPPA DELLE ETICHETTE DELLE ISTANZE
METRICHE ESTRATTE DA MM.MEASURE
id area perimetro centro (cx, cy) bbox (x,y,w,h) circolarità solidità vertici
Figura 8.20: Simulatore EP08_06: Estrazione di Bounding Boxes, Centroidi e Proprietà con mm.measure
%%writefile EP08_06.py
# Codice Python
Overwriting EP08_06.py
TestSuite("EP08_06.py").run()
✔️ EP08_06.cases esiste già in casos/
📋 3 caso/i caricato/i da casos/EP08_06.cases

🔍 Test di Python: EP08_06.py
⚠️ EP08_06.py: file vuoto (meno di 3 righe). Test saltati.