EDI+VA · Esercizio di Programmazione

EP04_10 — 🪙 Separazione dei Blob , Etichettatura e Descrittori

4.9.10 EP04_10 🪙 Separazione dei Blob, Etichettatura e Descrittori

In una linea di produzione di monete, è comune che i pezzi si tocchino l’un l’altro sul nastro trasportatore, formando un’unica macchia connessa nell’immagine — un conteggio ingenuo sbaglierebbe il totale. La soluzione classica combina operazioni morfologiche e analisi di connettività: prima un’erosione riduce o spezza le connessioni fragili tra gli oggetti, e poi l’etichettatura delle componenti connesse separa ciascun oggetto in una regione distinta. Infine, descrittori geometrici (area e bounding box) riassumono ciascuna componente trovata.

Vedi in Figura 4.39 una simulazione di questo EP.

4.9.10.1 📋 Linee Guida di Implementazione

  1. Dimensioni dell’immagine: leggere gli interi \(L\) (righe) e \(C\) (colonne) da \(f\).

  2. Dimensioni di \(B\): leggere gli interi \(L_B\) (righe) e \(C_B\) (colonne) dell’elemento strutturante.

  3. Elemento strutturante: leggere la matrice \(B\), contenente valori \(0\) o \(1\), riga per riga.

  4. Dati: leggere la matrice binaria \(f\) (valori \(0\) o \(1\)), riga per riga.

  5. Separazione: calcolare \[ f_{ero} = f \ominus B \] usando erosione binaria piatta (come nell’EP04_04), eliminando connessioni fragili tra gli oggetti.

  6. Etichettatura: su \(f_{ero}\), identificare le componenti connesse usando la connettività definita dall’intorno \(B\). L’etichettatura deve seguire una scansione raster: quando si trova un pixel \(1\) non ancora etichettato, assegnare una nuova etichetta intera crescente a partire da 1 e propagare tale etichetta a tutta la regione connessa.

  7. Descrittori: per ogni etichetta \(k\), calcolare:

    • Area: numero di pixel appartenenti all’etichetta;
    • Bounding box: \[(y_{min}, x_{min}, y_{max}, x_{max})\]
  8. Output: mostrare il numero totale di etichette e, successivamente, una riga per etichetta nel formato: \[ k,\ \text{area},\ y_{min},\ x_{min},\ y_{max},\ x_{max} \]

4.9.10.2 📌 Vincoli Computazionali

  • L’erosione deve essere applicata prima dell’etichettatura.
  • La connettività è fissa e definita dall’intorno sopra descritto.
  • L’elemento strutturante \(B\) non interferisce con la connettività dell’etichettatura.
  • Nessun padding in alcuna fase.
  • L’ordine delle etichette segue la prima scoperta durante la scansione raster.

4.9.10.3 🧠 Fondamenti Teorici

Concetto Significato Impatto
Ponte sottile Connessione stretta tra oggetti Può essere rimosso dall’erosione morfologica
Connettività Definita dall’insieme \[\mathcal{N}(y,x)\] Determina quali pixel appartengono alla stessa componente
Area Numero di pixel per componente Stima diretta della dimensione dell’oggetto
Bounding box Estensione spaziale dell’etichetta Riassunto geometrico della componente

4.9.10.4 📦 Specifica di Input e Output (VPL)

Input:

  • Riga 1: intero \(L\)
  • Riga 2: intero \(C\)
  • Riga 3: intero \(L_B\)
  • Riga 4: intero \(C_B\)
  • Prossime \(L_B\) righe: matrice \(B\)
  • Prossime \(L\) righe: matrice \(f\)

Output:

  • Riga 1: numero totale di etichette trovate
  • Righe successive: \[ k,\ \text{area},\ y_{min},\ x_{min},\ y_{max},\ x_{max} \]
🪙 Simulatore EP04_10: Monete Attaccate → Separate → Contate erosione + etichetta + descrittori

Regola lo spessore del ponte tra le monete e osserva come l'erosione morfologica separa gli oggetti per il conteggio e l'estrazione dei descrittori (area e bounding box).


1 px
f Originale (Collegate)
Dopo Erosione + Etichette
Figura 4.39: Simulatore EP04_10: Separazione di Blob, Etichettatura e Descrittori
%%writefile EP04_10.py
# Codice Python
Overwriting EP04_10.py
TestSuite("EP04_10.py").run()
✔️ EP04_10.cases esiste già in casos/
📋 4 caso/i caricato/i da casos/EP04_10.cases

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