Haz clic en las celdas para dibujar tu propio objeto o selecciona una forma predefinida para calcular el mapa de distancias en cascada.
4.20.9 EP04_09 🗺️ Transformada de Distancia y el “Centro” del Objeto
En robótica móvil, al planificar una ruta dentro de un pasillo, el robot quiere saber no solo dónde hay espacio libre, sino también qué tan lejos está cada punto libre de la pared más cercana. Las rutas más seguras tienden a pasar por el “centro” del pasillo, lejos de los obstáculos.
La transformada de distancia morfológica asigna a cada píxel un valor que representa su distancia hasta el borde más cercano, según la métrica definida por el elemento estructurante. Los píxeles cercanos al borde reciben valores bajos, mientras que los píxeles más internos reciben valores mayores. El píxel de valor máximo corresponde a la región más protegida del objeto, frecuentemente asociada a su centro morfológico.
Ver en Figura 4.38 una simulación de este EP.
4.20.9.1 📋 Directrices de Implementación
- Dimensiones de la imagen: leer los enteros \(L\) (filas) y \(C\) (columnas) de la imagen \(f\).
- Dimensiones de \(B\): leer los enteros \(L_B\) (filas) y \(C_B\) (columnas) del elemento estructurante.
- Elemento estructurante: leer la matriz \(b\), que contiene el valor \(0\) en el centro y valores negativos en las demás posiciones.
- Imagen: leer la matriz binaria \(f\) (valores \(0\) o \(1\)), fila a fila.
- Preparación: multiplicar la imagen por \(L\times C\), asegurando que los píxeles internos tengan un valor inicial suficientemente alto para la propagación de las distancias.
- Transformada de distancia: calcular la matriz de distancias utilizando el método
mm.dist1(f,b). - Salida: mostrar la matriz resultante de la transformada de distancia.
4.20.9.2 📌 Restricciones Computacionales
- Utilizar la implementación de erosión ponderada proporcionada por la biblioteca.
- El elemento estructurante puede contener valores negativos arbitrarios.
- La transformada debe obtenerse mediante la aplicación iterativa de erosiones ponderadas hasta alcanzar un punto fijo.
⚠️ Nota Crucial sobre Lectura de Matrices: Como el elemento estructurante puede contener valores enteros negativos (por ejemplo, -1 y -99), no utilice la función mm.readImg para leer la matriz \(b\). Esa función convierte los datos al tipo uint8, provocando underflow y corrompiendo los valores negativos. Lea las \(L_B\) filas de \(b\) manualmente utilizando el tipo estándar int. La imagen \(f\) puede seguir leyéndose normalmente con mm.readImg.
4.20.9.3 🧠 Fundamentación Teórica
| Concepto | Significado | Impacto Visual |
|---|---|---|
| \(\text{dist}(y,x)\) | Distancia morfológica hasta el borde más cercano según la métrica definida por \(b\) | Los píxeles más internos reciben valores mayores |
| Valor máximo | Píxel más distante del borde | Aproxima el centro morfológico del objeto |
| Elemento estructurante ponderado | Define los costos de desplazamiento entre píxeles vecinos | Determina la métrica de distancia utilizada |
| Objetos finos | Regiones estrechas del objeto | Producen valores bajos de distancia |
4.20.9.4 📦 Especificación de Entrada y Salida (VPL)
Entrada:
- Línea 1: entero \(L\).
- Línea 2: entero \(C\).
- Línea 3: entero \(L_B\).
- Línea 4: entero \(C_B\).
- Siguientes \(L_B\) líneas: elementos enteros de la matriz \(b\).
- Siguientes \(L\) líneas: elementos binarios (\(0\) o \(1\)) de la matriz \(f\).
⚠️ Nota de implementación: Los elementos de la matriz \(f\) (0 o 1) deben multiplicarse por 255 para generar una imagen binaria adecuada (\(0\) y \(255\)) antes de aplicar la Transformada de Distancia (TD).
Salida:
- Matriz de la transformada de distancia en \(L\) filas y \(C\) columnas.
4.20.9.5 📌 Ejemplo
| Entrada | Salida | Observación |
|---|---|---|
| 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 |
Resultado de la transformada de distancia. |
Nota: el valor -99 actúa como una aproximación práctica de \(-\infty\), impidiendo la propagación por las diagonales. De esta forma, solo los vecinos horizontal y vertical contribuyen a la distancia, produciendo la distancia de Manhattan.
%%writefile EP04_09.py
# Código PythonOverwriting EP04_09.py
TestSuite("EP04_09.py").run()✔️ EP04_09.cases ya existe en casos/
📋 4 caso(s) cargado(s) de casos/EP04_09.cases
🔍 Probando Python: EP04_09.py
⚠️ EP04_09.py: archivo vacío (menos de 3 líneas). Pruebas omitidas.