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, ruído incluído — derive uma imagem bruta e cada flutuação de um único pixel parece uma borda. Convoluir primeiro com uma gaussiana (etapa 2) faz a média desse ruído sem quase afetar as mudanças de intensidade em larga escala que são bordas reais de verdade, por isso todo detector de bordas baseado em gradiente na prática suaviza antes de derivar. Os próprios núcleos de Sobel são aproximações separáveis das derivadas parciais ∂I/∂x e ∂I/∂y, ponderadas 1-2-1 ao longo do eixo perpendicular para inclinar a estimativa em direção à linha ou coluna central. Um único limiar sobre a magnitude resultante força uma escolha impossível: defina-o baixo e o ruído mancha a saída; defina-o alto e bordas de baixo contraste se quebram em fragmentos tracejados. A histerese (etapa 6) escapa dessa contrapartida usando dois limiares em vez de um — o limiar alto (T_high) encontra bordas das quais está confiante, e o limiar baixo (T_low), aplicado apenas a pixels que já tocam uma borda forte, permite que um contorno real continue através de um trecho temporariamente fraco sem deixar o ruído iniciar seu próprio contorno. Essa é a mesma ideia de limiar duplo usada na segmentação por preenchimento por difusão (flood-fill) e em circuitos de gatilho Schmitt, em qualquer lugar onde um único corte causaria oscilação.

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.

Problemas de exemplo

  • Formas limpas - Formas geométricas — configurações padrão do Canny, mapa de bordas binário limpo
  • Gradiente de tabuleiro de xadrez - Tabuleiro de xadrez — bordas em degrau ideais, resposta máxima do Sobel nas transições
  • Trilhas de circuito - Placa de circuito — s baixo preserva trilhas finas de cobre na saída do Canny
  • Rosto suavizado - Rosto com s=2.5 — o desfoque intenso remove a textura, mantendo as bordas estruturais