Fai clic sulle celle per disegnare il tuo oggetto oppure seleziona una forma predefinita per calcolare la mappa delle distanze a cascata.
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
- Dimensioni dell’immagine: leggere gli interi \(L\) (righe) e \(C\) (colonne) dell’immagine \(f\).
- Dimensioni di \(B\): leggere gli interi \(L_B\) (righe) e \(C_B\) (colonne) dell’elemento strutturante.
- Elemento strutturante: leggere la matrice \(b\), contenente valore \(0\) al centro e valori negativi nelle altre posizioni.
- Immagine: leggere la matrice binaria \(f\) (valori \(0\) o \(1\)), riga per riga.
- Preparazione: moltiplicare l’immagine per \(L\times C\), garantendo che i pixel interni abbiano un valore iniziale sufficientemente alto per la propagazione delle distanze.
- Trasformata della distanza: calcolare la matrice delle distanze utilizzando il metodo
mm::dist1(f,b). - 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.
%%writefile EP04_09.cpp
// your solutionOverwriting 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.