El detector SIFT (Scale Invariant Fourier Transform) se utiliza en la detección de puntos de interés en una imagen de entrada. Permite la identificación de características localizadas en imágenes, lo cual es esencial en aplicaciones como:
- Reconocimiento de Objetos en Imágenes
- Algoritmos de detección de caminos y evitación de obstáculos
- Reconocimiento de gestos, generación de mosaicos, etc.
A diferencia del Detector Harris , que depende de las propiedades de la imagen, como el punto de vista, la profundidad y la escala, SIFT puede realizar la detección de características independientemente de estas propiedades de la imagen. Esto se logra mediante la transformación de los datos de la imagen en coordenadas de escala invariable . Se ha dicho que el detector SIFT es una aproximación cercana del sistema utilizado en el sistema visual de los primates.
Pasos para extraer puntos de interés
Fase I: Selección de pico espacial de escala
El concepto de espacio de escala se ocupa de la aplicación de un rango continuo de filtros gaussianos a la imagen de destino, de modo que el gaussiano elegido tenga valores diferentes del parámetro sigma. El gráfico así obtenido se denomina Espacio de Escala . La selección del pico espacial de escala depende de la suposición de coincidencia espacial . De acuerdo con esto, si se detecta un borde en la misma ubicación en varias escalas (indicado por los cruces por cero en el espacio de la escala) , lo clasificamos como un borde real.
En imágenes 2D, podemos detectar los Puntos de Interés usando los máximos/mínimos locales en el Espacio de Escala de Laplaciano o Gaussiano. Un punto de interés potencial de SIFT se determina para un valor sigma determinado seleccionando el punto de interés potencial y considerando los píxeles en el nivel superior (con sigma más alto), el mismo nivel y el nivel inferior (con sigma más bajo que el nivel sigma actual). Si el punto es máximo/mínimo de todos estos 26 puntos vecinos, es un punto de interés potencial de SIFT y actúa como punto de partida para la detección de puntos de interés.
Fase II: Localización de puntos clave
La localización de puntos clave implica el refinamiento de los puntos clave seleccionados en la etapa anterior. Se eliminan los puntos clave de bajo contraste, los puntos clave inestables y los puntos clave que se encuentran en los bordes. Esto se logra calculando el Laplaciano de los puntos clave encontrados en la etapa anterior. Los valores extremos se calculan de la siguiente manera:
En la expresión anterior, D representa la diferencia de gaussiana. Para eliminar los puntos clave inestables, se calcula el valor de z y, si el valor de la función en z está por debajo de un valor de umbral, se excluye el punto.
Fase III: Asignación de Orientación a Puntos Clave
Para lograr una detección que sea invariable con respecto a la rotación de la imagen, es necesario calcular la orientación de los puntos clave. Esto se hace considerando la vecindad del punto clave y calculando la magnitud y dirección de los gradientes de la vecindad. Con base en los valores obtenidos, se construye un histograma con 36 bins para representar 360 grados de orientación (10 grados por bin). Por lo tanto, si la dirección del gradiente de un cierto punto es, digamos, 67,8 grados, se agrega un valor proporcional a la magnitud del gradiente de este punto al contenedor que representa 60-70 grados. Los picos de histograma por encima del 80 % se convierten en un nuevo punto clave que se utiliza para decidir la orientación del punto clave original.
Fase IV: Descriptor de punto clave
Finalmente, para cada punto clave, se crea un descriptor utilizando la vecindad de puntos clave. Estos descriptores se utilizan para hacer coincidir puntos clave en imágenes. Se utiliza una vecindad de 16 × 16 del punto clave para definir el descriptor de ese punto clave. Este barrio de 16×16 se divide en submanzana. Cada uno de esos subbloques es un vecindario de 4×4 contiguo que no se superpone. Posteriormente, para cada subbloque, se crea una orientación de 8 bins de manera similar a como se describe en Asignación de orientación. Estos 128 valores de bin (16 subbloques * 8 bins por bloque) se representan como un vector para generar el descriptor de punto clave.
Ejemplo: detector SIFT en Python
Ejecutar el siguiente script en el mismo directorio con un archivo llamado «geeks.jpg» genera la «imagen con puntos clave.jpg» que contiene los puntos de interés, detectados usando el módulo SIFT en OpenCV, marcados usando superposiciones circulares.
Nota: el detector SIFT se eliminó en las últimas versiones de OpenCV (≥ 3.4.2.16). Para que el siguiente código funcione, instale versiones anteriores de opencv-python y opencv-contrib-python usando los siguientes comandos:
- pip instalar opencv-python==3.4.2.16
- pip instalar opencv-contrib-python==3.4.2.16
A continuación se muestra la implementación:
Python3
# Important NOTE: Use opencv <= 3.4.2.16 as # SIFT is no longer available in # opencv > 3.4.2.16 import cv2 # Loading the image img = cv2.imread('geeks.jpg') # Converting image to grayscale gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # Applying SIFT detector sift = cv2.xfeatures2d.SIFT_create() kp = sift.detect(gray, None) # Marking the keypoint on the image using circles img=cv2.drawKeypoints(gray , kp , img , flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imwrite('image-with-keypoints.jpg', img)
Producción: