Saltar al contenido

¿Cómo usar el algoritmo SIFT para calcular qué tan similares son dos imágenes?

Solución:

Primero, ¿no se supone que debes usar vl_sift en lugar de sift?

En segundo lugar, puede utilizar la función de coincidencia de SIFT para encontrar correspondencias en las dos imágenes. Aquí hay un código de muestra:

    I = imread('p1.jpg');
    J = imread('p2.jpg');

    I = single(rgb2gray(I)); % Conversion to single is recommended
    J = single(rgb2gray(J)); % in the documentation

    [F1 D1] = vl_sift(I);
    [F2 D2] = vl_sift(J);

    % Where 1.5 = ratio between euclidean distance of NN2/NN1
    [matches score] = vl_ubcmatch(D1,D2,1.5); 

    subplot(1,2,1);
    imshow(uint8(I));
    hold on;
    plot(F1(1,matches(1,:)),F1(2,matches(1,:)),'b*');

    subplot(1,2,2);
    imshow(uint8(J));
    hold on;
    plot(F2(1,matches(2,:)),F2(2,matches(2,:)),'r*');

vl_ubcmatch () esencialmente hace lo siguiente:

Suponga que tiene un punto P en F1 y desea encontrar la “mejor” coincidencia en F2. Una forma de hacerlo es comparar el descriptor de P en F1 con todos los descriptores en D2. Por comparar, me refiero a encontrar la distancia euclidiana (o la norma L2 de la diferencia de los dos descriptores).

Luego, encuentro dos puntos en F2, digamos U y V que tienen la distancia más baja y la segunda más baja (digamos, Du y Dv) desde P respectivamente.

Esto es lo que Lowe recomendó: si Dv / Du> = umbral (utilicé 1.5 en el código de muestra), entonces esta coincidencia es aceptable; de lo contrario, se empareja ambiguamente y se rechaza como una correspondencia y no emparejamos ningún punto en F2 con P. Esencialmente, si hay una gran diferencia entre las mejores coincidencias y las segundas mejores, puede esperar que sea una coincidencia de calidad.

Esto es importante ya que hay mucho margen para coincidencias ambiguas en una imagen: imagine puntos coincidentes en un lago o un edificio con varias ventanas, los descriptores pueden parecer muy similares pero la correspondencia es obviamente incorrecta.

Puede hacer la comparación de varias formas … puede hacerlo usted mismo muy fácilmente con MATLAB o puede acelerarla usando un árbol KD o una búsqueda de número más cercano aproximado como FLANN que se ha implementado en OpenCV.

EDITAR: Además, hay varias implementaciones de árbol kd en MATLAB.

Debería leer el artículo de David Lowe, que habla sobre cómo hacer exactamente eso. Debería ser suficiente si desea comparar imágenes del mismo objeto exacto. Si desea hacer coincidir imágenes de diferentes objetos de la misma categoría (por ejemplo, automóviles o aviones), es posible que desee mirar el Kernel de coincidencia de pirámides de Grauman y Darrell.

Intente comparar cada descriptor de la primera imagen con los descriptores de la segunda situada en una vecindad cercana (usando la distancia euclidiana). Por lo tanto, asigna una puntuación a cada descriptor de la primera imagen en función del grado de similitud entre este y el descriptor de vecino más similar de la segunda imagen. Una medida estadística (suma, media, dispersión, error medio, etc.) de todas estas puntuaciones le da una estimación de la similitud de las imágenes. Experimente con diferentes combinaciones de tamaño de vecindad y medida estadística para obtener la mejor respuesta.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *