SIFT の特徴点を一致させると、多くの不一致が発生します。RANSAC アルゴリズムを使用して、これらの特徴点の変換行列を見つけることにより、不一致を取り除くことができます。しかし、データ空間に多くの不一致が含まれている場合、正しい変換行列を見つけることは非常に困難になります。さらに、エラー モデルが見つかる確率は非常に高くなります。問題の解決を目指して、改善された RANSAC アルゴリズムを使用したいと考えています。RANSAC アルゴリズムを使用する前に、ターゲット領域に属していないフィーチャを削除して、エラー特徴点の一部を削除したいと考えています。これを行うには、特徴点を含むすべての点の周囲の領域の数を計算します。設定した閾値よりも少ない数値の場合、そのポイントは対象エリアに属していないと判断して削除します。
I = single(rgb2gray(imread('sift_basic_1.jpg'))) ;
[f,d] = vl_sift(I);
I2 = single(rgb2gray(imread('sift_basic_2.jpg'))) ;
[f2,d2] = vl_sift(I2 );
%% SIFT matches
d = im2single(d);
d2 = im2single(d2);
kdtree = vl_kdtreebuild(d ) ;
[index, distance] = vl_kdtreequery(kdtree, d, d2) ;
numMatches = size(index,2) ;
X1 = f(1:2,index) ; X1(3,:) = 1 ;
X2 = f2(1:2,:); X2(3,:) = 1 ;
clear H score ok ;
for t = 1:5000
% estimate homograpyh
subset = vl_colsubset(1:numMatches, 4) ;
A = [] ;
for i = subset
A = cat(1, A, kron(X1(:,i)', vl_hat(X2(:,i)))) ;
end
[U,S,V] = svd(A) ;
H{t} = reshape(V(:,9),3,3) ;
% score homography
X2_ = H{t} * X1 ;
du = X2_(1,:)./X2_(3,:) - X2(1,:)./X2(3,:) ;
dv = X2_(2,:)./X2_(3,:) - X2(2,:)./X2(3,:) ;
ok{t} = (du.*du + dv.*dv) < 6*6 ;
score(t) = sum(ok{t}) ;
end
[score, best] = max(score) ;
H = H{best} ;
ok = ok{best} ;