まず、sift の代わりに vl_sift を使用することになっていませんか?
次に、SIFT 特徴マッチングを使用して、2 つの画像の対応を見つけることができます。サンプルコードは次のとおりです。
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() は基本的に次のことを行います。
F1 に点 P があり、F2 で「最適な」一致を見つけたいとします。これを行う 1 つの方法は、F1 の P の記述子を D2 のすべての記述子と比較することです。比較すると、ユークリッド距離 (または 2 つの記述子の差の L2 ノルム) を見つけることを意味します。
次に、F2 で 2 つの点を見つけます。たとえば、P からの距離がそれぞれ最小および 2 番目に小さい (たとえば、Du と Dv) U と V です。
Lowe の推奨事項は次のとおりです。Dv/Du >= しきい値 (サンプル コードでは 1.5 を使用) の場合、この一致は許容されます。それ以外の場合、あいまいに一致し、通信として拒否され、F2 のどの点も P に一致しません。基本的に、最高の一致と次善の一致の間に大きな違いがある場合、これは質の高い一致であると期待できます。
画像にはあいまいな一致の余地がたくさんあるため、これは重要です。湖や複数の窓がある建物の一致点を想像してみてください。記述子は非常に似ているように見えますが、対応は明らかに間違っています。
さまざまな方法でマッチングを行うことができます.. MATLAB を使用して自分で非常に簡単に行うことができます。また、KD ツリーまたはOpenCVで実装されているFLANNのようなおおよその最近数検索を使用して高速化することもできます。
編集: また、MATLAB にはいくつかの kd-tree 実装があります。