2017-05-20 11 views
1

入力画像と最も類似した5つの画像を比較したいと思います。 これを行うために私はSIFT(VLFeat library)を使用し、それぞれの記述子を比較することを考えました。 したがって、vl_ubcmatch(doc here)メソッドを使用して、画像間の類似性の測定値を計算します。5つの最も類似した画像を取得する

これはコードです:あなたがコードから見ることができるように

path_dir = './img/'; 
imgs = dir(path_dir); 
imgs = imgs(3 : end); 
numImgs = size(imgs); 
numImgs = numImgs(1); 
path1 = './img/car01.jpg'; 
Ia = imread(path1); 
Ia = single(rgb2gray(Ia)); 
[fa, da] = vl_sift(Ia); 

results = struct; 
m = 0; 
j = 1; % indice dell'img (del for) 

for img = imgs' 

    path = strcat(path_dir, img.name); 
    if(strcmp(path1, path) == 0) 
     Ib = imread(path); 
     Ib = single(rgb2gray(Ib)); 
     [fb, db] = vl_sift(Ib); 

     [matches, scores] = vl_ubcmatch(da, db); 

     s = sum(scores); 
     [r, c] = size(scores); 
     m = s ./ c; 

     results(j).measure = m; 
     results(j).img = path; 
     j = j + 1; 
    end 
end 

、(例えば、それが告げる私は類似性の尺度としての平均値を使用するだろうと思ったが、私が得る結果は満足のいくものではありません私はカップの入力イメージが別のカップよりもツリーに似ていることを私に教えてください)。

あなたによれば、同等の記​​述子を持つ方がよいでしょうが、類似性が低いか類似していない記述子は少ないが類似性は高いですか? 私は、5つの異なるカテゴリ(カップ、木、人、テーブル、車)の50の画像を持っており、入力として画像が与えられると、プログラムは5つの最も類似した画像を返します。

より正確な分類を得るために平均の代わりにどのような測定を使用できますか? ありがとう!

答えて

0

あなたのコードによれば、画像(Ia)と他のすべての画像(Ib)の間の類似性を測定します。したがって、IaのSIFT記述子と、すべてIbのSIFT記述子を比較すると、各画像ペア(matches)のフィーチャマッチのリストと各フィーチャペアのユークリッド距離(scores)が得られます。

ここで、画像ペアの平均を類似度の尺度として使用することは、唯一の特徴一致を有する画像対が(偶然に)画像よりも良好な「類似性」を導くことができるので、私はあなたの仕事のための非現実的な解決策だと思います。

あなたの質問に関しては、無意味な記述子がたくさんあるよりも、ほんの少数(もちろん、よりうまくいく!)であっても、意味のある/強い記述子を持つ方が常に良いです。

プロポーザル:インライア数(各画像ペアの機能一致数= numel(matches))を数えてみませんか?

これは、異なるオブジェクトと同じオブジェクトのイメージ間でより多くのインライアを与えるべきです。したがって、最もインリアが5つあるペアを最も類似したものにする必要があります。

カップをツリーから区別したい場合は、機能するはずです。分類タスクが難しくなり、異なるタイプのツリーを区別する必要がある場合、SIFTは使用するのに最適なアルゴリズムではありません。学習のアプローチはよりよい結果をもたらすでしょう...しかしあなたの仕事に依存します。

関連する問題