O que é erosão em processamento de imagens e por que ela quebra tudo se você aplicar sem pensar
A erosão é uma operação morfológica básica que funciona reduzindo os pixels brancos (regiões foreground) de uma imagem binária. O princípio é simples: você passa uma estrutura de análise — um kernel ou footprint — sobre cada pixel e, se qualquer pixel sob o kernel for preto (zero), o pixel central vira preto. Somente quando todos os pixels sob o kernel são brancos o pixel sobrevive. É isso. Nada mais. Muita gente começa a brincar com filtros e joga erosão em qualquer imagem colorida sem conversão prévia, e obviamente o resultado é inutilizável. A primeira coisa que precisa acontecer é transformar a imagem em binária, ou pelo menos em escala de cinza e depois threshold. Sem isso, a operação morfológica não tem o que atacar.
Como aplicar fotos de erosão na prática
O fluxo básico que eu uso é: carregar a imagem, converter para grayscale, aplicar threshold (Otsu costuma funcionar bem como ponto de partida), aplicar a erosão com um kernel adequado, e depois, na maioria dos casos, aplicar a dilatação logo em seguida para recuperar o que foi perdido. A combinação dos dois se chama abertura (opening). Se você só aplica erosão e para aí, os objetos vão encolher e pedaços inteiros podem desaparecer completamente. Em Python com OpenCV, o comando real é muito curto:
kernel = np.ones((5,5), np.uint8)
erosao = cv2.erode(imagem_binaria, kernel, iterations=1) O valor de iterations é onde as pessoas estragam. Um único passe com kernel 5x5 já remove bordas consideráveis em objetos pequenos. Duas iterações com o mesmo kernel pode eliminar completamente objetos que tenham menos de 10 pixels de espessura. Eu costumo começar com iterations=1 e ir aumentando apenas se o ruído ainda estiver presente.
Eu tive um caso recente em que estava processando imagens de placas metálicas para detecção de trincas. As trincas apareciam como linhas finas escuras sobre um fundo claro. Minha primeira tentativa foi aplicar erosão diretamente na imagem thresholdada, achando que ia suavizar o ruído. O problema era que a erosão estava apagando as próprias trincas — elas eram finas demais e o kernel as engolia inteiras. A solução foi inverter a lógica: em vez de erosionar o foreground das trincas, eu aplicava a abertura (erosão seguida de dilatação) no fundo para remover manchas de ruído sem tocar nas linhas. Depois usava dilatação para espessar levemente as trincas antes do detecção final. O ganho foi de praticamente zero detecções confiáveis para algo em torno de 90% de recall no conjunto de teste.
Erros comuns que todo mundo comete na primeira vez
O erro mais frequente é escolher o tamanho do kernel sem considerar a escala real dos objetos na imagem. Um kernel 3x3 pode ser perfeito para uma imagem em 640x480 e completamente inadequado para a mesma cena em 4K. A proporção entre o objeto de interesse e o kernel importa mais do que o número absoluto de pixels do kernel. Outro erro clássico é achar que erosão serve para remover ruído pointilista em imagens coloridas diretamente. Ela não funciona em espaço RGB. Você precisa converter para HSV ou Lab e trabalhar no canal de luminosidade ou valor. Trabalhar no canal V do HSV costuma dar os melhores resultados porque separa informação de cor de informação de intensidade.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Tem gente que também usa erosão achando que vai melhorar o contraste. Ela não melhora contraste. Ela altera a forma e o tamanho dos objetos. Se o seu problema é contraste baixo, o caminho é equalização de histograma ou CLAHE, não operações morfológicas.
Quando a erosão simplesmente não funciona
A erosão falha completamente em imagens com iluminação não uniforme. Se uma metade da imagem está mais clara que a outra, um threshold global vai gerar artefatos enormes e a erosão vai tratar partes legítimas da imagem como ruído. Nesse cenário, o correto é aplicar adaptive threshold antes de qualquer operação morfológica, ou fazer correção de iluminação com background estimation. Também não adianta usar erosão em imagens com bordas naturalmente irregulares esperando um resultado limpo. Ela vai apenas tornar a irregularidade mais pronunciada em alguns casos e suavizar em outros, de forma imprevisível dependendo da relação entre o formato do kernel e a frequência das irregularidades.
Se o seu objetivo final é segmentação de objetos sobrepostos, a erosão sozinha vai apenas separá-los parcialmente e pode criar fragmentos fantasmas. Nesse caso, watershed ou métodos baseados em distância transform são mais adequados como etapa posterior.
Alternativas e complementos
Se a erosão padrão está destruindo seus objetos, existe a erosão com kernel diferente. Em vez de um quadrado, use um disco (cv2.MORPH_ELLIPSE) ou uma cruz (cv2.getStructuringElement com MORPH_CROSS). O formato do kernel altera completamente como as bordas são tratadas. Um kernel elíptico preserva melhor formas circulares; um kernel em cruz preserva linhas horizontais e verticais mas ataca diagonais de forma diferente. Para remoção de ruído leve sem destruir objetos, a abertura (erosão + dilatação) é quase sempre superior à erosão isolada. Ela remove pontos brancos pequenos mas restaura o tamanho original dos objetos maiores. O preço é que objetos muito pequenos ou finos ainda podem sumir, então o tamanho do kernel continua sendo o fator crítico.
Em casos onde você precisa preservar bordas enquanto remove ruído interno, considere usar morphological gradient ou top-hat transform. Eles extraem detalhes finos que a erosão sozinha destrói, e muitas vezes são mais úteis no pipeline do que a operação básica. A regra prática que eu sigo agora é sempre comparar a imagem original com a resultante lado a lado antes de decidir se a operação foi útil. O olho humano nota artefatos que métricas automáticas não capturam. Se após a erosão um objeto que deveria existir desapareceu, você ajustou o parâmetro errado ou escolheu a operação errada. Não é questão de persistir, é questão de mudar a estratégia.