最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

自動特徴マッチングを使用した、イメージの回転およびスケールの検出

この例では、回転およびスケールの変更によって違いの生じた 2 つのイメージを自動的に位置合わせする方法を示します。イメージの回転とスケーリングの検出というタイトルの別の例とよく似ています。2 つのイメージのレジストレーションを手動で行うのではなく、Computer Vision System Toolbox™ の特徴ベースの手法を使用してレジストレーション プロセスを自動化します。

この例では、detectSURFFeatures および vision.GeometricTransformEstimator System object を使用して、歪んだイメージの回転角度および倍率を復元します。その後、歪んだイメージを変換して元のイメージを復元します。

手順 1: イメージの読み取り

イメージをワークスペースに読み取ります。

original = imread('cameraman.tif');
imshow(original);
text(size(original,2),size(original,1)+15, ...
    'Image courtesy of Massachusetts Institute of Technology', ...
    'FontSize',7,'HorizontalAlignment','right');

手順 2: イメージのサイズ変更と回転

scale = 0.7;
J = imresize(original, scale); % Try varying the scale factor.

theta = 30;
distorted = imrotate(J,theta); % Try varying the angle, theta.
figure, imshow(distorted)

入力イメージのスケールと回転を変化させて実験できます。ただし、スケールの変更可能な量には制限があり、それを超えると特徴検出器が十分な特徴を検出できなくなります。

手順 3: イメージ間で一致する特徴の検出

両方のイメージで特徴を検出します。

ptsOriginal  = detectSURFFeatures(original);
ptsDistorted = detectSURFFeatures(distorted);

特徴記述子を抽出します。

[featuresOriginal,   validPtsOriginal]  = extractFeatures(original,  ptsOriginal);
[featuresDistorted, validPtsDistorted]  = extractFeatures(distorted, ptsDistorted);

その記述子を使用して特徴をマッチングします。

indexPairs = matchFeatures(featuresOriginal, featuresDistorted);

各イメージの対応するポイント位置を取得します。

matchedOriginal  = validPtsOriginal(indexPairs(:,1));
matchedDistorted = validPtsDistorted(indexPairs(:,2));

ポイントの一致を示します。外れ値があることに注意してください。

figure;
showMatchedFeatures(original,distorted,matchedOriginal,matchedDistorted);
title('Putatively matched points (including outliers)');

手順 4: 変換の推定

RANSAC アルゴリズムのバリアントである、統計的にロバストな MSAC (M-estimator SAmple Consensus) アルゴリズムを使用して、一致したポイントの組に相当する変換を生成します。これにより、変換行列の計算中に外れ値が削除されます。MSAC アルゴリズムでは無作為抽出が使われるため、変換の計算結果は変動することがあります。

[tform, inlierDistorted, inlierOriginal] = estimateGeometricTransform(...
    matchedDistorted, matchedOriginal, 'similarity');

変換行列の計算で使用した一致するポイントの組を表示します。

figure;
showMatchedFeatures(original,distorted, inlierOriginal, inlierDistorted);
title('Matching points (inliers only)');
legend('ptsOriginal','ptsDistorted');

手順 5: スケールと角度の解

幾何学的変換 TFORM を使用して、スケールと角度を復元します。歪んだイメージから元のイメージへの変換は計算済みなので、歪みを復元するにはその逆変換を計算しなければなりません。

Let sc = scale*cos(theta)
Let ss = scale*sin(theta)
Then, Tinv = [sc -ss  0;
              ss  sc  0;
              tx  ty  1]
where tx and ty are x and y translations, respectively.

逆変換行列を計算します。

Tinv  = tform.invert.T;

ss = Tinv(2,1);
sc = Tinv(1,1);
scale_recovered = sqrt(ss*ss + sc*sc)
theta_recovered = atan2(ss,sc)*180/pi
scale_recovered =

  single

    0.7010


theta_recovered =

  single

   30.2351

復元された値は、「手順 2: イメージのサイズ変更と回転」で選択したスケールと角度の値に一致しなければなりません。

手順 6: 元のイメージの復元

歪んだイメージを変換して元のイメージを復元します。

outputView = imref2d(size(original));
recovered  = imwarp(distorted,tform,'OutputView',outputView);

モンタージュで recoveredoriginal を並べて比較します。

figure, imshowpair(original,recovered,'montage')

歪みと復元処理のため、recovered (右) の画質は original (左) の画質と一致していません。特に、イメージを縮小すると情報が失われます。境界線周辺が不自然になるのは、変換の精度が限られているためです。「手順 4: イメージ間で一致する特徴の検出」でより多くのポイントを検出していれば、変換の精度は高くなります。たとえば、コーナー検出器 detectFASTFeatures を使用して、ブロブを検出する SURF 特徴検出器を補完できます。また、イメージの内容とイメージのサイズは、検出される特徴の数に影響を与えます。

参考

| | | | | | | |