EDI+VA · Esercizio di Programmazione

EP04_05 — 🧹 Apertura Morfologica (Rimozione del Rumore)

4.9.5 EP04_05 🧹 Apertura Morfologica (Rimozione del Rumore)

Le immagini acquisite da sensori a basso costo, come quelli dei droni agricoli, sono spesso disseminate di piccoli punti di rumore — pixel isolati che non rappresentano nulla di reale. Applicare l’erosione seguita dalla dilatazione con lo stesso elemento strutturante produce l’apertura: essa “pulisce” punti e sottili protuberanze, ma restituisce all’oggetto principale praticamente la sua dimensione originale. È la combinazione classica utilizzata nella pre-elaborazione di immagini satellitari prima di qualsiasi conteggio dell’area coltivata. Vedi in Figura 4.34 una simulazione di questo EP.

4.9.5.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\) con valori \(0\) o \(1\), riga per riga.
  4. Dati: Leggere la matrice binaria \(f\) (valori \(0\) o \(1\)), riga per riga.
  5. Erosione: Calcolare \(e = f \ominus B\), usando esattamente l’algoritmo di EP04_04 (senza riflettere \(B\), senza padding).
  6. Dilatazione: Calcolare \(g = e \oplus B\), usando esattamente l’algoritmo di EP04_03 (riflettendo \(B\), senza padding) — ma ora applicato su \(e\), non su \(f\).
  7. Output: Visualizzare la matrice risultante \(g\) (l’apertura di \(f\) tramite \(B\)) con dimensioni \(L \times C\).

4.9.5.2 📌 Vincoli Computazionali

  • Ordine fisso: È sempre prima erosione, poi dilatazione — l’ordine inverso definisce un altro operatore (chiusura, nel prossimo EP).
  • Stesso \(B\): L’elemento strutturante utilizzato nell’erosione e nella dilatazione deve essere identico.
  • Nessun padding in nessuna delle due fasi.

4.9.5.3 🧠 Fondamenti Teorici

Concetto Significato Impatto Visivo
Anti-estensività \(g \subseteq f\) sempre L’apertura non crea mai nuovi pixel, li rimuove soltanto
Idempotenza \(\text{apertura}(\text{apertura}(f)) = \text{apertura}(f)\) Applicarla di nuovo non cambia più nulla
Punti isolati Più piccoli di \(B\) Vengono completamente eliminati
Nucleo dell’oggetto Più grande di \(B\) Viene recuperato quasi intatto dalla dilatazione finale

4.9.5.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: elementi interi (\(0\) o \(1\)) della matrice \(B\).
  • Prossime \(L\) righe: elementi interi (\(0\) o \(1\)) della matrice \(f\).

Output:

  • Matrice risultante in \(L\) righe e \(C\) colonne, valori \(0\) o \(1\).

4.9.5.5 📌 Esempi

Input Output Osservazione
7
7
3
3
1 1 1
1 1 1
1 1 1
0 0 0 0 0 0 0
0 1 0 0 0 1 0
0 0 1 1 1 0 0
0 0 1 1 1 0 0
0 0 1 1 1 1 0
0 0 0 0 0 0 0
0 1 0 0 0 0 1
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 1 1 1 0 0
0 0 1 1 1 0 0
0 0 1 1 1 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
Punti isolati e la sottile protuberanza scompaiono; il quadrato centrale sopravvive
🧹 Simulatore EP04_05: Apertura Morfologica g = (f ⊖ B) ⊕ B

Clicca sulle celle di f originale per accendere o spegnere i pixel (crea il tuo rumore di fondo!) e regola la dimensione dell'elemento strutturante B.


3×3
f Originale (Cliccabile)
e = f ⊖ B (Erosione)
g = e ⊕ B (Apertura)
Figura 4.34: Simulatore EP04_05: Apertura Morfologica (g = (f ⊖ B) ⊕ B)
%%writefile EP04_05.cpp
// your solution
Overwriting EP04_05.cpp
TestSuite("EP04_05.cpp").run()
✔️ EP04_05.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP04_05.cases

🔍 Test di C++: EP04_05.cpp
⚠️ EP04_05.cpp: file vuoto (meno di 3 righe). Test saltati.