Haz clic sobre las celdas de la Imagen Binaria para alternar los píxeles del objeto (1) y observa el mapa de menor distancia calculado en la matriz resultante.
2.12.4 EP02_04 📐 Transformada de Distancia en Imagen Binaria
Dada una imagen binaria donde los píxeles de valor 1 representan el objeto y los píxeles 0 representan el fondo, la distancia de un píxel de fondo recibe la menor distancia al píxel de objeto más cercano. Los píxeles de objeto reciben distancia 0. Para simplificar, considere que la imagen tiene solo un único objeto con un píxel de valor 1.
Problema: Lea una imagen binaria \(L \times C\) y una métrica, y calcule esa distancia simplificada aplicando una de las tres fórmulas:
\[d_{\text{Euclidiana}} = \sqrt{(\Delta r)^2 + (\Delta c)^2}\]
\[d_{\text{City-block}} = |\Delta r| + |\Delta c|\]
\[d_{\text{Chessboard}} = \max(|\Delta r|,\; |\Delta c|)\]
donde \(\Delta r\) es la diferencia de filas y \(\Delta c\) la diferencia de columnas entre dos píxeles.
2.12.4.1 🖼️ ¿Por qué es importante? - Aplicaciones de la DT
La Transformada de Distancia (DT) aparece en decenas de pipelines de visión por computadora:
| Métrica | Complejidad | Aplicación típica |
|---|---|---|
| Euclidiana | 🔴 \(O(n^2)\) ingenuo | Esqueletización, emparejamiento de formas |
| City-block | 🟡 \(O(n)\) con 2 pasadas | Morfología, dilatación/erosión |
| Chessboard | 🟢 \(O(n)\) con 2 pasadas | Morfología, dilatación/erosión |
2.12.4.2 📌 Requisitos Técnicos
- Entrada: * Primera línea: \(L\) y \(C\) (enteros).
- Segunda línea: nombre de la métrica (
euclidean,cityblockochessboard).
- A continuación, la matriz binaria \(L \times C\) (valores 0 o 1).
- Segunda línea: nombre de la métrica (
- Píxeles de objeto (1): distancia \(= 0\) (o \(0.00\) para euclidiana).
- Píxeles de fondo (0): distancia al único píxel de objeto en la imagen.
- Redondeo (euclidiana): imprimir con 2 decimales (formato
:.2f). City-block y Chessboard producen enteros — imprimir sin decimales.
- Salida: valores separados por espacio, una línea por fila de la matriz.
- Ver en Figura 2.15 una simulación de este EP.
2.12.4.3 📌 Ejemplos
| Entrada | Salida | Observación |
|---|---|---|
| 4 4 chessboard 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 |
2 2 2 2 2 1 1 1 2 1 0 1 2 1 1 1 |
La distancia Chessboard es \(\max(\|dx\|, \|dy\|)\). El único píxel objeto es \((2,2)=0\); los demás almacenan su distancia mínima hasta él. |
2.12.4.4 📌 Observaciones finales
- Como la imagen tiene solo un objeto de un píxel, la distancia de cada píxel de fondo es simplemente la distancia de ese píxel al único punto objeto.
- La implementación puede usar fuerza bruta (recorrer todos los píxeles de la imagen y calcular la distancia directamente), ya que \(L\) y \(C\) son pequeños en los casos de prueba.
- Este problema es un calentamiento para la Transformada de Distancia general, que se trabajará en capítulos posteriores con múltiples objetos y algoritmos optimizados.
%%writefile EP02_04.cpp
// your solutionOverwriting EP02_04.cpp
TestSuite("EP02_04.cpp").run()✔️ EP02_04.cases ya existe en casos/
📋 5 caso(s) cargado(s) de casos/EP02_04.cases
🔍 Probando C++: EP02_04.cpp
⚠️ EP02_04.cpp: archivo vacío (menos de 3 líneas). Pruebas omitidas.