1

これは私が抱えているジレンマです。私のアプリケーションでは、一連の画像内で画像L1と一致する画像L2を一致させる必要があります。L1L2はまったく同じ画像ですが、L1の方がはるかに小さく (アップスケールする必要がありますか?)、エッジが少しアーチファクトになる可能性がありますが、それでも、それらはまったく同じソース画像からのものです。色情報を使用すると、現在の画像と一致する画像の間のあいまいさが取り除かれるという点で、色は重要です。OpenCV を使用して (または、より良い代替手段があるかもしれません)、一致する画像 ( L2 )を見つける最良の方法は何ですか?

繰り返しますが、一致する画像は回転したり歪んだりせず、サイズを変更するだけです。

一致する画像が提供されたセット内のすべての画像にどれだけ近いかを評価する機能があると思います。次に、評価が最も高いものを一致として選択します。画像を比較する方法がわかりません。どんな助けでも素晴らしいでしょう。ありがとう。

4

4 に答える 4

2

github に移動し、opencv-master\samples\cpp\matcher_simple.cpp (または matching_to_many_images.cpp) を確認してください。

ニーズを満たすだけでなく、遠近歪みのある画像 (回転、アフィン変換、照明の変化など) にも対応します。簡単に言えば、非常に堅牢です。

しかし、SIFT と SURF は特許を取得しているため、商用アプリケーションには使用できない可能性があります。しかし、多くの代替手段があります。グーグルで検索してください。

于 2014-07-07T07:09:49.897 に答える
0

ドキュメントの類似性を測定するために使用される Bag-of-words モデルに似たものを使用できると思います。これを見てください:リンク

以下の方程式を再現しています。

G = X'*X

ここで、X = [x1 x2 ... xn]

あなたの場合、画像の正規化されたヒストグラムをベクトル xi として使用します。

このアプローチでは画像のサイズを変更する必要はなく、高速になると思います。

編集

opencvサンプルで提供されているいくつかのサンプル画像を使用して、Matlabでこれを試しました:

im1 = imread('baboon.jpg');
im2 = imread('board.jpg');
im3 = imread('fruits.jpg');
im4 = imread('fruits - small.jpg'); % fruits.jpg scaled down 25% using mspaint

% using grayscale for simplicity
gr1 = rgb2gray(im1);
gr2 = rgb2gray(im2);
gr3 = rgb2gray(im3);
gr4 = rgb2gray(im4);

[cnt_baboon, x] = imhist(gr1);
[cnt_board, x] = imhist(gr2);
[cnt_fruits, x] = imhist(gr3);
[cnt_fruits_small, x] = imhist(gr4);

% X: not normalized
X = [cnt_baboon cnt_board cnt_fruits cnt_fruits_small];
H = X'*X;
N = sqrt(diag(H)*diag(H)');
% normalize. this would be faster
G = H./N

結果の G 行列:

G =

1.0000    0.8460    0.7748    0.7729
0.8460    1.0000    0.8741    0.8686
0.7748    0.8741    1.0000    0.9947
0.7729    0.8686    0.9947    1.0000

G(3,4) (および G(4,3)) が 1 に非常に近いことがわかります。

于 2014-07-07T10:50:22.973 に答える