57

Andrea VedaldiのSIFT実装を使用して、2つの類似した画像のふるい分け記述子を計算しました(2番目の画像は、実際には同じオブジェクトを異なる角度から拡大した画像です)。

今、私は記述子を比較して画像がどれほど似ているかを知る方法を理解することができませんか?

こういうことを実際にやってみないと答えられないことは知っていますが、これまでにやったことがある人も知っているのではないかと思い、質問を投稿しました。

記述子を生成するために私がしたこと:

>> 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);
4

5 に答える 5

37

まず、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 実装があります。

于 2009-10-01T04:33:28.747 に答える
9

まさにそれを行う方法について説明しているDavid Lowe の論文を読む必要があります。まったく同じオブジェクトの画像を比較したい場合は、これで十分です。同じカテゴリ (車や飛行機など) の異なるオブジェクトの画像を一致させたい場合は、Grauman と Darrell によるPyramid Match Kernelを参照することをお勧めします。

于 2009-10-01T15:12:53.747 に答える
3

(ユークリッド距離を使用して) 近くにある 2 番目の画像の記述子と、最初の画像の各記述子を比較してみてください。したがって、最初の画像の各記述子と 2 番目の画像の最も類似した隣接記述子との類似度に基づいて、最初の画像の各記述子にスコアを割り当てます。これらすべてのスコアの統計的尺度 (合計、平均、分散、平均誤差など) により、画像がどの程度類似しているかを推定できます。近傍サイズと統計的尺度のさまざまな組み合わせを試して、最良の答えを導き出してください。

于 2009-09-30T21:48:06.583 に答える
2

ズームおよび回転した画像を既知の回転中心と比較するだけの場合は、対数極座標で位相相関を使用できます。ピークの鋭さと位相相関のヒストグラムから画像の近さを判断できます。フーリエ係数の絶対値にユークリッド距離を使用することもできます。

SIFT記述子を比較したい場合は、ユークリッド距離のほかに、「拡散距離」を使用することもできます。記述子を徐々に粗いスケールで取得し、それらを元の記述子と連結します。そうすれば、「大規模な」機能の類似性がより重要になります。

于 2009-10-01T19:21:44.540 に答える
0

画像間のマッチングを行いたい場合は、vl_ubcmatch を使用する必要があります (使用していない場合)。出力の「スコア」を解釈して、特徴がどれだけ近いかを確認できます。これは、一致する 2 つの特徴記述子間のユークリッド距離の 2 乗を表します。入力として、最適一致と 2 番目に最適な一致の間でしきい値を変更することもできます。

于 2013-07-04T18:48:45.727 に答える