Question

Je l'ai utilisé EIPD mise en œuvre de < a href = "http://www.vlfeat.org/overview/sift.html" rel = "nofollow noreferrer"> Andrea Vedaldi , pour calculer les descripteurs de EIPD de deux images similaires (la seconde image est en réalité un zoom avant image du même objet à partir d'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 est responsable sauf si vous avez réellement joué avec ce genre de choses avant, mais je pensais que quelqu'un qui a fait cela avant peut le savoir, donc je posté la question .

le peu que je l'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);
Était-ce utile?

La solution

Tout d'abord, vous n'êtes pas censé être à l'aide vl_sift au lieu de passer au crible?

Deuxièmement, vous pouvez utiliser la correspondance de fonction SIFT pour trouver des correspondances dans les deux images. Voici quelques exemples 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 voulez trouver le match « meilleur » en F2. Une façon de le faire est de comparer le descripteur de P en F1 à tous les descripteurs de 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, dis U & V qui ont la plus basse et la deuxième plus faible distance (par exemple, Du et Dv) à partir de P, respectivement.

Voici ce que Lowe recommandé: si Dv / Du> = seuil (I utilisé 1,5 dans l'exemple de code), cette correspondance est acceptable; sinon, il est ambigüe adapté et est rejetée comme une correspondance et nous ne correspondent à aucun point F2 à P. Essentiellement, s'il y a une grande différence entre les meilleurs et les deuxièmes meilleurs résultats, vous pouvez vous attendre que ce soit un match de qualité.

Ceci est important car il y a beaucoup de possibilités pour les matches ambigus dans une image: imaginez les points correspondants dans un lac ou d'un immeuble avec plusieurs fenêtres, les descripteurs peuvent sembler très similaires, mais la correspondance est évidemment faux

.

Vous pouvez faire la mise en correspondance dans un certain nombre de façons .. vous pouvez le faire vous-même très facilement avec Matlab ou vous pouvez accélérer en utilisant un KD-arbre ou une recherche de numéro le plus proche approximatif comme FLANN qui a été mis en œuvre dans OpenCV .

EDIT: En outre, il y a plusieurs implémentations kd-tree dans Matlab

Autres conseils

Vous devriez lire papier de David Lowe, qui parle de la façon dont pour faire exactement cela. Il devrait être suffisant, si vous voulez comparer les images de l'exacte même objet. Si vous voulez faire correspondre les images d'objets différents de la même catégorie (par exemple des voitures ou des avions), vous pouvez regarder le Pyramide du noyau par match Grauman et Darrell.

Essayer de comparer chaque descripteur à partir de la première image à l'aide des descripteurs de la seconde située dans un voisinage proche (en utilisant la distance euclidienne). Ainsi, vous attribuez un score à chaque descripteur de la première image en fonction du degré de similitude entre elle et le descripteur de voisin le plus proche de la seconde image. Une mesure statistique (somme, moyenne, dispersion, erreur moyenne, etc.) de tous ces scores vous donne une estimation de la façon dont les images sont similaires. Expérimentez avec différentes combinaisons de taille de proximité et mesure statistique pour vous donner la meilleure réponse.

Si vous voulez juste comparer l'image zoomée et pivotées avec le centre de rotation connue, vous pouvez utiliser la corrélation de phase en coordonnées log-polaire. Par la netteté du pic et l'histogramme de corrélation de phase, vous pouvez juger comment les images sont proches. Vous pouvez également utiliser la distance euclidienne sur la valeur absolue des coefficients de Fourier.

Si vous voulez comparer les EIPD descripteur, à côté de la distance euclidienne, vous pouvez également utiliser « distance diffus » - se descripteur à l'échelle de plus en plus rude et les concaténer avec descripteur d'origine. De cette façon, la similarité de fonction « à grande échelle » aurait plus de poids.

Si vous voulez faire de la correspondance entre les images, vous devez utiliser vl_ubcmatch (au cas où vous ne l'avez pas utilisé). Vous pouvez interpréter « scores » la sortie pour voir à quel point les caractéristiques sont. Cela représente le carré de la distance euclidienne entre les deux descripteurs de fonction correspondant. Vous pouvez aussi varier le seuil entre Meilleur et 2e meilleur match d'entrée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top