EDI+VA · Esercizio di Programmazione

EP04_03 — 🌱 Dilatazione Binaria Piana (mm.dil0)

4.9.3 EP04_03 🌱 Dilatazione Binaria Piana (mm.dil0)

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

  1. Dimensioni dell’immagine: Leggere gli interi \(L\) (righe) e \(C\) (colonne) di \(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. Riflessione: Costruire \(B_{ref}\), la versione di \(B\) riflessa di \(180°\) (righe e colonne invertite) — esattamente come fa mm.dil0 internamente.
  6. 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.
  7. 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) \]
  8. 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.