Comparación de algoritmos de detección de bordes - Principios y guía de selección de Sobel, Canny y Laplacian
Fundamentos de detección de bordes - Derivadas de imagen y conceptos de gradiente
La detección de bordes identifica límites donde el brillo cambia abruptamente, formando la base para el reconocimiento de objetos, segmentación y extracción de características. Matemáticamente equivalente a la "diferenciación" de imágenes, calcula la magnitud y dirección de los cambios de brillo.
Detección de bordes por primera derivada (gradiente): Tratando una imagen como una función 2D f(x,y), el vector gradiente en cada punto se define por derivadas parciales. Los puntos con gran magnitud de gradiente son bordes.
|∇f| = √((∂f/∂x)² + (∂f/∂y)²)
La dirección del gradiente θ = arctan(∂f/∂y / ∂f/∂x) indica la dirección perpendicular al borde. Los filtros Sobel y Prewitt son kernels que aproximan discretamente esta primera derivada.
Detección de bordes por segunda derivada (Laplacian): Los puntos de cruce por cero de la segunda derivada (donde los valores cambian de positivo a negativo o viceversa) corresponden a bordes. El Laplacian es un operador isotrópico independiente de la dirección.
∇²f = ∂²f/∂x² + ∂²f/∂y²
Tipos de bordes: Las imágenes reales contienen varios patrones de bordes incluyendo bordes escalón (cambios abruptos), bordes rampa (cambios graduales) y bordes techo (estructuras lineales). Diferentes algoritmos detectan diferentes tipos de bordes más efectivamente, haciendo importante la selección apropiada según el caso de uso.
Filtro Sobel - Detección de bordes direccional por primera derivada
El filtro Sobel es el método de detección de bordes basado en primera derivada más utilizado. Calcula independientemente gradientes horizontales y verticales, combinándolos para la magnitud y dirección del borde. Ofrece un excelente equilibrio entre resistencia al ruido y eficiencia computacional.
Kernels Sobel:
Horizontal (Gx): [[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]
Vertical (Gy): [[-1, -2, -1], [0, 0, 0], [1, 2, 1]]
La ponderación 2× en filas/columnas centrales incorpora suavizado gaussiano, proporcionando mejor resistencia al ruido que filtros de diferencia simples (Prewitt).
Implementación OpenCV:
sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3)
sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3)
magnitude = np.sqrt(sobelx**2 + sobely**2)
direction = np.arctan2(sobely, sobelx)
Especificar cv2.CV_64F para punto flotante de 64 bits preserva los valores de gradiente negativos con precisión. Calcular en 8 bits recorta los negativos, detectando solo bordes unidireccionales.
Parámetro ksize: Seleccionable entre 3, 5, 7. Kernels más grandes mejoran la resistencia al ruido pero reducen la precisión de posición del borde. ksize=3 es lo más común; para imágenes ruidosas, aplicar desenfoque gaussiano primero y luego usar ksize=3 produce mejores resultados que kernels más grandes.
Ventajas y limitaciones de Sobel: Computación rápida, implementación fácil e información direccional son ventajas. Las limitaciones incluyen grosor de borde inconsistente, requisito de umbral e inmunidad al ruido incompleta.
Detección de bordes Canny - Teoría e implementación de detección óptima de bordes
La detección de bordes Canny, propuesta por John Canny en 1986, es un algoritmo teóricamente óptimo diseñado para optimizar tres criterios: buena detección, buena localización y respuesta única. Es el método de detección de bordes más utilizado.
Procesamiento en 4 etapas de Canny:
1. Suavizado gaussiano: Aplica filtro gaussiano para eliminación de ruido. Mayor sigma aumenta la resistencia al ruido pero pierde bordes finos. Típicamente sigma=1.0-2.0.
2. Cálculo de gradiente: Filtros Sobel calculan gradientes horizontales/verticales para magnitud y dirección.
3. Supresión de no máximos: A lo largo de la dirección del gradiente, determina si cada píxel es un máximo local. Los píxeles no máximos se suprimen (se ponen a cero), adelgazando los bordes a 1 píxel de ancho. Esta es la característica clave de Canny, produciendo líneas de borde nítidas imposibles solo con Sobel.
4. Umbralización por histéresis: Usa dos umbrales (T_high, T_low). Píxeles sobre T_high son bordes definitivos; bajo T_low son no-bordes; entre ambos son bordes solo si están conectados a bordes definitivos. Esto previene rupturas de bordes débiles mientras elimina ruido.
Implementación OpenCV:
edges = cv2.Canny(gray, threshold1=50, threshold2=150)
threshold1 corresponde a T_low, threshold2 a T_high. Proporciones de T_high:T_low = 2:1 a 3:1 son generalmente recomendadas.
Filtro Laplacian - Detección de bordes isotrópica por segunda derivada
El filtro Laplacian usa segundas derivadas para detección de bordes isotrópica independiente de la dirección. Mientras Sobel detecta la "magnitud" del gradiente, Laplacian detecta la "tasa de cambio" del gradiente.
Kernels Laplacian:
Básico: [[0, 1, 0], [1, -4, 1], [0, 1, 0]]
Con diagonales: [[1, 1, 1], [1, -8, 1], [1, 1, 1]]
El valor absoluto central iguala la suma circundante, produciendo salida cero en regiones uniformes.
Detección de bordes por cruce por cero: La salida del Laplacian contiene valores positivos y negativos; los bordes se detectan en puntos de cruce por cero. Los cruces por cero permiten localización de bordes sub-píxel, a veces superando la precisión de posición de Sobel.
LoG (Laplacian of Gaussian): Dado que el Laplacian es extremadamente sensible al ruido, se usa prácticamente combinado con suavizado gaussiano como filtro LoG. El sigma gaussiano sirve como parámetro de escala controlando la escala del borde detectado.
log = cv2.GaussianBlur(gray, (0, 0), sigma)
log = cv2.Laplacian(log, cv2.CV_64F)
Aproximación DoG (Difference of Gaussians): Debido al coste computacional del LoG, a menudo se aproxima por la diferencia de gaussianas con diferentes valores de sigma. La detección de características SIFT usa este enfoque DoG.
Ventajas y limitaciones del Laplacian: La detección isotrópica independiente de dirección y la localización de alta precisión por cruce por cero son ventajas. La sensibilidad extrema al ruido, la falta de información direccional y la generación de doble borde (lados positivo y negativo) son limitaciones.
Comparación de rendimiento de tres métodos - Guía de selección por caso de uso
Comparando Sobel, Canny y Laplacian en múltiples ejes de evaluación se proporciona una guía de selección óptima. En la práctica, combinar estos métodos también es común.
Comparación:
- Resistencia al ruido: Canny > Sobel > Laplacian. Canny logra alta resistencia mediante suavizado gaussiano e histéresis. Laplacian amplifica fuertemente el ruido como segunda derivada.
- Delgadez del borde: Canny > Laplacian > Sobel. La supresión de no máximos de Canny produce bordes de 1px de ancho. Sobel tiende a generar bordes gruesos.
- Precisión de posición: Canny ≈ Laplacian > Sobel. La supresión de no máximos y los cruces por cero logran precisión sub-píxel.
- Velocidad de cálculo: Sobel > Laplacian > Canny. Sobel requiere solo convolución simple de kernel. Canny necesita procesamiento de 4 etapas.
- Información de dirección: Sobel (sí) > Canny (sí) > Laplacian (no). Sobel y Canny proporcionan dirección del gradiente.
- Ajuste de parámetros: Sobel (pocos) < Laplacian (pocos) < Canny (muchos). Canny requiere dos umbrales más ajuste de sigma.
Recomendaciones por caso de uso:
- Procesamiento en tiempo real (video, visión robótica): Sobel. Cuando la velocidad de cálculo es la prioridad.
- Detección de bordes general (reconocimiento de objetos, segmentación): Canny. Mejor equilibrio calidad-versatilidad.
- Detección de blobs, análisis de espacio de escala: LoG/Laplacian. Base para detección de características SIFT y SURF.
- Inspección industrial (detección de defectos): Canny + operaciones morfológicas. Detección de bordes de alta precisión seguida de análisis de forma.
Implementación y construcción de pipeline - Pre y post-procesamiento para detección de bordes
Al integrar la detección de bordes en aplicaciones, el pre-procesamiento y post-procesamiento impactan significativamente la calidad del resultado. Construir pipelines completos incluyendo eliminación de ruido, determinación automática de umbral y post-procesamiento de bordes.
Pre-procesamiento: Eliminación de ruido: La eliminación de ruido previa a la detección es esencial. El desenfoque gaussiano (cv2.GaussianBlur) es lo más común, pero el filtro bilateral (cv2.bilateralFilter) preserva mejor los bordes. El filtro de mediana es particularmente efectivo para ruido sal y pimienta.
Determinación automática de umbral Canny: Usar el método de Otsu para encontrar el umbral óptimo de imagen, luego basar los umbrales de Canny en él, es una práctica ampliamente utilizada.
otsu_thresh, _ = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)
edges = cv2.Canny(gray, otsu_thresh * 0.5, otsu_thresh)
Esto permite la configuración adaptativa de umbrales basada en las características de la imagen.
Post-procesamiento: Conexión y refinamiento de bordes: La salida de Canny puede contener bordes rotos. La dilatación (cv2.dilate) conecta bordes cercanos, luego el adelgazamiento restaura el ancho de 1px. La detección de contornos (cv2.findContours) extrae contornos cerrados, con filtrado por área eliminando pequeños contornos de ruido.
Detección de bordes multiescala: Para capturar bordes indetectables a escalas únicas, aplicar Canny con diferentes valores de sigma gaussiano y fusionar resultados. Detecta tanto bordes finos (sigma pequeño) como bordes amplios (sigma grande).
Detección de bordes por aprendizaje profundo: Métodos basados en CNN como HED (Holistically-Nested Edge Detection) y BDCN logran calidad muy superior a los métodos tradicionales. Distinguen bordes semánticos (límites de objetos) de bordes de textura, produciendo resultados más cercanos a la percepción humana. Sin embargo, requieren GPU y tienen alto coste computacional.