Alterne o elemento estruturante B (ou selecione os presets) e clique nas células da imagem original f para acender ou apagar pixels.
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
- Dimensões da imagem: Ler os inteiros \(L\) (linhas) e \(C\) (colunas) de \(f\).
- Dimensões de \(B\): Ler os inteiros \(L_B\) (linhas) e \(C_B\) (colunas) do elemento estruturante.
- Elemento estruturante: Ler a matriz \(B\) com valores \(0\) ou \(1\), linha a linha.
- Dados: Ler a matriz \(f\) (a imagem original), linha a linha.
- 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 |
%%writefile EP04_04.py
# Código PythonWriting 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.