Detector de bordes Sobel vs Canny

Pasa una imagen de prueba por el pipeline completo de detección de bordes que hay detrás de la visión robótica — escala de grises, desenfoque gaussiano, gradientes de Sobel, supresión de no máximos, histéresis de Canny — y pasa el cursor sobre cualquier paso para inspeccionar las matemáticas detrás de un solo píxel.

Cargando simulación interactiva...

por qué desenfocar primero, y por qué dos umbrales 🖖

Una derivada amplifica todo lo que recibe, incluido el ruido: si diferencias una imagen sin procesar, cada fluctuación de un solo píxel parece un borde. Aplicar primero una convolución gaussiana (paso 2) elimina ese ruido por promediado sin apenas alterar las variaciones de intensidad a gran escala que corresponden a bordes reales. Por eso, todo detector práctico basado en gradientes suaviza la imagen antes de diferenciarla. Los núcleos de Sobel son aproximaciones separables de las derivadas parciales ∂I/∂x y ∂I/∂y, con pesos 1-2-1 en el eje perpendicular para dar más peso a la fila o columna central. Usar un único umbral para el módulo resultante obliga a elegir entre dos males. Si es bajo, el ruido llena la salida de motas; si es alto, los bordes de poco contraste se rompen en fragmentos discontinuos. La histéresis (paso 6) evita este dilema mediante dos umbrales. El umbral alto (Thigh) detecta los bordes con mayor certeza. El umbral bajo (Tlow) solo se aplica a los píxeles que ya están en contacto con un borde fuerte. Así, un contorno real puede atravesar un tramo momentáneamente tenue sin que el ruido llegue a iniciar un contorno propio. La misma idea del doble umbral se emplea en la segmentación por relleno y en los circuitos con disparador de Schmitt, allí donde un único valor de corte produciría oscilaciones.

Dos preguntas sobre una imagen 🖖

Sobel y Canny hacen preguntas distintas sobre la misma imagen. Sobel produce un mapa de gradiente: cada píxel recibe un número que indica cuán bruscamente cambia el brillo allí, así que los bordes salen gruesos y en escala de grises, como un resplandor suave. Canny toma ese mismo gradiente y fuerza una decisión: la supresión de no máximos conserva solo el píxel más brillante a lo ancho de cada cresta, adelgazando el resplandor hasta una nítida línea de un píxel, y luego lo etiqueta como borde o no. Alterna las pestañas Gradiente y Canny para ver cómo un mapa difuso se reduce a un contorno limpio.

Los bordes de Canny esconden un compromiso inherente 🖖

John Canny no llegó a una receta a base de tanteos. En su artículo de 1986 planteó la detección de bordes como una optimización con tres objetivos —detectar bordes reales, ubicarlos con precisión y responder una sola vez por borde— y la resolvió con el cálculo de variaciones; la solución resultó ser casi exactamente la primera derivada de una gaussiana. Lo que también demostró: detección y localización tiran en sentidos opuestos a medida que el desenfoque crece, así que una σ mayor encuentra bordes más tenues pero difumina su posición, y ninguna σ gana en ambas. Desliza σ y compruébalo.

