Alterna l'elemento strutturante B (o seleziona i preset) e clicca sulle celle dell'immagine originale f per accendere o spegnere i pixel.
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
- Dimensioni dell’immagine: Leggere gli interi \(L\) (righe) e \(C\) (colonne) da \(f\).
- Dimensioni di \(B\): Leggere gli interi \(L_B\) (righe) e \(C_B\) (colonne) dell’elemento strutturante.
- Elemento strutturante: Leggere la matrice \(B\) con valori \(0\) o \(1\), riga per riga.
- Dati: Leggere la matrice \(f\) (l’immagine originale), riga per riga.
- 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 |
%%writefile EP04_04.cpp
// your solutionOverwriting EP04_04.cpp
TestSuite("EP04_04.cpp").run()✔️ EP04_04.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP04_04.cases
🔍 Test di C++: EP04_04.cpp
⚠️ EP04_04.cpp: file vuoto (meno di 3 righe). Test saltati.