web-dev-qa-db-fra.com

Comment utiliser l'algorithme SIFT pour calculer la similitude de deux images?

J'ai utilisé la mise en œuvre [~ # ~] [~ # ~] de Andrea Vedaldi , pour calculer les descripteurs de tamisage de deux images similaires (la deuxième image est en fait une image agrandie du même objet sous un angle différent).

Maintenant, je ne suis pas en mesure de comprendre comment comparer les descripteurs pour dire à quel point les images sont similaires ?

Je sais que cette question ne peut être résolue que si vous avez déjà joué avec ce genre de choses auparavant, mais je pensais que quelqu'un qui l'a fait auparavant pourrait le savoir , j'ai donc posté la question.

le peu que j'ai fait pour générer les descripteurs:

>> 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);
53
Lazer

Tout d'abord, n'êtes-vous pas censé utiliser vl_sift au lieu de sift?

Deuxièmement, vous pouvez utiliser la fonction de correspondance SIFT pour trouver des correspondances dans les deux images. Voici un exemple de code:

    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 () fait essentiellement ce qui suit:

Supposons que vous ayez un point P en F1 et que vous vouliez trouver la "meilleure" correspondance en F2. Une façon de le faire est de comparer le descripteur de P dans F1 à tous les descripteurs dans D2. Par comparaison, je veux dire trouver la distance euclidienne (ou la norme L2 de la différence des deux descripteurs).

Ensuite, je trouve deux points dans F2, disons U & V qui ont respectivement la distance la plus basse et la deuxième plus basse (disons Du et Dv) de P.

Voici ce que Lowe a recommandé: si Dv/Du> = seuil (j'ai utilisé 1,5 dans l'exemple de code), cette correspondance est acceptable; sinon, il est assorti de façon ambiguë et est rejeté comme une correspondance et nous ne faisons correspondre aucun point de F2 à P. Essentiellement, s'il y a une grande différence entre les meilleurs et les seconds meilleurs matchs, vous pouvez vous attendre à ce que ce soit un match de qualité.

C'est important car il y a beaucoup de place pour des correspondances ambiguës dans une image: imaginez faire correspondre des points dans un lac ou un bâtiment avec plusieurs fenêtres, les descripteurs peuvent sembler très similaires mais la correspondance est évidemment fausse.

Vous pouvez faire l'appariement de nombreuses façons .. vous pouvez le faire vous-même très facilement avec MATLAB ou vous pouvez l'accélérer en utilisant un arbre KD ou une recherche approximative du numéro le plus proche comme FLANN qui a été implémenté dans OpenCV .

EDIT: En outre, il existe plusieurs implémentations de kd-tree dans MATLAB .

34
Jacob

Vous devriez lire papier de David Lowe, qui explique comment faire exactement cela. Cela devrait être suffisant si vous souhaitez comparer des images du même objet. Si vous souhaitez faire correspondre des images de différents objets de la même catégorie (par exemple des voitures ou des avions), vous pouvez regarder le Pyramid Match Kernel de Grauman et Darrell.

9
Dima

Essayez de comparer chaque descripteur de la première image avec des descripteurs de la seconde situés à proximité (en utilisant la distance euclidienne). Ainsi, vous attribuez un score à chaque descripteur de la première image en fonction du degré de similitude entre celui-ci et le descripteur voisin le plus similaire de la deuxième image. Une mesure statistique (somme, moyenne, dispersion, erreur moyenne, etc.) de tous ces scores vous donne une estimation de la similitude des images. Expérimentez avec différentes combinaisons de taille de voisinage et de mesure statistique pour vous donner la meilleure réponse.

3
luvieere

Si vous voulez simplement comparer l'image agrandie et pivotée avec le centre de rotation connu, vous pouvez utiliser la corrélation de phase en coordonnées log-polaires. Par la netteté du pic et l'histogramme de corrélation de phase, vous pouvez juger de la proximité des images. Vous pouvez également utiliser la distance euclidienne sur la valeur absolue des coefficients de Fourier.

Si vous voulez comparer le descripteur SIFT, à côté de la distance euclidienne, vous pouvez également utiliser la "distance diffuse" - obtenir le descripteur sur une échelle progressivement plus grossière et les concaténer avec le descripteur d'origine. De cette façon, la similitude des caractéristiques "à grande échelle" aurait plus de poids.

2
mirror2image

Si vous souhaitez faire correspondre les images, vous devez utiliser vl_ubcmatch (au cas où vous ne l'auriez pas utilisé). Vous pouvez interpréter les "scores" de sortie pour voir à quel point les entités sont proches. Cela représente le carré de la distance euclidienne entre les deux descripteurs d'entités correspondants. Vous pouvez également faire varier le seuil entre Meilleure correspondance et 2ème meilleure correspondance en entrée.

0
Swagatika