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

EP04_10 — 🪙 Separação de Blobs , Rotulação e Descritores

4.9.10 EP04_10 🪙 Separação de Blobs, Rotulação e Descritores

Em uma linha de produção de moedas, é comum que peças encostem umas nas outras na esteira, formando uma única mancha conectada na imagem — uma contagem ingênua erraria o total. A solução clássica combina operações morfológicas e análise de conectividade: primeiro uma erosão reduz ou rompe conexões frágeis entre objetos, e depois a rotulação de componentes conectados separa cada objeto em uma região distinta. Por fim, descritores geométricos (área e caixa delimitadora) resumem cada componente encontrado.

Ver na Figura 4.39 uma simulação deste EP.

4.9.10.1 📋 Diretrizes de Implementação

  1. Dimensões da imagem: ler os inteiros \(L\) (linhas) e \(C\) (colunas) de \(f\).

  2. Dimensões de \(B\): ler os inteiros \(L_B\) (linhas) e \(C_B\) (colunas) do elemento estruturante.

  3. Elemento estruturante: ler a matriz \(B\), contendo valores \(0\) ou \(1\), linha a linha.

  4. Dados: ler a matriz binária \(f\) (valores \(0\) ou \(1\)), linha a linha.

  5. Separação: calcular \[ f_{ero} = f \ominus B \] usando erosão binária plana (como no EP04_04), eliminando conexões frágeis entre objetos.

  6. Rotulação: sobre \(f_{ero}\), identificar componentes conectados usando conectividade definida pela vizinhança \(B\). A rotulação deve seguir varredura raster: ao encontrar um pixel \(1\) ainda não rotulado, atribuir um novo rótulo inteiro crescente a partir de 1 e propagar esse rótulo a toda a região conectada.

  7. Descritores: para cada rótulo \(k\), calcular:

    • Área: número de pixels pertencentes ao rótulo;
    • Caixa delimitadora: \[(y_{min}, x_{min}, y_{max}, x_{max})\]
  8. Saída: exibir o número total de rótulos e, em seguida, uma linha por rótulo no formato: \[ k,\ \text{área},\ y_{min},\ x_{min},\ y_{max},\ x_{max} \]

4.9.10.2 📌 Restrições Computacionais

  • A erosão deve ser aplicada antes da rotulação.
  • A conectividade é fixa e definida pela vizinhança acima.
  • O elemento estruturante \(B\) não interfere na conectividade da rotulação.
  • Sem padding em qualquer etapa.
  • A ordem dos rótulos segue a primeira descoberta em varredura raster.

4.9.10.3 🧠 Fundamentação Teórica

Conceito Significado Impacto
Ponte fina Conexão estreita entre objetos Pode ser removida pela erosão morfológica
Conectividade Definida pelo conjunto \[\mathcal{N}(y,x)\] Determina quais pixels pertencem ao mesmo componente
Área Número de pixels por componente Estimativa direta do tamanho do objeto
Caixa delimitadora Extensão espacial do rótulo Resumo geométrico do componente

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

Entrada:

  • Linha 1: inteiro \(L\)
  • Linha 2: inteiro \(C\)
  • Linha 3: inteiro \(L_B\)
  • Linha 4: inteiro \(C_B\)
  • Próximas \(L_B\) linhas: matriz \(B\)
  • Próximas \(L\) linhas: matriz \(f\)

Saída:

  • Linha 1: número total de rótulos encontrados
  • Linhas seguintes: \[ k,\ \text{área},\ y_{min},\ x_{min},\ y_{max},\ x_{max} \]
🪙 Simulador EP04_10: Moedas Coladas → Separadas → Contadas erosão + rótulo + descritores

Ajuste a espessura da ponte entre as moedas e observe como a erosão morfológica separa os objetos para contagem e extração de descritores (área e caixa delimitadora).


1 px
f Original (Ligadas)
Após Erosão + Rótulos
Figura 4.39: Simulador EP04_10: Separação de Blobs, Rotulação e Descritores
%%writefile EP04_10.py
# Código Python
Writing EP04_10.py
TestSuite("EP04_10.py").run()
✔️ EP04_10.cases já existe em casos/
📋 4 caso(s) carregado(s) de casos/EP04_10.cases

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