[〜#〜] sift [〜#〜] の実装を使用しました Andrea Vedaldi 、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);
最初に、シフトの代わりに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番目に低いUとVです(DuとDv)。
Loweが推奨したものは次のとおりです。Dv/ Du> = threshold(サンプルコードで1.5を使用)の場合、この一致は許容可能です。それ以外の場合は、あいまいに一致し、対応として拒否されます。F2からPへのポイントは一致しません。本質的に、ベストマッチとセカンドベストマッチに大きな違いがある場合、これは品質のマッチであると期待できます。
画像には曖昧な一致の範囲がたくさんあるため、これは重要です。湖や複数の窓がある建物の一致点を想像すると、記述子は非常に似ているように見えますが、対応は明らかに間違っています。
さまざまな方法でマッチングを行うことができます..MATLABを使用して自分で簡単に行うことができます。または、KDツリーまたは [〜#〜] flannのような近似番号検索を使用して高速化できます[〜#〜]OpenCV で実装されています。
編集:また、いくつかの MATLABのkdツリー実装 があります。
David Loweの paper を読んでください。正確にそれを行う方法について説明しています。まったく同じオブジェクトの画像を比較する場合は、十分なはずです。同じカテゴリの異なるオブジェクト(車や飛行機など)の画像と一致させたい場合は、GraumanとDarrellの Pyramid Match Kernel をご覧ください。
最初の画像の各記述子を、近くにある(ユークリッド距離を使用して)2番目の画像の記述子と比較してみてください。したがって、最初の画像からの各記述子と、2番目の画像からの最も類似した隣接記述子との類似度に基づいてスコアを割り当てます。これらのすべてのスコアの統計的尺度(合計、平均、分散、平均誤差など)により、画像がどれだけ似ているかを推定できます。最適な答えを得るには、近隣のサイズと統計的尺度のさまざまな組み合わせを試してください。
ズームした画像と回転した画像を既知の回転中心と単に比較する場合は、対数極座標で位相相関を使用できます。ピークの鋭さと位相相関のヒストグラムにより、画像がどれだけ近いかを判断できます。フーリエ係数の絶対値でユークリッド距離を使用することもできます。
SIFT記述子を比較したい場合は、ユークリッド距離のほかに、「拡散距離」を使用することもできます。記述子を徐々に大まかなスケールで取得し、元の記述子と連結します。そうすれば、「大規模」な特徴の類似性はより重要になります。
画像間でマッチングを行いたい場合は、vl_ubcmatchを使用する必要があります(使用していない場合)。出力の「スコア」を解釈して、機能がどれだけ近いかを確認できます。これは、一致する2つのフィーチャ記述子間のユークリッド距離の2乗を表します。また、入力として最適一致と2番目の最適一致の間でしきい値を変更することもできます。