matlab - ¿Cómo usar el algoritmo SIFT para calcular qué tan similares son dos imágenes?
pattern-matching computer-vision (5)
He utilizado la implementación SIFT de Andrea Vedaldi para calcular las descripciones de tamizado de dos imágenes similares (la segunda imagen es en realidad una imagen ampliada del mismo objeto desde un ángulo diferente).
Ahora no puedo averiguar cómo comparar los descriptores para decir qué tan similares son las imágenes .
Sé que esta pregunta no es respondible a menos que hayas jugado con este tipo de cosas antes, pero pensé que alguien que había hecho esto antes podría saber esto , así que publiqué la pregunta.
lo poco que hice para generar los descriptores:
>> i=imread(''p1.jpg'');
>> j=imread(''p2.jpg'');
>> i=rgb2gray(i);
>> j=rgb2gray(j);
>> [a, b]=sift(i); % a has the frames and b has the descriptors
>> [c, d]=sift(j);
Debería leer el artículo de David Lowe, que habla de cómo hacer exactamente eso. Debería ser suficiente si quiere comparar imágenes del mismo objeto exacto. Si desea unir imágenes de diferentes objetos de la misma categoría (por ejemplo, automóviles o aviones), es posible que desee ver el Núcleo Pyramid Match de Grauman y Darrell.
En primer lugar, ¿no se supone que debes usar vl_sift en lugar de sift?
En segundo lugar, puede usar la coincidencia de funciones 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:
Supongamos que tiene un punto P en F1 y quiere encontrar el "mejor" partido en F2. Una forma de hacerlo es comparar el descriptor de P en F1 con todos los descriptores en D2. Al 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> = threshold (utilicé 1.5 en el código de muestra), entonces esta coincidencia es aceptable; de lo contrario, se emparejará ambiguamente y se rechazará como correspondencia y no coincidiremos con ningún punto en F2 a P. Esencialmente, si hay una gran diferencia entre las mejores y las segundas mejores, puede esperar que sea una combinación de calidad.
Esto es importante ya que hay muchas posibilidades de encontrar 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 obviamente es incorrecta.
Puede hacer la coincidencia de varias maneras ... puede hacerlo usted mismo muy fácilmente con MATLAB o puede acelerarlo usando un árbol KD o una búsqueda de número aproximado más cercano como FLANN que se ha implementado en OpenCV .
EDITAR: También, hay varias implementaciones de kd-tree en MATLAB .
Intente comparar cada descriptor de la primera imagen con descripciones del segundo situado en una vecindad cercana (usando la distancia euclidiana). Por lo tanto, asigna un puntaje a cada descriptor de la primera imagen en función del grado de similitud entre este y el descriptor vecino más similar de la segunda imagen. Una medida estadística (suma, media, dispersión, error medio, etc.) de todos estos puntajes le da una estimación de cuán similares son las imágenes. Experimenta con diferentes combinaciones de tamaño de vecindad y medida estadística para darte la mejor respuesta.
Si desea hacer una coincidencia entre las imágenes, debe usar vl_ubcmatch (en caso de que no lo haya utilizado). Puede interpretar los puntajes de salida para ver qué tan cerca están las características. Esto representa el cuadrado de distancia euclidiana entre los dos descriptores de características coincidentes. También puede variar el umbral entre Mejor coincidencia y segunda mejor coincidencia como entrada.
Si solo quiere comparar la imagen ampliada y girada con el centro de rotación conocido, puede usar la correlación de fase en coordenadas log-polar. Mediante la nitidez del pico y el histograma de correlación de fase, puede juzgar qué tan cerca están las imágenes. También puede usar la distancia euclidiana en el valor absoluto de los coeficientes de Fourier.
Si desea comparar el descriptor SIFT, además de la distancia euclidiana, también puede usar la "distancia difusa": obtener el descriptor progresivamente en una escala más aproximada y concatenarlos con el descriptor original. De esa manera, la similitud de la característica a "gran escala" tendría más peso.