Detector de bordas Sobel vs Canny

Faça uma imagem de teste passar pelo pipeline completo de detecção de bordas por trás da visão robótica — escala de cinza, desfoque gaussiano, gradientes de Sobel, supressão de não máximos, histerese de Canny — e passe o cursor sobre qualquer etapa para inspecionar a matemática por trás de um único pixel.

A carregar a simulação interativa...

por que desfocar primeiro, e por que dois limiares 🖖

Uma derivada amplifica tudo o que recebe, incluindo o ruído. Ao derivar uma imagem em bruto, cada oscilação de um único píxel parece uma aresta. Aplicar primeiro uma convolução gaussiana (passo 2) elimina esse ruído por suavização, quase sem afetar as variações de intensidade em grande escala que correspondem a arestas reais. Por isso, todos os detetores práticos baseados no gradiente suavizam a imagem antes de a derivarem. Os próprios núcleos de Sobel são aproximações separáveis das derivadas parciais ∂I/∂x e ∂I/∂y, com pesos 1-2-1 ao longo do eixo perpendicular, para dar maior influência à linha ou coluna central. Aplicar um único limiar à magnitude resultante obriga a uma escolha impossível: se for baixo, o ruído salpica a imagem de saída; se for alto, as arestas de baixo contraste desfazem-se em fragmentos descontínuos. A histerese (passo 6) resolve este problema recorrendo a dois limiares. O limiar superior (Thigh) identifica as arestas com maior grau de confiança. O limiar inferior (Tlow) aplica-se apenas aos píxeis que já estão em contacto com uma aresta forte. Assim, um contorno real pode atravessar um trecho momentaneamente ténue sem que o ruído dê origem a um novo contorno. É o mesmo princípio de limiar duplo usado na segmentação por preenchimento e nos circuitos com disparador de Schmitt, sempre que um único valor de corte provocaria oscilações.

Duas perguntas sobre uma imagem 🖖

Sobel e Canny fazem perguntas diferentes sobre a mesma imagem. O Sobel produz um mapa de gradiente: cada pixel recebe um número que indica quão bruscamente o brilho muda ali, de modo que as bordas saem grossas e em escala de cinza, como um brilho suave. O Canny toma esse mesmo gradiente e força uma decisão: a supressão de não máximos mantém apenas o pixel mais claro ao longo da largura de cada crista, afinando o brilho até uma nítida linha de um pixel, e então a rotula como borda ou não. Alterne entre as abas Gradiente e Canny para ver um mapa difuso reduzir-se a um contorno limpo.

As bordas de Canny escondem um compromisso embutido 🖖

John Canny não chegou a uma receita por tentativa e erro. Em seu artigo de 1986, formulou a detecção de bordas como uma otimização com três objetivos — detectar bordas reais, localizá-las com precisão e responder apenas uma vez por borda — e a resolveu com o cálculo de variações; a solução resultou quase exatamente na primeira derivada de uma gaussiana. O detalhe que ele também provou: detecção e localização puxam em sentidos opostos conforme o desfoque aumenta, então um σ maior encontra bordas mais fracas mas borra sua posição, e nenhum σ é o melhor em ambas. Deslize σ e veja acontecer.

