Fundamentos de correspondencia de puntos característicos - Principios e implementación de SIFT, ORB y AKAZE
Qué es la correspondencia de características - Encontrar correspondencias entre imágenes
La correspondencia de características identifica posiciones de píxeles en dos o más imágenes que corresponden al mismo punto físico. Forma la base para la unión de panoramas, reconstrucción 3D, reconocimiento de objetos, registro de imágenes y seguimiento AR/VR en aplicaciones de visión por computadora.
Tres pasos de procesamiento:
- Detección: Encontrar puntos distintivos (esquinas, blobs) en la imagen
- Descripción: Codificar la información circundante de cada punto característico como un vector numérico (descriptor)
- Correspondencia: Comparar descriptores entre dos imágenes y emparejar aquellos con alta similitud
Propiedades de buenas características: Se requiere repetibilidad (mismo punto detectado en diferentes imágenes), distinción (distinguible de otros puntos) e invariancia (estable ante rotación, escala y cambios de iluminación). Los puntos en regiones planas o sobre bordes tienen baja distinción; las esquinas y blobs (agrupaciones locales de brillo) son buenas características.
Desarrollo histórico: Detección de esquinas Harris (1988) → SIFT (1999/2004) → SURF (2006) → ORB (2011) → AKAZE (2013). SIFT estuvo protegido por patente durante años pero la patente expiró en 2020, haciéndolo libremente disponible en OpenCV. Actualmente, elegir entre SIFT, ORB y AKAZE según los requisitos de la aplicación es la práctica estándar.
SIFT - Principios e implementación de la Transformada de Características Invariante a Escala
SIFT (Scale-Invariant Feature Transform), publicado por David Lowe en 2004, genera descriptores invariantes a cambios de escala y rotación. Considerado el estándar de oro para correspondencia de características por su precisión, sigue logrando el mejor rendimiento en muchos escenarios más de 20 años después.
Construcción del espacio de escala: Desenfoca la imagen con gaussianas a diferentes escalas (σ) y calcula diferencias entre escalas adyacentes (DoG: Difference of Gaussians). DoG aproxima el Laplaciano (LoG) y es óptimo para detección de blobs. Típicamente genera 20 imágenes DoG en 4 octavas × 5 escalas.
Detección de puntos clave: Compara cada píxel en imágenes DoG con 26 vecinos en una región 3×3×3, identificando extremos (máximos/mínimos locales) como candidatos a puntos clave. Después del refinamiento de posición sub-píxel, eliminación de puntos de bajo contraste y eliminación de puntos de borde, solo quedan puntos clave estables.
Asignación de orientación: Determina la orientación dominante del histograma de dirección de gradiente (36 bins) alrededor del punto clave. Esto logra invariancia a la rotación.
Generación de descriptor: Divide la región 16×16 alrededor del punto clave en sub-regiones 4×4, calculando histogramas de gradiente de 8 direcciones para cada una. Esto produce un vector descriptor de 128 dimensiones (4×4×8=128).
Implementación OpenCV:
sift = cv2.SIFT_create(nfeatures=500)
kp, des = sift.detectAndCompute(gray, None)
Rendimiento: Aproximadamente 300-500ms (CPU) para imágenes de 1920×1080. Típicamente detecta 1000-5000 puntos. Mayor precisión pero velocidad más lenta.
ORB - Descriptor de características rápido y gratuito
ORB (Oriented FAST and Rotated BRIEF), publicado en 2011 por desarrolladores de OpenCV, fue diseñado como alternativa a SIFT. Usar descriptores binarios permite computación rápida adecuada para aplicaciones en tiempo real.
Detección de puntos clave (Oriented FAST): Basado en el detector de esquinas FAST, filtrado por respuesta de esquina Harris, con pirámide de imagen para detección multiescala. Se asigna orientación a cada punto clave usando el método de Centroide de Intensidad para invariancia a la rotación.
Descriptor (Rotated BRIEF): BRIEF genera descriptores binarios de 256 bits comparando pares de píxeles alrededor de puntos clave. ORB rota las posiciones de los pares según la orientación del punto clave (rBRIEF) para lograr invariancia a la rotación.
Ventajas del descriptor binario:
- El cálculo de distancia usa distancia de Hamming (XOR + popcount) para correspondencia ultra-rápida
- El uso de memoria es 1/16 de SIFT (256 bits = 32 bytes vs 128×4 = 512 bytes de SIFT)
- Fácil computación paralela con instrucciones SIMD
Implementación OpenCV:
orb = cv2.ORB_create(nfeatures=1000)
kp, des = orb.detectAndCompute(gray, None)
Rendimiento: Aproximadamente 15-30ms (CPU) para imágenes de 1920×1080. 10-20× más rápido que SIFT. Sin embargo, la robustez ante grandes cambios de escala (2×+) o cambios significativos de punto de vista es inferior a SIFT. Ampliamente utilizado en dispositivos móviles y AR en tiempo real.
Ajuste de parámetros: Los parámetros clave son nfeatures (conteo máximo de detección), scaleFactor (ratio de escala de pirámide, por defecto 1.2) y nlevels (niveles de pirámide, por defecto 8).
AKAZE - Características de alta precisión mediante espacio de escala no lineal
AKAZE (Accelerated-KAZE), publicado en 2013, usa filtrado de difusión no lineal para la construcción del espacio de escala. Resuelve el problema de los bordes difuminados por suavizado gaussiano (difusión lineal), construyendo espacios de escala que preservan bordes para correspondencia de alta precisión incluso en imágenes con poca textura.
Espacio de escala no lineal: AKAZE usa filtrado no lineal basado en la ecuación de difusión de Perona-Malik. La difusión se suprime cerca de bordes y se promueve en regiones planas, produciendo espacios de escala que preservan la estructura de bordes. Se calcula eficientemente usando el solucionador FED (Fast Explicit Diffusion).
Detección de puntos clave: Detecta extremos del determinante de la matriz Hessiana en el espacio de escala no lineal. Los puntos clave cerca de bordes son más estables que en el espacio de escala gaussiano, mejorando el rendimiento de detección en objetos artificiales con poca textura (edificios, señales).
Descriptor: AKAZE usa descriptores binarios (M-LDB: Modified Local Difference Binary). El vector binario de 486 bits tiene mayor distinción que el BRIEF de ORB mientras es más rápido que SIFT. Los descriptores de punto flotante (compatibles con KAZE) también son seleccionables.
Implementación OpenCV:
akaze = cv2.AKAZE_create()
kp, des = akaze.detectAndCompute(gray, None)
Comparación de rendimiento: Aproximadamente 80-150ms (CPU) para imágenes de 1920×1080. Más rápido que SIFT, más lento que ORB, pero la precisión rivaliza con SIFT y a veces la supera en imágenes con poca textura.
Guías de selección: AKAZE es óptimo para estructuras artificiales como edificios, entornos interiores y productos industriales. SIFT sigue mostrando la mayor precisión para paisajes naturales e imágenes con alta textura.
Métodos de correspondencia - BFMatcher y FLANN
Una vez obtenidos los descriptores de características, la correspondencia encuentra pares de descriptores correspondientes entre dos imágenes. La calidad de la correspondencia determina la precisión general de la aplicación.
Brute-Force Matcher (BFMatcher): Calcula distancias entre todos los pares de descriptores y selecciona el par más cercano como correspondencia. Garantiza encontrar el verdadero vecino más cercano pero tiene complejidad O(N²) para N descriptores.
bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=True) # Para SIFT
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) # Para ORB/AKAZE
FLANN (Fast Library for Approximate Nearest Neighbors): Búsqueda aproximada de vecino más cercano usando KD-Trees o LSH (Locality Sensitive Hashing). Significativamente más rápido que BFMatcher para conjuntos grandes de características (1000+ puntos) pero puede perder correspondencias óptimas debido a la aproximación.
Test de ratio de Lowe: La técnica de filtrado más importante. Calcula la proporción de distancia (d1/d2) entre el vecino más cercano y el segundo más cercano para cada característica, aceptando solo correspondencias donde la proporción está por debajo del umbral (típicamente 0.7-0.8). Elimina correspondencias ambiguas donde múltiples candidatos tienen distancias similares, reduciendo dramáticamente la tasa de falsas correspondencias.
matches = bf.knnMatch(des1, des2, k=2)
good = [m for m, n in matches if m.distance < 0.75 * n.distance]
Cross-Check: Verificación bidireccional que acepta correspondencias solo cuando tanto A→B como B→A coinciden. Combinado con el Test de Ratio, reduce la tasa de falsas correspondencias por debajo del 5%.
Benchmarks de rendimiento: BFMatcher (L2) con 1000 puntos toma aproximadamente 10ms, FLANN aproximadamente 3ms. Con 5000 puntos, BFMatcher toma aproximadamente 250ms versus aproximadamente 15ms de FLANN.
Rechazo de valores atípicos y verificación geométrica - Estimación robusta con RANSAC
Las correspondencias que pasan el Test de Ratio aún contienen falsas correspondencias (valores atípicos). RANSAC (Random Sample Consensus) verifica la consistencia geométrica y elimina valores atípicos, determinando la precisión final.
Estimación de homografía con RANSAC: Estima la transformación proyectiva (homografía) entre dos imágenes, aceptando solo correspondencias (inliers) consistentes con esa transformación. La homografía requiere 4 correspondencias de puntos, y RANSAC itera:
- Seleccionar aleatoriamente 4 pares de correspondencias
- Calcular la matriz de homografía H a partir de los 4 pares
- Aplicar H a todas las correspondencias y contar aquellas con error de reproyección por debajo del umbral (conteo de inliers)
- Aceptar H con el mayor conteo de inliers como resultado final
H, mask = cv2.findHomography(pts1, pts2, cv2.RANSAC, 5.0)
El umbral 5.0 es el error de reproyección en píxeles; menor es más estricto pero reduce el conteo de inliers. Típicamente 3.0-5.0 es apropiado.
Conteo de iteraciones RANSAC: Para ratio de inliers p y muestras requeridas s=4, las iteraciones necesarias para probabilidad de éxito P=0.99 es k = log(1-P) / log(1-p^s). Con 50% de ratio de inliers se necesitan aproximadamente 72 iteraciones; con 30% aproximadamente 588. OpenCV usa por defecto 2000, suficiente para la mayoría de casos.
USAC (Universal RANSAC): RANSAC mejorado disponible desde OpenCV 4.5. Integra mejoras de DEGENSAC, MAGSAC y LO-RANSAC para mayor precisión y velocidad. Especificar cv2.USAC_MAGSAC habilita el ajuste automático de umbral.
Evaluación de calidad de correspondencia: Un conteo final de inliers por debajo de 10 debe considerarse fallo de correspondencia. La estimación estable de homografía requiere un mínimo de 20-30 inliers. Un ratio de inliers por debajo del 30% justifica reconsiderar la selección de características o parámetros.