| id | area | perimeter | cx | cy | x | y | w | h | circularity | solidity | vertices |
|---|
8.14.7 EP08_07 🟡 Remoção de Ruído Sal e Pimenta e Medição de Objetos
Neste exercício, você aplicará filtragem morfológica para limpar uma imagem binária corrompida por ruído do tipo sal e pimenta (pixels isolados de valor 1 no fundo e 0 no interior dos objetos). Após a limpeza, o programa deve extrair as medições geométricas dos componentes conectados remanescentes, ordená-los e exibir a tabela final de métricas.
8.14.7.1 📋 Diretrizes de Implementação
Entrada: ler dois inteiros \(H\) e \(W\) (altura e largura da imagem) na primeira linha e, em seguida, as \(H\) linhas com a matriz binária contendo pixels
0e1separados por espaço.Filtragem Morfológica: aplicar encadeamento de Abertura (para eliminar o ruído sal no fundo) seguido de Fechamento (para preencher o ruído pimenta dentro dos objetos) com elemento estruturante \(3 \times 3\).
Impressão da Imagem Limpa: imprimir a matriz resultante em valores
0e1separados por espaço.Medição Geométricas: para cada objeto identificado na matriz limpa, extrair:
id: identificador numérico sequencial (reatribuído após a ordenação);area: área calculada via contorno (cv2.contourArea);perimeter: perímetro do contorno (cv2.arcLength);cx,cy: centro de massa (centroide viacv2.moments);x,y,w,h: coordenadas do retângulo delimitador (cv2.boundingRect);circularity: circularidade dada por \(\frac{4 \pi \cdot \text{área}}{\text{perímetro}^2}\);solidity: solidez dada pela razão \(\frac{\text{área}}{\text{área do fecho convexo}}\);vertices: número de vértices aproximado do polígono (cv2.approxPolyDPcom \(\epsilon = 0.02 \times \text{perímetro}\)).
- Ordenação e Saída: ordenar os objetos em ordem crescente pela posição \(X\) do retângulo delimitador (
bbox[0]); em caso de empate, usar a posição \(Y\) (bbox[1]). Reatribuir osids de \(1\) a \(N\) e imprimir a tabela formatada.- Para ordenar, usar
medidas.sort(key=lambda m: (m['bbox'][1], m['bbox'][0])), commedidas = mm.measure(img).
- Para ordenar, usar
8.14.7.2 📌 Restrições e Regras de Ordenação
- Regra de Ordenação dos Objetos:
medidas.sort(key=lambda m: (m['bbox'][0], m['bbox'][1]))- Diferença de Área: A área calculada pelo OpenCV (
cv2.contourArea) mede a área do polígono contínuo delimitado pelos centros dos pixels de borda, resultando em valores numéricos menores do que a simples contagem discreta de pixels1(np.sum).
8.14.7.3 🧠 Fundamentação Teórica
| Operação / Métrica | Função na Filtragem e Caracterização |
|---|---|
| Abertura Morfológica (\(\circ\)) | Erosão seguida de dilatação: remove ruídos brilhantes isolados (sal). |
| Fechamento Morfológico (\(\bullet\)) | Dilatação seguida de erosão: preenche pequenos buracos escuros no interior dos objetos (pimenta). |
cv2.boundingRect |
Retorna \((x, y, w, h)\), o menor retângulo alinhado aos eixos que envolve o objeto. |
| Circularidade e Solidez | Descrevem a compactação e a convexidade geométrica do componente. |
8.14.7.4 📌 Exemplos
| Entrada | Saída |
|---|---|
| 8 9 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 |
id area perimeter cx cy x y w h circularity solidity vertices 1 9.0 12.0 3.5 2.0 3 1 4 3 0.79 1.000 4 2 4.0 8.0 7.5 5.5 7 5 2 2 0.79 1.000 4 |
%%writefile EP08_07.py
# Código PythonWriting EP08_07.py
TestSuite("EP08_07.py").run()✔️ EP08_07.cases já existe em casos/
📋 4 caso(s) carregado(s) de casos/EP08_07.cases
🔍 Testando Python: EP08_07.py
⚠️ EP08_07.py: Arquivo sem conteúdo (menos de 3 linhas). Testes ignorados.