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

EP04_05 — 🧹 Abertura Morfológica (Remoção de Ruído)

4.9.5 EP04_05 🧹 Abertura Morfológica (Remoção de Ruído)

Imagens capturadas por sensores de baixo custo, como os de drones agrícolas, costumam vir salpicadas de pequenos pontos de ruído — pixels isolados que não representam nada real. Aplicar erosão seguida de dilatação com o mesmo elemento estruturante produz a abertura: ela “limpa” pontos e protuberâncias finas, mas devolve ao objeto principal praticamente seu tamanho original. É a combinação clássica usada em pré-processamento de imagens de satélite antes de qualquer contagem de área plantada. Ver na Figura 4.34 uma simulação deste EP.

4.9.5.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\) com valores \(0\) ou \(1\), linha a linha.
  4. Dados: Ler a matriz binária \(f\) (valores \(0\) ou \(1\)), linha a linha.
  5. Erosão: Calcular \(e = f \ominus B\), usando exatamente o algoritmo do EP04_04 (sem refletir \(B\), sem padding).
  6. Dilatação: Calcular \(g = e \oplus B\), usando exatamente o algoritmo do EP04_03 (refletindo \(B\), sem padding) — mas agora aplicado sobre \(e\), não sobre \(f\).
  7. Saída: Exibir a matriz resultante \(g\) (a abertura de \(f\) por \(B\)) com dimensões \(L \times C\).

4.9.5.2 📌 Restrições Computacionais

  • Ordem fixa: É sempre erosão primeiro, depois dilatação — a ordem inversa define outro operador (fechamento, do próximo EP).
  • Mesmo \(B\): O elemento estruturante usado na erosão e na dilatação deve ser idêntico.
  • Sem padding em nenhuma das duas etapas.

4.9.5.3 🧠 Fundamentação Teórica

Conceito Significado Impacto Visual
Anti-extensividade \(g \subseteq f\) sempre A abertura nunca cria pixel novo, só remove
Idempotência \(\text{abertura}(\text{abertura}(f)) = \text{abertura}(f)\) Aplicar de novo não muda mais nada
Pontos isolados Menores que \(B\) São completamente eliminados
Núcleo do objeto Maior que \(B\) É recuperado quase intacto pela dilatação final

4.9.5.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: elementos inteiros (\(0\) ou \(1\)) da matriz \(B\).
  • Próximas \(L\) linhas: elementos inteiros (\(0\) ou \(1\)) da matriz \(f\).

Saída:

  • Matriz resultante em \(L\) linhas e \(C\) colunas, valores \(0\) ou \(1\).

4.9.5.5 📌 Exemplos

Entrada Saída Observação
7
7
3
3
1 1 1
1 1 1
1 1 1
0 0 0 0 0 0 0
0 1 0 0 0 1 0
0 0 1 1 1 0 0
0 0 1 1 1 0 0
0 0 1 1 1 1 0
0 0 0 0 0 0 0
0 1 0 0 0 0 1
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 1 1 1 0 0
0 0 1 1 1 0 0
0 0 1 1 1 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
Pontos isolados e a protuberância fina desaparecem; o quadrado central sobrevive
🧹 Simulador EP04_05: Abertura Morfológica g = (f ⊖ B) ⊕ B

Clique nas células de f original para acender ou apagar pixels (crie seu próprio ruído de fundo!) e ajuste o tamanho do elemento estruturante B.


3×3
f Original (Clicável)
e = f ⊖ B (Erosão)
g = e ⊕ B (Abertura)
Figura 4.34: Simulador EP04_05: Abertura Morfológica (g = (f ⊖ B) ⊕ B)
%%writefile EP04_05.cpp
// sua solução
Overwriting EP04_05.cpp
TestSuite("EP04_05.cpp").run()
✔️ EP04_05.cases já existe em casos/
📋 5 caso(s) carregado(s) de casos/EP04_05.cases

🔍 Testando C++: EP04_05.cpp
⚠️ EP04_05.cpp: Arquivo sem conteúdo (menos de 3 linhas). Testes ignorados.