Nella microscopia di particelle e nell’OCR di targhe automobilistiche usurate, tratti sottili o discontinui devono essere “ingrossati” affinché il riconoscimento funzioni. La dilatazione morfologica fa esattamente questo: espande le regioni chiare utilizzando un elemento strutturante \(B\) — la stessa operazione implementata in morph.py come mm.dil0(f, B), utilizzata quando \(B\) è piano (senza pesi, solo \(0\)/\(1\)). Vedi in Figura 4.32 una simulazione di questo EP.
4.9.3.1 📋 Linee Guida di Implementazione
Dimensioni dell’immagine: Leggere gli interi \(L\) (righe) e \(C\) (colonne) di \(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.
Riflessione: Costruire \(B_{ref}\), la versione di \(B\) riflessa di \(180°\) (righe e colonne invertite) — esattamente come fa mm.dil0 internamente.
Vicinato senza padding: Per ogni pixel \((y,x)\), percorrere le posizioni \((by,bx)\) di \(B_{ref}\) centrate su \((y,x)\), usando lo spostamento \[
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)\) — non riempire con zeri.
Mappatura: Calcolare ogni pixel di uscita come il massimo tra \(f(y,x)\) e tutti gli \(f(v_y,v_x)\) validi la cui posizione corrispondente in \(B_{ref}\) vale \(1\): \[
g(y,x) = \max\Big(f(y,x),\ \max_{\substack{(v_y,v_x)\ \text{valido}\\ B_{ref}(by,bx)=1}} f(v_y,v_x)\Big)
\]
Uscita: Visualizzare la matrice \(g\) con dimensioni \(L \times C\).
4.9.3.2 📌 Vincoli Computazionali
Senza padding: Non inventare mai vicini al di fuori dell’immagine; utilizzare solo quelli che esistono realmente.
Riflessione obbligatoria:\(B\) deve essere riflesso prima dell’applicazione (è ciò che distingue mm.dil0 da una semplice ricerca del massimo).
Robustezza ai bordi: Se nessuna posizione valida di \(B_{ref}=1\) ricade all’interno del dominio per un dato pixel, questo mantiene il suo valore originale.
4.9.3.3 🧠 Fondamento Teorico
Concetto
Significato
Impatto Visivo
Dilatazione
\(g \geq f\) sempre (estensiva)
Le regioni chiare crescono, i buchi scuri si restringono
\(B\) più grande
Vicinato più ampio
Crescita più aggressiva
Riflessione di \(B\)
\(B_{ref}(y,x) = B(-y,-x)\)
Garantisce la definizione formale di Minkowski della dilatazione
4.9.3.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\).
Successive \(L_B\) righe: elementi interi (\(0\) o \(1\)) della matrice \(B\).
Successive \(L\) righe: elementi interi della matrice \(f\).
Output:
Matrice \(g\) in \(L\) righe e \(C\) colonne, valori interi separati da spazio.
4.9.3.5 📌 Esempi
Input
Output
Osservazione
3
3
3
3
0 1 0
1 1 1
0 1 0
0 0 0
0 9 0
0 0 0
0 9 0
9 9 9
0 9 0
\(B\) a croce simmetrico: punto isolato si espande a croce
1
4
1
3
1 1 1
10 200 5 80
200 200 200 80
\(B\) orizzontale: ogni pixel “attira” il massimo dei vicini della riga
🌱 Simulatore EP04_03: Dilatazione Piana (mm.dil0)g = f ⊕ B
Cambia 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)
Dilatata g (f ⊕ B)
g(y,x) = max sui vicini validi di B riflesso
Figura 4.32: Simulatore EP04_03: Dilatazione Binaria Piana (g = f ⊕ B)
%%writefile EP04_03.py# Codice Python
Overwriting EP04_03.py
TestSuite("EP04_03.py").run()
✔️ EP04_03.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP04_03.cases
🔍 Test di Python: EP04_03.py
⚠️ EP04_03.py: file vuoto (meno di 3 righe). Test saltati.