Alterne el elemento estructurante B (o seleccione los presets) y haga clic en las celdas de la imagen original f para encender o apagar píxeles.
4.9.4 EP04_04 🪨 Erosión Binaria Plana (mm.ero0)
Si la dilatación engrosa, la erosión afina. En sistemas de conteo de células, se utiliza para separar células que se tocan: al “comer” los bordes de cada región, las conexiones finas entre objetos desaparecen incluso antes de que se realice cualquier conteo. En morph.py, esta es la operación mm::ero0(f, B) — la dual exacta de la dilatación, y la única de las dos que no refleja el elemento estructurante. Ver en Figura 4.33 una simulación de este EP.
4.9.4.1 📋 Directrices de Implementación
- Dimensiones de la imagen: Leer los enteros \(L\) (filas) y \(C\) (columnas) de \(f\).
- Dimensiones de \(B\): Leer los enteros \(L_B\) (filas) y \(C_B\) (columnas) del elemento estructurante.
- Elemento estructurante: Leer la matriz \(B\) con valores \(0\) o \(1\), fila a fila.
- Datos: Leer la matriz \(f\) (la imagen original), fila a fila.
- Vecindad sin padding (¡sin reflexión!): Para cada píxel \((y,x)\), recorrer las posiciones \((by,bx)\) de \(B\) en el orden original (sin reflejar), usando el mismo desplazamiento del EP04_03: \[ 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 \]
Descartar todo \((v_y,v_x)\) fuera de \([0,L)\times[0,C)\). 6. Mapeo: Calcular cada píxel de salida como el mínimo entre \(f(y,x)\) y todos los \(f(v_y,v_x)\) válidos cuya posición correspondiente en \(B\) vale \(1\): \[ g(y,x) = \min\Big(f(y,x),\ \min_{\substack{(v_y,v_x)\ \text{válido}\\ B(by,bx)=1}} f(v_y,v_x)\Big) \] 7. Salida: Mostrar la matriz \(g\) con dimensiones \(L \times C\).
4.9.4.2 📌 Restricciones Computacionales
- Sin reflexión: A diferencia de la dilatación, \(B\) se usa exactamente como se lee — reflejarlo aquí sería un error conceptual grave.
- Sin padding: Los vecinos fuera de la imagen simplemente se ignoran, nunca se tratan como \(0\).
- Robustez de borde: Si ninguna posición válida de \(B=1\) cae dentro del dominio, el píxel mantiene su valor original.
4.9.4.3 🧠 Fundamentación Teórica
| Concepto | Significado | Impacto Visual |
|---|---|---|
| Erosión | \(g \leq f\) siempre (anti-extensiva) | Las regiones claras se encogen, el ruido puntual desaparece |
| Dualidad | \(\text{ero}(f,B) = -\text{dil}(-f, B_{ref})\) | La erosión y la dilatación son “espejos” matemáticos |
| \(B\) más grande | Erosión más agresiva | Los objetos finos desaparecen por completo |
4.9.4.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 (\(0\) o \(1\)) de la matriz \(B\).
- Siguientes \(L\) líneas: elementos enteros de la matriz \(f\).
Salida:
- Matriz \(g\) en \(L\) filas y \(C\) columnas, valores enteros separados por espacios.
4.9.4.5 📌 Ejemplos
| Entrada | Salida | Observación |
|---|---|---|
| 3 3 3 3 0 1 0 1 1 1 0 1 0 9 9 9 9 0 9 9 9 9 |
9 0 9 0 0 0 9 0 9 |
El “agujero” central (0) se propaga en cruz |
| 1 4 1 3 1 1 1 10 200 5 80 |
10 5 5 80 | \(B\) horizontal: cada píxel “extrae” el mínimo de los vecinos de la fila |
%%writefile EP04_04.cpp
// your solutionOverwriting EP04_04.cpp
TestSuite("EP04_04.cpp").run()✔️ EP04_04.cases ya existe en casos/
📋 5 caso(s) cargado(s) de casos/EP04_04.cases
🔍 Probando C++: EP04_04.cpp
⚠️ EP04_04.cpp: archivo vacío (menos de 3 líneas). Pruebas omitidas.