PDI+VC · Exercício de Programação

EP08_06 — 🟡 Bounding Boxes , Centroides e Propriedades de Instâncias com mm.measure

8.14.6 EP08_06 🟡 Bounding Boxes, Centroides e Propriedades de Instâncias com mm.measure

No exercício anterior (EP08_05), é possível observar como a segmentação por componentes conectados rotula regiões binárias contíguas para separar instâncias. No entanto, para tarefas de detecção, rastreamento e análise quantitativa de objetos, o simples mapa de rótulos não é suficiente. Torna-se necessário extrair métricas espaciais e geométricas que caracterizem cada instância individualmente.

Este EP foca no cálculo e na extração automática das propriedades fundamentais de visão computacional para cada componente conectado encontrado na máscara binária, utilizando o método nativo mm.measure(img) da biblioteca morph:

  1. Caixa Delimitadora (Bounding Box): O menor retângulo alinhado aos eixos que envolve completamente a instância, definido por seu canto superior esquerdo \((x, y)\), largura \(w\) e altura \(h\).
  2. Centroide Geométrico \((\bar{x}, \bar{y})\): O centro de massa da instância na grade discreta, equivalente aos momentos espaciais de primeira ordem \(M_{10}/M_{00}\) e \(M_{01}/M_{00}\).
  3. Área Geométrica do Contorno (\(A\)): A área delimitada pelo contorno da instância calculada via mm.contourArea(c).

8.14.6.1 📋 Diretrizes de Implementação

  1. Entrada: Ler as dimensões \(H \times W\) da máscara binária, os \(H \times W\) valores (\(0\) ou \(1\)) e o parâmetro de conectividade \(c \in \{4, 8\}\).
  2. Extração Automática com mm.measure: Passar a imagem binarizada para a função mm.measure(img_bin), que extrai os contornos OpenCV e retorna uma lista de dicionários contendo as propriedades geométricas de cada instância.
  3. Propriedades Retornadas: Para cada dicionário \(m\) da lista retornada por medidas = mm.measure(img_bin):
    • Área (area): Valor numérico da área geométrica do contorno mm.contourArea(c).
    • Bounding Box (bbox): Tupla \((x, y, w, h)\) representando o canto superior esquerdo, largura e altura.
    • Centroide (center): Tupla \((c_x, c_y)\) com as coordenadas do centro de massa \(M_{10}/M_{00}\) e \(M_{01}/M_{00}\). Formatar com duas casas decimais.
  4. Saída: Para cada instância \(1, \dots, K\) encontrada (ordenada por ordem de descoberta/posição na imagem), imprimir uma linha contendo suas propriedades. Por fim, imprimir o número total de instâncias.
    • Para ordenar, usar medidas.sort(key=lambda m: (m['bbox'][1], m['bbox'][0])).

8.14.6.2 🧠 Fundamentação Teórica

Propriedade em mm.measure Cálculo Matemático / Lógica Discreta Aplicação Prática em Visão
bbox (OpenCV) \([x, y, w, h] = [\min(c), \min(r), \Delta c + 1, \Delta r + 1]\) Formato clássico do OpenCV. Nota: redes como YOLO convertem esse retângulo para \((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 massa exato da máscara (usado em rastreamento e análise de trajetória).
area \(A = \text{contourArea}(C)\) (Fórmula do Polígono) Métrica contínua da superfície do objeto.

8.14.6.3 📦 Especificação de Entrada e Saída (VPL)

Entrada:

  • Linha 1: Inteiros \(H\) e \(W\).
  • Próximas \(H\) linhas: \(W\) inteiros (\(0\) ou \(1\)) cada.
  • Última linha: Inteiro \(c\) (\(4\) ou \(8\)).

Saída:

  • Uma linha por instância na ordem de descoberta: Instância l: Area=A, BBox=(x,y,w,h), Centroide=(cx,cy)
  • Última linha: Total de instâncias: K.

8.14.6.4 📌 Exemplos

Entrada Saída Observação
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
Instância 1: Area=1.0, BBox=(1,1,2,2), Centroide=(1.50,1.50)
Instância 2: Area=1.0, BBox=(4,4,2,2), Centroide=(4.50,4.50)
Total de instâncias: 2
Blocos \(2\times2\) alinhados. O cálculo da área geométrica do contorno resulta em \(1.0\). O centroide do bloco nas colunas 1–2 e linhas 1–2 é exatamente \((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
Instância 1: Area=2.0, BBox=(1,1,4,2), Centroide=(2.40,1.20)
Total de instâncias: 1
Objeto assimétrico em formato de “T” invertido. A área geométrica do contorno é \(2.0\). O centroide reflete a distribuição dos pixels do objeto.
🧮 Simulador EP08_06: Métricas Morfológicas Nativas (mm.measure) OpenCV Contour & Momentos
AÇÃO
Parâmetro de Precisão (approxPolyDP): precision = 0.01
MAPA DE RÓTULOS DE INSTÂNCIAS
MÉTRICAS EXTRAÍDAS PELO MM.MEASURE
id area perimeter center (cx, cy) bbox (x,y,w,h) circularity solidity vertices
Figura 8.20: Simulador EP08_06: Extração de Bounding Boxes, Centroides e Propriedades com mm.measure
%%writefile EP08_06.py
# Código Python
Writing EP08_06.py
TestSuite("EP08_06.py").run()
✔️ EP08_06.cases já existe em casos/
📋 3 caso(s) carregado(s) de casos/EP08_06.cases

🔍 Testando Python: EP08_06.py
⚠️ EP08_06.py: Arquivo sem conteúdo (menos de 3 linhas). Testes ignorados.