PDI+VC · Ejercicio de Programación

EP04_10 — 🪙 Separación de Blobs , Etiquetado y Descriptores

4.9.10 EP04_10 🪙 Separación de Blobs, Etiquetado y Descriptores

En una línea de producción de monedas, es común que las piezas se toquen entre sí en la cinta transportadora, formando una única mancha conectada en la imagen — un conteo ingenuo erraría el total. La solución clásica combina operaciones morfológicas y análisis de conectividad: primero una erosión reduce o rompe conexiones frágiles entre objetos, y luego el etiquetado de componentes conectados separa cada objeto en una región distinta. Finalmente, descriptores geométricos (área y caja delimitadora) resumen cada componente encontrado.

Ver en Figura 4.39 una simulación de este EP.

4.9.10.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\), que contiene valores \(0\) o \(1\), fila a fila.

  4. Datos: leer la matriz binaria \(f\) (valores \(0\) o \(1\)), fila a fila.

  5. Separación: calcular \[ f_{ero} = f \ominus B \] usando erosión binaria plana (como en el EP04_04), eliminando conexiones frágiles entre objetos.

  6. Etiquetado: sobre \(f_{ero}\), identificar componentes conectados usando conectividad definida por la vecindad \(B\). El etiquetado debe seguir un barrido raster: al encontrar un píxel \(1\) aún no etiquetado, asignar una nueva etiqueta entera creciente a partir de 1 y propagar esa etiqueta a toda la región conectada.

  7. Descriptores: para cada etiqueta \(k\), calcular:

    • Área: número de píxeles pertenecientes a la etiqueta;
    • Caja delimitadora: \[(y_{min}, x_{min}, y_{max}, x_{max})\]
  8. Salida: mostrar el número total de etiquetas y, a continuación, una línea por etiqueta en el formato: \[ k,\ \text{área},\ y_{min},\ x_{min},\ y_{max},\ x_{max} \]

4.9.10.2 📌 Restricciones Computacionales

  • La erosión debe aplicarse antes del etiquetado.
  • La conectividad es fija y está definida por la vecindad anterior.
  • El elemento estructurante \(B\) no interfiere en la conectividad del etiquetado.
  • Sin padding en ninguna etapa.
  • El orden de las etiquetas sigue la primera detección en el barrido raster.

4.9.10.3 🧠 Fundamentación Teórica

Concepto Significado Impacto
Puente fino Conexión estrecha entre objetos Puede ser eliminado por la erosión morfológica
Conectividad Definida por el conjunto \[\mathcal{N}(y,x)\] Determina qué píxeles pertenecen al mismo componente
Área Número de píxeles por componente Estimación directa del tamaño del objeto
Caja delimitadora Extensión espacial de la etiqueta Resumen geométrico del componente

4.9.10.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: matriz \(B\)
  • Siguientes \(L\) líneas: matriz \(f\)

Salida:

  • Línea 1: número total de etiquetas encontradas
  • Líneas siguientes: \[ k,\ \text{área},\ y_{min},\ x_{min},\ y_{max},\ x_{max} \]
🪙 Simulador EP04_10: Monedas Pegadas → Separadas → Contadas erosión + etiqueta + descriptores

Ajusta el grosor del puente entre las monedas y observa cómo la erosión morfológica separa los objetos para el conteo y la extracción de descriptores (área y cuadro delimitador).


1 píxel
f Original (Pegadas)
Tras Erosión + Etiquetas
Figura 4.39: Simulador EP04_10: Separación de Blobs, Etiquetado y Descriptores
%%writefile EP04_10.cpp
// your solution
Overwriting EP04_10.cpp
TestSuite("EP04_10.cpp").run()
✔️ EP04_10.cases ya existe en casos/
📋 4 caso(s) cargado(s) de casos/EP04_10.cases

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