PDI+VC · Ejercicio de Programación

EP04_08 — 🌋 Gradiente morfológico, Top-hat y Black-hat

4.9.8 EP04_08 🌋 Gradiente morfológico, Top-hat y Black-hat

En la inspección automática de placas de circuito, tres preguntas aparecen todo el tiempo: ¿dónde están los bordes de los componentes? ¿Qué detalles claros y pequeños (como puntos de soldadura) se destacan del fondo? ¿Qué reentrancias oscuras (como fisuras) esconde el fondo? Un único par erosión/dilatación responde a las tres: el gradiente morfológico evidencia contornos, el top-hat revela picos estrechos, y el black-hat revela valles estrechos — tres herramientas, una sola vecindad. Ver en Figura 4.37 una simulación de este EP.

4.9.8.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\), línea a línea.
  4. Datos: Leer la matriz \(f\) (la imagen original, en tonos de gris), línea a línea.
  5. Operadores de base: Calcular, exactamente como en los EPs 04_03 a 04_06:
    • \(d = f \oplus B\) (dilatación),
    • \(e = f \ominus B\) (erosión),
    • \(\text{abertura} = e \oplus B\),
    • \(\text{fechamento} = d \ominus B\).
  6. Gradiente morfológico: \(\text{grad}(y,x) = d(y,x) - e(y,x)\).
  7. Top-hat: \(\text{tophat}(y,x) = f(y,x) - \text{abertura}(y,x)\).
  8. Black-hat: \(\text{blackhat}(y,x) = \text{fechamento}(y,x) - f(y,x)\).
  9. Salida: Mostrar, en este orden, las tres matrices completas: gradiente, top-hat, black-hat.

4.9.8.2 📌 Restricciones Computacionales

  • Sin padding en ninguna etapa intermedia — dilatación, erosión, apertura y cierre siguen las mismas reglas de vecindad de los EPs anteriores.
  • No hay clipping: las tres salidas pueden contener cualquier valor entero (el gradiente es siempre \(\geq 0\), pero top-hat y black-hat también).
  • Reutilización: \(d\) y \(e\) deben calcularse una única vez y reutilizarse para montar apertura, cierre y gradiente.

4.9.8.3 🧠 Fundamentación Teórica

Operador Fórmula Qué revela
Gradiente \(d - e\) Bordes: cero en regiones planas, alto en las transiciones
Top-hat \(f - \text{abertura}(f)\) Elementos claros y finos, más pequeños que \(B\)
Black-hat \(\text{fechamento}(f) - f\) Elementos oscuros y finos, más pequeños que \(B\)

4.9.8.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 gradiente en \(L\) filas y \(C\) columnas.
  • Matriz top-hat en \(L\) filas y \(C\) columnas.
  • Matriz black-hat en \(L\) filas y \(C\) columnas.

4.9.8.5 📌 Ejemplos

Entrada Salida Observación
9
9
3
3
1 1 1
1 1 1
1 1 1
10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10
10 10 80 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 2 10 10
10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10
(gradiente: halo \(3\times3=70\) en torno a \((2,2)\) y halo \(3\times3=8\) en torno a \((6,6)\), resto \(0\))
(top-hat: único \(70\) en \((2,2)\), resto \(0\))
(black-hat: único \(8\) en \((6,6)\), resto \(0\))
Pico aislado se convierte en top-hat; valle aislado se convierte en black-hat; ambos aparecen en el gradiente
🌋 Simulador EP04_08: Gradiente / Top-hat / Black-hat 3 operadores, 1 vecindad

Agregue picos o valles en la matriz f y observe el comportamiento simultáneo de los operadores de gradiente, top-hat y black-hat.

f (Entrada)
Gradiente
Top-hat
Black-hat
Figura 4.37: Simulador EP04_08: Gradiente Morfológico, Top-hat y Black-hat
%%writefile EP04_08.cpp
// your solution
Overwriting EP04_08.cpp
TestSuite("EP04_08.cpp").run()
✔️ EP04_08.cases ya existe en casos/
📋 4 caso(s) cargado(s) de casos/EP04_08.cases

🔍 Probando C++: EP04_08.cpp
⚠️ EP04_08.cpp: archivo vacío (menos de 3 líneas). Pruebas omitidas.