Problema resolvido na íntegra

  1. Magnitude do gradiente no píxel (31, 3) da imagem de teste em xadrez 9 passos

    A imagem de teste em xadrez — preto e branco puros, quadrados de 32 píxeis de largura — a σ = 1,0 com o núcleo de desfocagem 3×3, Tlo = 30 e Thi = 80. Deduza a magnitude do gradiente no pixel (31, 3), a última coluna branca antes da primeira fronteira vertical, e depois determine com quantos píxeis de largura fica a aresta a que pertence.

    1. Primeiro a escala de cinzentos, que nesta imagem não faz nada: os três pesos somam exatamente 1, pelo que um pixel com valores iguais de vermelho, verde e azul mantém o seu valor. O branco mantém-se em 255, o preto mantém-se em 0, pelo que todos os números abaixo provêm apenas desses dois valores.

    2. Os pesos gaussianos diminuem com o quadrado da distância. A σ = 1 o centro recebe 1, os 4 píxeis que partilham uma aresta recebem e-0,5 = 0,6065 e os 4 cantos recebem e-1 = 0,3679; dividindo pelo total de 4,8976 obtém-se uma média ponderada.

    3. A linha 3 situa-se bem dentro de uma faixa horizontal, pelo que as 3 linhas de qualquer janela aí situada são idênticas e a estrutura vertical do núcleo anula-se. Apenas os seus totais de coluna importam, e há apenas 2 deles.

    4. Desfocagem ao longo da fronteira. Em x = 31 a janela cobre 2 colunas brancas e 1 preta; em x = 32 cobre 1 branca e 2 pretas. O degrau abrupto de 255 para 0 tornou-se na rampa 255, 185, 70, 0 — esses 2 valores intermédios, arredondados, são os que o inspecionador mostra.

    5. O Sobel pondera a coluna da esquerda por -1, -2, -1 e a da direita por +1, +2, +1, e a coluna central por nada. Sendo as 3 linhas iguais, esses pesos colapsam num único fator de 4, pelo que toda a convolução é 4 vezes a diferença entre as colunas de cada lado.

    6. O gradiente vertical anula-se pela razão simétrica oposta: a linha acima do pixel e a linha abaixo dele têm os mesmos 3 números, pelo que a soma +1, +2, +1 anula a soma -1, -2, -1 termo a termo. Esta aresta tem um gradiente puramente horizontal, o que facilita o passo seguinte.

    7. Ao combinar ambos, a magnitude é simplesmente a horizontal.

    8. Compare com o que a mesma aresta daria sem desfocagem: um simples degrau de 255 através do mesmo núcleo. O suavizamento consumiu 280 contagens, um pouco mais de 27% da resposta disponível, e esse é o preço da imunidade ao ruído — não uma perda por arredondamento, mas uma troca deliberada.

    9. Agora repita uma coluna para a direita. Em x = 32 a janela lê 185, 70, 0, pelo que a diferença é novamente -185 e a magnitude é novamente 740. Uma coluna mais para fora de qualquer um dos lados, a diferença colapsa para cerca de -70 e a magnitude para 280.

    Resposta

    740 — e a aresta fica com 2 píxeis de largura. A supressão de não-máximos mantém um pixel quando a sua magnitude é ≥ a ambos os vizinhos ao longo do gradiente. Aqui o gradiente aponta ao longo de x, pelo que o pixel 31 é comparado com 280 à sua esquerda e 740 à sua direita, o pixel 32 com 740 e 280. Cada um empata com o outro, e um empate satisfaz ≥, pelo que ambos sobrevivem; a 740 ambos são mais de 9 vezes Thi = 80, pelo que ambos ficam brancos. Nenhum par de limiares os consegue separar, porque os limiares não são a causa. A fronteira real situa-se em x = 31,5, exatamente a meio caminho entre o último pixel branco e o primeiro preto, e uma desfocagem simétrica deixa o gradiente simétrico em torno desse valor meio-inteiro — não há um único máximo para encontrar. É algo que vale a pena saber antes de ajustar o quer que seja: uma linha duplicada num mapa de arestas é por vezes uma falha de limiarização e por vezes aritmética, e aqui é 740 = 740 numa imagem cujos quadrados acontecem ter um número inteiro de píxeis de largura.

Referências (1)

Problemas de exemplo

  • Formas limpas - O estado predefinido: σ = 1,4, com limiares de 30 e 80, no separador Canny. É na geometria simples que um contorno de um píxel mais se aproxima de um desenho.
  • Gradiente de tabuleiro de xadrez - A única predefinição que termina no mapa do gradiente, mostrando o halo cinzento espesso em vez de uma decisão. É também a configuração do problema resolvido: σ = 1,0, Tlo = 30, Thi = 80.
  • Trilhas de circuito - σ = 0,8, a menor suavização disponível, preserva as finas pistas de cobre. Os limiares são iguais aos de «Face»; entre as duas configurações, apenas σ muda.
  • Rosto suavizado - σ = 2,5, com um núcleo 5×5, produz três vezes mais suavização do que «Placa de circuito» com os mesmos limiares. A textura desaparece e a estrutura permanece, embora as posições das arestas também se esbatam.