PDI+VC · Ejercicio de Programación

EP08_06 — 🟡 Bounding Boxes , Centroides y Propiedades de Instancias con mm.measure

8.14.6 EP08_06 🟡 Bounding Boxes, Centroides y Propiedades de Instancias con mm.measure

En el ejercicio anterior (EP08_05), se puede observar cómo la segmentación por componentes conectados etiqueta regiones binarias contiguas para separar instancias. Sin embargo, para tareas de detección, seguimiento y análisis cuantitativo de objetos, el simple mapa de etiquetas no es suficiente. Se vuelve necesario extraer métricas espaciales y geométricas que caractericen cada instancia individualmente.

Este EP se centra en el cálculo y la extracción automática de las propiedades fundamentales de visión por computadora para cada componente conectado encontrado en la máscara binaria, utilizando el método nativo mm.measure(img) de la biblioteca morph:

  1. Caja Delimitadora (Bounding Box): El rectángulo más pequeño alineado con los ejes que envuelve completamente la instancia, definido por su esquina superior izquierda \((x, y)\), ancho \(w\) y alto \(h\).
  2. Centroide Geométrico \((\bar{x}, \bar{y})\): El centro de masa de la instancia en la cuadrícula discreta, equivalente a los momentos espaciales de primer orden \(M_{10}/M_{00}\) y \(M_{01}/M_{00}\).
  3. Área Geométrica del Contorno (\(A\)): El área delimitada por el contorno de la instancia calculada mediante mm.contourArea(c).

8.14.6.1 📋 Directrices de Implementación

  1. Entrada: Leer las dimensiones \(H \times W\) de la máscara binaria, los \(H \times W\) valores (\(0\) o \(1\)) y el parámetro de conectividad \(c \in \{4, 8\}\).
  2. Extracción Automática con mm.measure: Pasar la imagen binarizada a la función mm.measure(img_bin), que extrae los contornos OpenCV y devuelve una lista de diccionarios que contienen las propiedades geométricas de cada instancia.
  3. Propiedades Devueltas: Para cada diccionario \(m\) de la lista devuelta por medidas = mm.measure(img_bin):
    • Área (area): Valor numérico del área geométrica del contorno mm.contourArea(c).
    • Bounding Box (bbox): Tupla \((x, y, w, h)\) que representa la esquina superior izquierda, el ancho y el alto.
    • Centroide (center): Tupla \((c_x, c_y)\) con las coordenadas del centro de masa \(M_{10}/M_{00}\) y \(M_{01}/M_{00}\). Formatear con dos decimales.
  4. Salida: Para cada instancia \(1, \dots, K\) encontrada (ordenada por orden de descubrimiento/posición en la imagen), imprimir una línea que contenga sus propiedades. Finalmente, imprimir el número total de instancias.
    • Para ordenar, usar medidas.sort(key=lambda m: (m['bbox'][1], m['bbox'][0])).

8.14.6.2 🧠 Fundamentación Teórica

Propiedad en mm.measure Cálculo Matemático / Lógica Discreta Aplicación Práctica en Visión
bbox (OpenCV) \([x, y, w, h] = [\min(c), \min(r), \Delta c + 1, \Delta r + 1]\) Formato clásico de OpenCV. Nota: redes como YOLO convierten este rectángulo a \((c_x, c_y, w, h)\) normalizado.
center \(\bar{x} = \frac{M_{10}}{M_{00}}, \quad \bar{y} = \frac{M_{01}}{M_{00}}\) Centro de masa exacto de la máscara (usado en seguimiento y análisis de trayectoria).
area \(A = \text{contourArea}(C)\) (Fórmula del Polígono) Métrica continua de la superficie del objeto.

8.14.6.3 📦 Especificación de Entrada y Salida (VPL)

Entrada:

  • Línea 1: Enteros \(H\) y \(W\).
  • Siguientes \(H\) líneas: \(W\) enteros (\(0\) o \(1\)) cada una.
  • Última línea: Entero \(c\) (\(4\) o \(8\)).

Salida:

  • Una línea por instancia en el orden de descubrimiento: Instancia l: Area=A, BBox=(x,y,w,h), Centroide=(cx,cy)
  • Última línea: Total de instancias: K.

8.14.6.4 📌 Ejemplos

Entrada Salida Observación
6 6
0 0 0 0 0 0
0 1 1 0 0 0
0 1 1 0 0 0
0 0 0 0 0 0
0 0 0 0 1 1
0 0 0 0 1 1
8
Instancia 1: Area=1.0, BBox=(1,1,2,2), Centroide=(1.50,1.50)
Instancia 2: Area=1.0, BBox=(4,4,2,2), Centroide=(4.50,4.50)
Total de instancias: 2
Bloques \(2\times2\) alineados. El cálculo del área geométrica del contorno resulta en \(1.0\). El centroide del bloque en las columnas 1–2 y filas 1–2 es exactamente \((1.50,\,1.50)\).
4 6
0 0 0 0 0 0
0 1 1 1 1 0
0 0 0 1 0 0
0 0 0 0 0 0
4
Instancia 1: Area=2.0, BBox=(1,1,4,2), Centroide=(2.40,1.20)
Total de instancias: 1
Objeto asimétrico en forma de “T” invertida. El área geométrica del contorno es \(2.0\). El centroide refleja la distribución de los píxeles del objeto.
🧮 Simulador EP08_06: Métricas Morfológicas Nativas (mm.measure) OpenCV Contour& Momentos
ACCIÓN
Parámetro de precisión (approxPolyDP): precision = 0.01
MAPA DE ETIQUETAS DE INSTANCIAS
MÉTRICAS EXTRAÍDAS POR MM.MEASURE
id área perímetro centro (cx, cy) bbox (x,y,w,h) circularidad solidez vértices
Figura 8.20: Simulador EP08_06: Extracción de Bounding Boxes, Centroides y Propiedades con mm.measure
%%writefile EP08_06.py
# Código Python
Overwriting EP08_06.py
TestSuite("EP08_06.py").run()
✔️ EP08_06.cases ya existe en casos/
📋 3 caso(s) cargado(s) de casos/EP08_06.cases

🔍 Probando Python: EP08_06.py
⚠️ EP08_06.py: archivo vacío (menos de 3 líneas). Pruebas omitidas.