Problema resuelto al detalle

  1. Magnitud del gradiente en el píxel (31, 3) de la imagen de prueba de damero 9 pasos

    La imagen de prueba en tablero de ajedrez —blanco y negro puros, cuadrados de 32 píxeles de ancho— a σ = 1,0 con el núcleo de desenfoque de 3×3, Tlo = 30 y Thi = 80. Deduzca la magnitud del gradiente en el píxel (31, 3), la última columna blanca antes de la primera frontera vertical, y luego calcule de cuántos píxeles de ancho resulta el borde al que pertenece.

    1. Primero la escala de grises, que en esta imagen no hace nada: los tres pesos suman exactamente 1, por lo que un píxel con valores iguales de rojo, verde y azul conserva su valor. El blanco se mantiene en 255, el negro en 0, de modo que cada número a continuación proviene solo de esos dos valores.

    2. Los pesos gaussianos disminuyen con el cuadrado de la distancia. Con σ = 1, el centro recibe 1, los 4 píxeles que comparten un lado reciben e-0,5 = 0,6065 y las 4 esquinas reciben e-1 = 0,3679; dividir entre el total de 4,8976 los convierte en una media ponderada.

    3. La fila 3 se encuentra holgadamente dentro de una franja horizontal, de modo que las 3 filas de cualquier ventana allí son idénticas y la estructura vertical del núcleo se anula. Solo importan los totales de sus columnas, y solo hay 2 de ellos.

    4. Desenfoque a través de la frontera. En x = 31, la ventana cubre 2 columnas blancas y 1 negra; en x = 32, cubre 1 blanca y 2 negras. El escalón nítido de 255 a 0 se ha convertido en la rampa 255, 185, 70, 0; esos 2 valores centrales, redondeados, son los que muestra el inspector.

    5. Sobel pondera la columna izquierda por -1, -2, -1 y la derecha por +1, +2, +1, y la columna central por nada en absoluto. Al ser iguales las 3 filas, esos pesos se reducen a un único factor de 4, por lo que toda la convolución es 4 veces la diferencia entre las columnas de ambos lados.

    6. El gradiente vertical se anula por la razón simétrica especular: la fila por encima del píxel y la fila por debajo de él contienen los mismos 3 números, de modo que la suma de +1, +2, +1 cancela la suma de -1, -2, -1 término a término. Este borde es de gradiente puramente horizontal, lo que facilita el siguiente paso.

    7. Al combinar ambos, la magnitud es simplemente la horizontal.

    8. Compárese con lo que daría el mismo borde sin desenfocar: un escalón simple de 255 a través del mismo núcleo. El suavizado ha consumido 280 cuentas, algo más del 27% de la respuesta disponible, y ese es el precio de la inmunidad al ruido: no una pérdida por redondeo, sino un compromiso deliberado.

    9. Ahora repítalo una columna a la derecha. En x = 32, la ventana lee 185, 70, 0, por lo que la diferencia vuelve a ser -185 y la magnitud vuelve a ser 740. Una columna más hacia afuera a cada lado, la diferencia se reduce a unos -70 y la magnitud a 280.

    Respuesta

    740 — y el borde resulta tener 2 píxeles de ancho. La supresión de no máximos conserva un píxel cuando su magnitud es ≥ que la de ambos vecinos a lo largo del gradiente. Aquí el gradiente apunta a lo largo de x, por lo que el píxel 31 se compara con 280 a su izquierda y 740 a su derecha, y el píxel 32 con 740 y 280. Cada uno empata con el otro, y un empate satisface la condición ≥, por lo que ambos sobreviven; en 740 ambos superan en más de 9 veces Thi = 80, de modo que ambos resultan blancos. Ningún par de umbrales puede separarlos, porque los umbrales no son la causa. La frontera real se sitúa en x = 31,5, exactamente a medio camino entre el último píxel blanco y el primer píxel negro, y un desenfoque simétrico deja el gradiente simétrico respecto a ese semientero: no hay un único máximo que encontrar. Conviene saber esto antes de ajustar nada: una línea duplicada en un mapa de bordes a veces es un fallo de umbralización y a veces es pura aritmética, y aquí se trata de 740 = 740 en una imagen cuyos cuadrados resultan tener un número entero de píxeles de ancho.

Referencias (1)

Problemas de ejemplo

  • Formas limpias - El estado predeterminado: σ = 1,4, con umbrales 30 y 80, en la pestaña Canny. En una geometría limpia, un contorno de un píxel se parece especialmente a un dibujo.
  • Gradiente de tablero de ajedrez - Es el único ajuste predefinido que se detiene en el mapa de gradientes; por eso muestra un halo gris ancho en lugar de tomar una decisión. También corresponde a la configuración del problema resuelto: σ = 1,0, Tlo = 30, Thi = 80.
  • Pistas de circuito - σ = 0,8, el menor desenfoque de estos ajustes, permite conservar intactas las finas pistas de cobre. Los umbrales son idénticos a los de Rostro; σ es lo único que cambia entre ambos.
  • Rostro suavizado - σ = 2,5 con un núcleo de 5×5: el triple de desenfoque que en Placa de circuito, con los mismos umbrales. La textura desaparece y la estructura permanece, aunque también se difumina la posición de los bordes.