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

EP04_04 — 🪨 Erosão Binária Plana (mm.ero0)

4.9.4 EP04_04 🪨 Erosão Binária Plana (mm.ero0)

Se a dilatação engrossa, a erosão afina. Em sistemas de contagem de células, ela é usada para separar células que se tocam: ao “comer” as bordas de cada região, conexões finas entre objetos desaparecem antes mesmo de qualquer contagem ser feita. Em morph.py, essa é a operação mm.ero0(f, B) — a dual exata da dilatação, e a única das duas que não reflete o elemento estruturante. Ver na Figura 4.33 uma simulação deste EP.

4.9.4.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 \(f\) (a imagem original), linha a linha.
  5. Vizinhança sem padding (sem reflexão!): Para cada pixel \((y,x)\), percorrer as posições \((by,bx)\) de \(B\) na ordem original (sem refletir), usando o mesmo deslocamento do EP04_03: \[ v_y = y + by + o_y,\quad v_x = x + bx + o_x,\quad o_y=-\tfrac{L_B}{2}+0{,}5,\quad o_x=-\tfrac{C_B}{2}+0{,}5 \]

Descartar todo \((v_y,v_x)\) fora de \([0,L)\times[0,C)\). 6. Mapeamento: Calcular cada pixel de saída como o mínimo entre \(f(y,x)\) e todos os \(f(v_y,v_x)\) válidos cuja posição correspondente em \(B\) vale \(1\): \[ g(y,x) = \min\Big(f(y,x),\ \min_{\substack{(v_y,v_x)\ \text{válido}\\ B(by,bx)=1}} f(v_y,v_x)\Big) \] 7. Saída: Exibir a matriz \(g\) com dimensões \(L \times C\).

4.9.4.2 📌 Restrições Computacionais

  • Sem reflexão: Diferente da dilatação, \(B\) é usado exatamente como lido — refletir aqui seria um erro conceitual grave.
  • Sem padding: Vizinhos fora da imagem são simplesmente ignorados, nunca tratados como \(0\).
  • Robustez de borda: Se nenhuma posição válida de \(B=1\) cair dentro do domínio, o pixel mantém seu valor original.

4.9.4.3 🧠 Fundamentação Teórica

Conceito Significado Impacto Visual
Erosão \(g \leq f\) sempre (anti-extensiva) Regiões claras encolhem, ruído pontual desaparece
Dualidade \(\text{ero}(f,B) = -\text{dil}(-f, B_{ref})\) Erosão e dilatação são “espelhos” matemáticos
\(B\) maior Erosão mais agressiva Objetos finos somem completamente

4.9.4.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 da matriz \(f\).

Saída:

  • Matriz \(g\) em \(L\) linhas e \(C\) colunas, valores inteiros separados por espaço.

4.9.4.5 📌 Exemplos

Entrada Saída Observação
3
3
3
3
0 1 0
1 1 1
0 1 0
9 9 9
9 0 9
9 9 9
9 0 9
0 0 0
9 0 9
O “buraco” central (0) se propaga em cruz
1
4
1
3
1 1 1
10 200 5 80
10 5 5 80 \(B\) horizontal: cada pixel “puxa” o mínimo dos vizinhos da linha
🪨 Simulador EP04_04: Erosão Plana (mm.ero0) g = f ⊖ B

Alterne o elemento estruturante B (ou selecione os presets) e clique nas células da imagem original f para acender ou apagar pixels.

Elemento Estruturante B (Clique para Alternar 0/1)
Imagem Original f (5×5)
Erodida g (f ⊖ B)
 
g(y,x) = min sobre vizinhos válidos de B (sem refletir)
Figura 4.33: Simulador EP04_04: Erosão Binária Plana (g = f ⊖ B)
%%writefile EP04_04.py
# Código Python
Writing EP04_04.py
TestSuite("EP04_04.py").run()
✔️ EP04_04.cases já existe em casos/
📋 5 caso(s) carregado(s) de casos/EP04_04.cases

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