EDI+VA · Esercizio di Programmazione

EP04_04 — 🪨 Erosione Binaria Piatta (mm.ero0)

4.9.4 EP04_04 🪨 Erosione Binaria Piatta (mm.ero0)

Se la dilatazione ingrossa, l’erosione assottiglia. Nei sistemi di conteggio cellulare, viene utilizzata per separare cellule che si toccano: “consumando” i bordi di ogni regione, le connessioni sottili tra gli oggetti scompaiono prima ancora che venga effettuato qualsiasi conteggio. In morph.py, questa è l’operazione mm.ero0(f, B) — il duale esatto della dilatazione, e l’unica delle due che non riflette l’elemento strutturante. Vedi nella Figura 4.33 una simulazione di questo EP.

4.9.4.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 \(f\) (l’immagine originale), riga per riga.
  5. Vicinato senza padding (senza riflessione!): Per ogni pixel \((y,x)\), percorrere le posizioni \((by,bx)\) di \(B\) nell’ordine originale (senza riflettere), usando lo stesso spostamento dell’EP04_03: \[ v_y = y + by + o_y,\quad v_x = x + bx + o_x,\quad o_y=-\tfrac{L_B}{2}+0{,}5,\quad o_x=-\tfrac{C_B}{2}+0{,}5 \]

Scartare ogni \((v_y,v_x)\) al di fuori di \([0,L)\times[0,C)\). 6. Mappatura: Calcolare ogni pixel di uscita come il minimo tra \(f(y,x)\) e tutti gli \(f(v_y,v_x)\) validi la cui posizione corrispondente in \(B\) vale \(1\): \[ g(y,x) = \min\Big(f(y,x),\ \min_{\substack{(v_y,v_x)\ \text{valido}\\ B(by,bx)=1}} f(v_y,v_x)\Big) \] 7. Uscita: Visualizzare la matrice \(g\) con dimensioni \(L \times C\).

4.9.4.2 📌 Vincoli Computazionali

  • Senza riflessione: Diversamente dalla dilatazione, \(B\) viene utilizzato esattamente come letto — riflettere qui sarebbe un errore concettuale grave.
  • Senza padding: I vicini al di fuori dell’immagine vengono semplicemente ignorati, mai trattati come \(0\).
  • Robustezza ai bordi: Se nessuna posizione valida di \(B=1\) ricade all’interno del dominio, il pixel mantiene il suo valore originale.

4.9.4.3 🧠 Fondamenti Teorici

Concetto Significato Impatto Visivo
Erosione \(g \leq f\) sempre (anti-estensiva) Le regioni chiare si restringono, il rumore puntuale scompare
Dualità \(\text{ero}(f,B) = -\text{dil}(-f, B_{ref})\) Erosione e dilatazione sono “specchi” matematici
\(B\) più grande Erosione più aggressiva Gli oggetti sottili scompaiono completamente

4.9.4.4 📦 Specifica di Ingresso e Uscita (VPL)

Ingresso:

  • 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 della matrice \(f\).

Uscita:

  • Matrice \(g\) in \(L\) righe e \(C\) colonne, valori interi separati da spazio.

4.9.4.5 📌 Esempi

Ingresso Uscita Osservazione
3
3
3
3
0 1 0
1 1 1
0 1 0
9 9 9
9 0 9
9 9 9
9 0 9
0 0 0
9 0 9
Il “buco” centrale (0) si propaga a croce
1
4
1
3
1 1 1
10 200 5 80
10 5 5 80 \(B\) orizzontale: ogni pixel “attira” il minimo dei vicini della riga
🪨 Simulatore EP04_04: Erosione Planare (mm.ero0) g = f ⊖ B

Alterna l'elemento strutturante B (o seleziona i preset) e clicca sulle celle dell'immagine originale f per accendere o spegnere i pixel.

Elemento Strutturante B (Clicca per Alternare 0/1)
Immagine Originale f (5×5)
Erosa g (f ⊖ B)
 
g(y,x) = min sui vicini validi di B (senza riflettere)
Figura 4.33: Simulatore EP04_04: Erosione Binaria Piana (g = f ⊖ B)
%%writefile EP04_04.py
# Codice Python
Overwriting EP04_04.py
TestSuite("EP04_04.py").run()
✔️ EP04_04.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP04_04.cases

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