57 votes

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

J'ai utilisé le SIFT mise en œuvre de Andrea Vedaldi pour calculer les descripteurs sift de deux images similaires (la seconde image est en fait une photo agrandie du même objet sous un angle différent).

Maintenant je ne suis pas capable de comprendre comment comparer les descripteurs pour savoir si les images sont similaires. ?

Je sais qu'il n'est pas possible de répondre à cette question à moins d'avoir déjà joué avec ce genre de choses auparavant, mais je pensais que quelqu'un qui a fait ça avant pourrait le savoir alors j'ai posé 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);

1 votes

Vérifier SURF Matlab dispose également d'un support intégré pour cela.

37voto

Jacob Points 22306

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

Ensuite, vous pouvez utiliser la correspondance des caractéristiques SIFT pour trouver des correspondances entre 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 dans F1 et que vous vouliez trouver la "meilleure" correspondance dans F2. Une façon de le faire est de comparer le descripteur de P dans F1 à tous les descripteurs dans D2. Par comparer, j'entends trouver la distance euclidienne (ou la norme L2 de la différence des deux descripteurs).

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

Voici ce que Lowe a recommandé : si Dv/Du >= seuil (j'ai utilisé 1,5 dans l'exemple de code), alors cette correspondance est acceptable ; sinon, elle est ambiguë et est rejetée en tant que correspondance et nous ne faisons correspondre aucun point de F2 à P. Essentiellement, s'il y a une grande différence entre la meilleure et la deuxième meilleure correspondance, vous pouvez vous attendre à ce que ce soit une correspondance de qualité.

C'est important car il existe de nombreuses possibilités de correspondances ambiguës dans une image : imaginez des points de correspondance dans un lac ou un bâtiment avec plusieurs fenêtres, les descripteurs peuvent sembler très similaires mais la correspondance est manifestement fausse.

Vous pouvez effectuer la mise en correspondance de plusieurs façons. Vous pouvez le faire vous-même très facilement avec MATLAB ou vous pouvez accélérer le processus en utilisant un arbre KD ou une recherche approximative du nombre le plus proche, par exemple FLANN qui a été mis en œuvre dans OpenCV .

EDIT : Aussi, il y a plusieurs Implémentations de kd-tree dans MATLAB .

0 votes

C'est la méthode courante de reconnaissance des objets par sift, mais est-ce la méthode la plus efficace pour déterminer la similarité des objets ? La similarité n'est pas exactement la même chose que la reconnaissance après ll. Après avoir regardé le papier recommandé sur le noyau de correspondance pyramidal, je pense que la réponse est non.

0 votes

@mugetsu : Peut-être, mais ce n'est pas le sujet ; la question portait sur l'obtention de descripteurs à partir de la boîte à outils VLFeat.

1 votes

D'après mon interprétation du problème, j'avais l'impression que Lazer demandait comment déterminer si deux images étaient similaires, et non comment obtenir les descripteurs (ce qu'il a déjà fait). Faire une comparaison du descripteur ne signifie pas qu'il doit se limiter aux fonctions vlfeat, tout ce dont il a besoin est une forme d'algorithme à appliquer à ces descripteurs. Et dans son cas, comme dans le mien, vlfeat n'a pas ce dont nous avons besoin pour faire une comparaison de similarité.

9voto

Dima Points 19888

Vous devriez lire l'article de David Lowe papier qui explique comment faire exactement cela. Cela devrait être suffisant, si vous voulez comparer des images du même objet. Si vous souhaitez comparer des images de différents objets de la même catégorie (par exemple, des voitures ou des avions), vous pouvez consulter la page Noyau Pyramide Match par Grauman et Darrell.

1 votes

Avez-vous par hasard utilisé le noyau de la pyramide de correspondance ? Quelle est votre opinion sur ses performances ?

0 votes

@mugetsu J'ai joué un peu avec le code publié pour cela (libpmk), mais je ne l'ai pas beaucoup utilisé. Les résultats présentés dans l'article sont cependant impressionnants.

3voto

luvieere Points 19689

Essayez de comparer chaque descripteur de la première image avec les descripteurs de la deuxième image 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 similarité 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 similarité des images. Expérimentez différentes combinaisons de taille de voisinage et de mesure statistique pour obtenir la meilleure réponse.

2voto

mirror2image Points 276

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

Si vous souhaitez comparer les descripteurs SIFT, outre la distance euclidienne, vous pouvez également utiliser la "distance diffuse", c'est-à-dire obtenir des descripteurs sur une échelle de plus en plus grossière et les concaténer avec le descripteur original. De cette façon, la similarité des caractéristiques à "grande échelle" aurait plus de poids.

0voto

Swagatika Points 56

Si vous voulez faire une correspondance entre 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 caractéristiques sont proches. Cela représente le carré de la distance euclidienne entre les deux descripteurs de caractéristiques correspondants. Vous pouvez également faire varier le seuil entre la meilleure correspondance et la deuxième meilleure correspondance en entrée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X