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 .
1 votes
Vérifier SURF Matlab dispose également d'un support intégré pour cela.