PDI+VC · Ejercicio de Programación

EP04_04 — 🪨 Erosión Binaria Plana (mm.ero0)

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

  1. Dimensiones de la imagen: Leer los enteros \(L\) (filas) y \(C\) (columnas) de \(f\).
  2. Dimensiones de \(B\): Leer los enteros \(L_B\) (filas) y \(C_B\) (columnas) del elemento estructurante.
  3. Elemento estructurante: Leer la matriz \(B\) con valores \(0\) o \(1\), fila a fila.
  4. Datos: Leer la matriz \(f\) (la imagen original), fila a fila.
  5. 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
🪨 Simulador EP04_04: Erosión Plana (mm.ero0) g = f ⊖ B

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.

Elemento Estructurante B (Clic para Alternar 0/1)
Imagen Original f (5×5)
Erosionada g (f ⊖ B)
 
g(y,x) = mínimo sobre vecinos válidos de B (sin reflejar)
Figura 4.33: Simulador EP04_04: Erosión Binaria Plana (g = f ⊖ B)
%%writefile EP04_04.cpp
// your solution
Overwriting 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.