EDI+VA · Esercizio di Programmazione

EP04_09 — 🗺️ Trasformata della Distanza e il “Nucleo” dell’Oggetto

4.9.9 EP04_09 🗺️ Trasformata della Distanza e il “Nucleo” dell’Oggetto

Nella robotica mobile, quando si pianifica un percorso all’interno di un corridoio, il robot vuole sapere non solo dove c’è spazio libero, ma anche quanto distante ogni punto libero sia dalla parete più vicina. I percorsi più sicuri tendono a passare attraverso il “nucleo” del corridoio, lontano dagli ostacoli.

La trasformata della distanza morfologica assegna a ogni pixel un valore che rappresenta la sua distanza dal bordo più vicino, secondo la metrica definita dall’elemento strutturante. I pixel vicini al bordo ricevono valori bassi, mentre i pixel più interni ricevono valori più alti. Il pixel con il valore massimo corrisponde alla regione più protetta dell’oggetto, spesso associata al suo centro morfologico.

Vedere in Figura 4.38 una simulazione di questo EP.

4.9.9.1 📋 Linee Guida di Implementazione

  1. Dimensioni dell’immagine: leggere gli interi \(L\) (righe) e \(C\) (colonne) dell’immagine \(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\), contenente valore \(0\) al centro e valori negativi nelle altre posizioni.
  4. Immagine: leggere la matrice binaria \(f\) (valori \(0\) o \(1\)), riga per riga.
  5. Preparazione: moltiplicare l’immagine per \(L\times C\), garantendo che i pixel interni abbiano un valore iniziale sufficientemente alto per la propagazione delle distanze.
  6. Trasformata della distanza: calcolare la matrice delle distanze utilizzando il metodo mm::dist1(f,b).
  7. Output: visualizzare la matrice risultante dalla trasformata della distanza.

4.9.9.2 📌 Vincoli Computazionali

  • Utilizzare l’implementazione dell’erosione ponderata fornita dalla libreria.
  • L’elemento strutturante può contenere valori negativi arbitrari.
  • La trasformata deve essere ottenuta applicando iterativamente erosioni ponderate fino a raggiungere un punto fisso.

⚠️ Nota Cruciale sulla Lettura delle Matrici: Poiché l’elemento strutturante può contenere valori interi negativi (ad esempio, -1 e -99), non utilizzare la funzione mm::readImg per leggere la matrice \(b\). Questa funzione converte i dati nel tipo uint8, causando underflow e corrompendo i valori negativi. Leggere le \(L_B\) righe di \(b\) manualmente utilizzando il tipo predefinito int. L’immagine \(f\) può continuare a essere letta normalmente con mm::readImg.

4.9.9.3 🧠 Fondamenti Teorici

Concetto Significato Impatto Visivo
\(\text{dist}(y,x)\) Distanza morfologica fino al bordo più vicino secondo la metrica definita da \(b\) I pixel più interni ricevono valori più alti
Valore massimo Pixel più distante dal bordo Approssima il centro morfologico dell’oggetto
Elemento strutturante ponderato Definisce i costi di spostamento tra pixel vicini Determina la metrica della distanza utilizzata
Oggetti sottili Regioni strette dell’oggetto Producono valori bassi di distanza

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

⚠️ Nota di implementazione: Gli elementi della matrice \(f\) (0 o 1) devono essere moltiplicati per 255 per generare un’immagine binaria adeguata (\(0\) e \(255\)) prima di applicare la Trasformata della Distanza (TD).

Output:

  • Matrice della trasformata della distanza in \(L\) righe e \(C\) colonne.

4.9.9.5 📌 Esempio

Input Output Osservazione
5
9
3
3
-99 -1 -99
-1 0 -1
-99 -1 -99
0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 0
0 1 2 2 2 2 2 1 0
0 1 1 1 1 1 1 1 0
0 0 0 0 0 0 0 0 0
Risultato della trasformata della distanza.

Nota: il valore -99 agisce come un’approssimazione pratica di \(-\infty\), impedendo la propagazione attraverso le diagonali. In questo modo, solo i vicini orizzontali e verticali contribuiscono alla distanza, producendo la distanza di Manhattan.

🗺️ Simulatore EP04_09: Trasformata della Distanza Livelli di Erosione

Fai clic sulle celle per disegnare il tuo oggetto oppure seleziona una forma predefinita per calcolare la mappa delle distanze a cascata.

Mappa delle Distanze Calcolata
Figura 4.38: Simulatore EP04_09: Trasformata della Distanza (Livelli di Erosione)
%%writefile EP04_09.cpp
// your solution
Overwriting EP04_09.cpp
TestSuite("EP04_09.cpp").run()
✔️ EP04_09.cases esiste già in casos/
📋 4 caso/i caricato/i da casos/EP04_09.cases

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