EDI+VA · Esercizio di Programmazione

EP08_07 — 🟡 Rimozione del Rumore Sale e Pepe e Misurazione degli Oggetti

8.14.7 EP08_07 🟡 Rimozione del Rumore Sale e Pepe e Misurazione degli Oggetti

In questo esercizio, applicherai il filtraggio morfologico per pulire un’immagine binaria corrotta da rumore di tipo sale e pepe (pixel isolati di valore 1 nello sfondo e 0 all’interno degli oggetti). Dopo la pulizia, il programma deve estrarre le misurazioni geometriche dei componenti connessi rimanenti, ordinarli e visualizzare la tabella finale delle metriche.

8.14.7.1 📋 Linee Guida di Implementazione

  1. Input: leggere due interi \(H\) e \(W\) (altezza e larghezza dell’immagine) nella prima riga e, successivamente, le \(H\) righe con la matrice binaria contenente pixel 0 e 1 separati da spazio.

  2. Filtraggio Morfologico: applicare una sequenza di Apertura (per eliminare il rumore “sale” sullo sfondo) seguita da Chiusura (per riempire il rumore “pepe” all’interno degli oggetti) con elemento strutturante \(3 \times 3\).

  3. Stampa dell’Immagine Pulita: stampare la matrice risultante in valori 0 e 1 separati da spazio.

  4. Misurazioni Geometriche: per ogni oggetto identificato nella matrice pulita, estrarre:

  • id: identificatore numerico sequenziale (riassegnato dopo l’ordinamento);

  • area: area calcolata tramite contorno (cv2.contourArea);

  • perimeter: perimetro del contorno (cv2.arcLength);

  • cx, cy: centro di massa (centroide tramite cv2.moments);

  • x, y, w, h: coordinate del rettangolo delimitatore (cv2.boundingRect);

  • circularity: circolarità data da \(\frac{4 \pi \cdot \text{area}}{\text{perimetro}^2}\);

  • solidity: solidità data dal rapporto \(\frac{\text{area}}{\text{area dell'inviluppo convesso}}\);

  • vertices: numero di vertici approssimato del poligono (cv2.approxPolyDP con \(\epsilon = 0.02 \times \text{perimetro}\)).

  1. Ordinamento e Uscita: ordinare gli oggetti in ordine crescente in base alla posizione \(X\) del rettangolo delimitatore (bbox[0]); in caso di parità, utilizzare la posizione \(Y\) (bbox[1]). Riassegnare gli id da \(1\) a \(N\) e stampare la tabella formattata.
    • Per ordinare, utilizzare medidas.sort(key=lambda m: (m['bbox'][1], m['bbox'][0])), con medidas = mm.measure(img).

8.14.7.2 📌 Vincoli e Regole di Ordinamento

  • Regola di Ordinamento degli Oggetti:
medidas.sort(key=lambda m: (m['bbox'][0], m['bbox'][1]))
  • Differenza di Area: L’area calcolata da OpenCV (cv2.contourArea) misura l’area del poligono continuo delimitato dai centri dei pixel di bordo, risultando in valori numerici inferiori rispetto al semplice conteggio discreto dei pixel 1 (np.sum).

8.14.7.3 🧠 Fondamenti Teorici

Operazione / Metrica Funzione nel Filtraggio e nella Caratterizzazione
Apertura Morfologica (\(\circ\)) Erosione seguita da dilatazione: rimuove rumori brillanti isolati (sale).
Chiusura Morfologica (\(\bullet\)) Dilatazione seguita da erosione: riempie piccoli fori scuri all’interno degli oggetti (pepe).
cv2.boundingRect Restituisce \((x, y, w, h)\), il più piccolo rettangolo allineato agli assi che racchiude l’oggetto.
Circolarità e Solidità Descrivono la compattezza e la convessità geometrica del componente.

8.14.7.4 📌 Esempi

Input Output
8 9
0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 0 0
0 0 0 1 1 1 1 0 0
0 0 0 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 0 0
id area perimeter cx cy x y w h circularity solidity vertices
1 9.0 12.0 3.5 2.0 3 1 4 3 0.79 1.000 4
2 4.0 8.0 7.5 5.5 7 5 2 2 0.79 1.000 4
🧮 Simulatore EP08_07: Morfologia Commutabile (4-C / 8-C) & Metriche OpenCV Sale + Pepe → Apertura → Chiusura → Misurazione
FASE DELL'ELABORAZIONE MORFOLOGICA
ELEMENTO STRUTTURANTE
VISUALIZZAZIONE DEI PIXEL
VISUALIZZAZIONE DELLA MATRICE DEI PIXEL DI INGRESSO / ELABORATA
TABELLA DELLE MISURAZIONI DEGLI OGGETTI (CALCOLATA DOPO APERTURA E CHIUSURA)
id area perimetro cx cy x y w h circolarità solidità vertici
Figura 8.21: Simulatore EP08_07: Morfologia con Connettività Configurabile e Misurazione
%%writefile EP08_07.py
# Codice Python
Overwriting EP08_07.py
TestSuite("EP08_07.py").run()
✔️ EP08_07.cases esiste già in casos/
📋 4 caso/i caricato/i da casos/EP08_07.cases

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