Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

局所特徴の検出と抽出

局所近傍のコンパクトなベクトル表現である局所特徴とその記述子は、多くのコンピューター ビジョン アルゴリズムの基本ブロックとなります。用途としては、イメージのレジストレーション、オブジェクトの検出と分類、追跡、動き推定などがあります。これらのアルゴリズムは、局所特徴を使用することで、スケールの変化や回転、オクルージョンなどをより適切に処理できます。Computer Vision Toolbox™ では、コーナー特徴検出法として FAST、Harris、ORB および Shi & Tomasi 法が、またブロブ特徴の検出法としては SIFT、SURF、KAZE および MSER 法が用意されています。ツールボックスには SIFT、SURF、KAZE、FREAK、BRISK、ORB、HOG の各記述子が含まれています。これらの検出器や記述子はアプリケーションのニーズに応じて組み合わせることができます。詳細については、特徴点のタイプを参照してください。

局所特徴とは

局所特徴とは、点、エッジ、小さいイメージ パッチなど、イメージ内に見られるパターンや際立つ構造のことを指します。これらは通常、テクスチャ、色、強度などが周辺と異なるイメージ パッチに関連付けられます。ここでは特徴が実際に表している対象物ではなく、周りとは異なるという点が重要です。局所特徴の例としては、ブロブ、コーナー、エッジ ピクセルなどが挙げられます。

例1 コーナー検出の例
I = imread("circuit.tif");
corners = detectFASTFeatures(I,MinContrast=0.1);
J = insertMarker(I,corners,"circle");
imshow(J)

局所特徴の利点と用途

局所特徴を利用して、オクルージョンや表示条件の変化、煩雑さなどに関係なく、イメージの対応関係を見つけることができます。また、局所特徴のプロパティはイメージの分類にも適しています。bag of visual words を用いたイメージの分類を参照してください。

局所特徴の基本的な用途には次の 2 つがあります。

  • イメージの繋ぎ合わせや 3 次元再構成のためにアンカー ポイントを位置決めする。

  • 検出や分類のために、イメージを分割せずにそのコンテンツをコンパクトに表現する。

優れた局所特徴とは

勾配に基づく強度変化のアプローチに依存する検出器は、優れた局所特徴を検出します。たとえばエッジ、ブロブ、領域などの特徴です。優れた局所特徴には以下のプロパティがあります。

  • 検出が繰り返し可能である:
    同じシーンのイメージが 2 つ与えられた場合、検出器により検出される両方のイメージの特徴の大半が同じになります。これらの特徴は表示条件やノイズ状況の変化に対してロバストです。

  • 特殊性がある:
    特徴の中心周辺の近傍には特徴間の比較を可能にする程度の差異があります。

  • 位置付け可能である:
    特徴に一意の位置を割り当てることが可能です。この位置は表示条件の変化による影響を受けません。

特徴検出と特徴抽出

"特徴検出" とは、イメージ内でコーナーやブロブなど一意のコンテンツをもつ領域を選択することです。特徴検出で見つかった関心点はその後の処理に使用できます。これらの点が必ずしもテーブルの角などの物理構造に対応するとは限りません。特徴検出で重要なのは、回転やスケールの変化が生じてもその特徴を検出できるような、局所的な不変性を保つ特徴を見つけることです。

"特徴抽出" では記述子が計算されます。これは通常、検出された特徴の周りの領域に対して行われます。記述子は、イメージ処理に基づいて局所的なピクセル近傍をコンパクトなベクトル表現に変換します。この新しい表現により、スケールや方向が変化した場合でも近傍間の比較を行えるようになります。SIFT や SURF などの記述子は、局所勾配の計算に依存します。BRISK や ORB、FREAK などのバイナリ記述子は、局所的な強度差のペアに依存し、これらは 2 値ベクトルに符号化されます。

特徴検出器と記述子の選択

アプリケーションの条件とデータの特性を考慮したうえで、最適な特徴検出器と記述子を選択します。以下にある最初の表は、選択の際の一般的な基準を示しています。その後の 2 つの表は、Computer Vision Toolbox で使用できる検出器と記述子の詳細を示しています。

検出器と記述子の選択のための考慮事項

基準推奨

イメージ内の特徴のタイプ

データに適した検出器を使用します。たとえば、イメージにバクテリア細胞のイメージが含まれる場合、コーナー検出器ではなくブロブ検出器を使用してください。イメージが都市部の航空写真の場合には、コーナー検出器を用いて人工建造物を検出できます。

特徴を使用するコンテキスト:

  • キー ポイントのマッチング

  • 分類

HOG、SURF、および KAZE 記述子は分類タスクに適しています。これに対して、ORB や BRISK、FREAK などのバイナリ記述子は、通常、イメージ間の点の対応を見つけるために使われ、レジストレーションなどに使用されます。

イメージに見られる歪みのタイプ

データに含まれる歪みに対処できる検出器と記述子を選択します。たとえば、スケールの変化が生じない場合には、スケールの処理を行わないコーナー検出器の使用を検討してください。スケールや回転などの大きな歪みがデータに含まれる場合、SIFT、SURF、ORB、または KAZE の特徴量検出器および記述子を使用します。SURF 法および KAZE 法では、計算量が多くなります。

パフォーマンス要件:

  • リアルタイム パフォーマンスが必要

  • 精度と処理速度

一般に、バイナリ記述子は勾配ベースの記述子と比べて処理は高速ですが、正確度の面で劣ります。精度を高めるには、同時に複数の検出器と記述子を使用してください。

特徴のタイプに基づく検出関数の選択

検出器特徴のタイプ関数スケールに非依存
FAST [1]コーナーdetectFASTFeaturesなし
最小固有値アルゴリズム [4] コーナーdetectMinEigenFeaturesなし
コーナー検出器 [3]コーナーdetectHarrisFeaturesなし
SIFT [14]ブロブdetectSIFTFeaturesあり
SURF [11]ブロブdetectSURFFeaturesあり
KAZE[12]ブロブdetectKAZEFeaturesあり
BRISK [6]コーナーdetectBRISKFeaturesあり
MSER [8]強度が一様な領域detectMSERFeaturesあり
ORB [13]コーナーdetectORBFeaturesなし

メモ

検出関数は特徴に関する情報を含むオブジェクトを返します。関数 extractHOGFeatures および関数 extractFeatures は、これらのオブジェクトを使用して記述子を作成します。

記述子メソッドの選択

記述子バイナリ関数とメソッド不変要素一般的な使用例
スケール回転点の対応関係の判定分類
HOGなしextractHOGFeatures(I, ...)なしなしなしあり
LBPなしextractLBPFeatures(I, ...)なしありなしあり
SIFTなしextractFeatures(I,points,Method="SIFT")ありありありあり
SURFなしextractFeatures(I,points,Method="SURF")ありありありあり
KAZEなしextractFeatures(I,points,Method="KAZE")ありありありあり
FREAKありextractFeatures(I,points,'Method="FREAK")ありありありなし
BRISKありextractFeatures(I,points,'Method="BRISK")ありありありなし
ORBありextractFeatures(I,points,'Method="ORB")なしありありなし
  • ブロック

  • キー ポイントの周りのシンプルなピクセル近傍

なしextractFeatures(I,points,'Method="Block")なしなしありあり

メモ

  • 関数 extractFeatures では、さまざまな抽出メソッドからアプリケーションのニーズに最も適したものを選択できます。関数 extractFeatures'Method' 入力を指定しない場合、関数は入力点のクラスのタイプに基づいてメソッドを自動的に選択します。

  • バイナリ記述子は短時間で処理されますが、位置付けの正確度が低下します。したがって、分類タスクには適していません。関数 extractFeaturesbinaryFeatures オブジェクトを返します。このオブジェクトによって、関数 matchFeatures で使用されるハミング距離ベースのマッチング メトリクスが有効になります。

局所特徴の使用

2 つのイメージのレジストレーションを行うことで、局所特徴を簡単に把握できます。この例では、2 つのイメージ間の幾何学的変換を見つけます。ここでは局所特徴を使用して、明確に位置決めされたアンカー ポイントを検出します。

2 つのイメージを表示

最初のイメージが元のイメージです。

original = imread('cameraman.tif');
figure
imshow(original);

Figure contains an axes object. The axes object contains an object of type image.

2 番目のイメージは、元のイメージを回転させてスケールを変更したものです。

scale = 1.3;
J = imresize(original,scale);
theta = 31;
distorted = imrotate(J,theta);
figure
imshow(distorted)

Figure contains an axes object. The axes object contains an object of type image.

元のイメージと歪んだイメージの間でマッチする特徴を検出

歪んだイメージの修正に必要な変換を判断するには、まずマッチする SURF 特徴量を検出します。

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

特徴を抽出して 2 つのイメージ間で検出されたブロブを比較

検出手順では、両方のイメージに概ねマッチするブロブ構造がいくつか見つかりました。検出されたブロブ特徴を比較します。このプロセスは、ローカル パッチの記述子を判定する特徴抽出によって可能になります。

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

記述子の抽出ですべての初期点が使用されるとは限りません。イメージの境界に近すぎる点は棄却される場合があります。したがって、特徴記述子に加えて有効な点も返されます。

記述子の計算に使用されるパッチ サイズは、特徴抽出の処理中に決定されます。パッチ サイズは特徴検出時のスケールに対応します。パッチ サイズに関係なく、2 つの特徴ベクトル featuresOriginal および featuresDistorted は、その長さが等しくなるように計算されます。記述子によって、検出された特徴のサイズや回転に関係なく、これらの特徴を比較できるようになります。

マッチ候補を検索

関数 matchFeatures に記述子を入力して特徴間のマッチ候補を取得します。マッチ候補とは、結果に無効なマッチも含まれる可能性があることを示唆しています。2 つのパッチがマッチする場合、類似した特徴を示す場合もありますが、正しいマッチでない可能性もあります。テーブルの角が椅子の角のように見えることもありますが、この 2 つの特徴は明らかにマッチではありません。

indexPairs = matchFeatures(featuresOriginal,featuresDistorted);

両方のイメージから点の位置を求める

返された indexPairs の各行には、イメージ間における特徴のマッチ候補のインデックスが 2 つ含まれています。これらのインデックスを使って両方のイメージから実際の点位置を集めます。

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

マッチ候補を表示

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

Figure contains an axes object. The axes object with title Candidate matched points (including outliers) contains 4 objects of type image, line. One or more of the lines displays its values using only markers

特徴の位置を解析

十分な数の有効なマッチが得られた場合、誤ったマッチを削除します。このシナリオでは RANSAC アルゴリズムの使用が効果的です。関数estgeotform2dは、RANSAC アルゴリズムのバリエーションである M-estimator sample consensus (MSAC) を実装します。MSAC は、幾何学的変換を見つけてインライア (正しいマッチ) を外れ値 (誤ったマッチ) から分離します。

[tform,inlierIdx] = estgeotform2d(matchedDistorted, ...
    matchedOriginal,'similarity');
inlierDistorted = matchedDistorted(inlierIdx,:);
inlierOriginal = matchedOriginal(inlierIdx,:);

マッチする点を表示

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

Figure contains an axes object. The axes object with title Matching points (inliers only) contains 4 objects of type image, line. One or more of the lines displays its values using only markers These objects represent ptsOriginal, ptsDistorted.

計算された幾何学的変換を確認

計算された幾何学的変換を歪んだイメージに適用します。

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

復元後のイメージと元のイメージを表示します。

figure
imshowpair(original,recovered,'montage')

Figure contains an axes object. The axes object contains an object of type image.

複数の特徴を用いたイメージのレジストレーション

この例では、"局所特徴の使用" の例の結果を基に説明を進めます。複数の検出器と記述子のペアを使用すると、得られた結果を組み合わせて補強することが可能です。複数のペアは、1 つの特徴検出器では十分な数の正しいマッチ (インライア) が得られない場合にも役立ちます。

元のイメージを読み込みます。

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

Figure contains an axes object. The axes object contains 2 objects of type image, text.

元のイメージのスケールを変更して回転させ、歪んだイメージを作成します。

scale = 1.3;
J = imresize(original,scale);
 
theta = 31;
distorted = imrotate(J,theta);
figure
imshow(distorted)

Figure contains an axes object. The axes object contains an object of type image.

両方のイメージで特徴を検出します。まず BRISK 検出器を使用してから、SURF 検出器を使用します。

ptsOriginalBRISK = detectBRISKFeatures(original,MinContrast=0.01);
ptsDistortedBRISK = detectBRISKFeatures(distorted,MinContrast=0.01);

ptsOriginalSURF = detectSURFFeatures(original);
ptsDistortedSURF = detectSURFFeatures(distorted);

元のイメージと歪んだイメージから記述子を抽出します。BRISK の特徴には、既定で FREAK 記述子が使用されます。

[featuresOriginalFREAK,validPtsOriginalBRISK] = ...
    extractFeatures(original,ptsOriginalBRISK);
[featuresDistortedFREAK,validPtsDistortedBRISK] = ...
        extractFeatures(distorted,ptsDistortedBRISK);

[featuresOriginalSURF,validPtsOriginalSURF]  = ...
        extractFeatures(original,ptsOriginalSURF);
[featuresDistortedSURF,validPtsDistortedSURF] = ...
        extractFeatures(distorted,ptsDistortedSURF);

最初に FREAK 記述子をマッチさせ、次に SURF 記述子をマッチさせて、マッチ候補を判定します。できる限り多くの特徴マッチを取得するには、まず検出器と記述子のしきい値を既定値よりも低くしてマッチングを開始します。機能する設定が見つかったら、しきい値を徐々に大きくして特徴の抽出とマッチングに必要な計算負荷を減らします。

indexPairsBRISK = matchFeatures(featuresOriginalFREAK,...
            featuresDistortedFREAK,MatchThreshold=40,MaxRatio=0.8);

indexPairsSURF = matchFeatures(featuresOriginalSURF,featuresDistortedSURF);

BRISK および SURF のマッチする点の候補を取得します。

matchedOriginalBRISK = validPtsOriginalBRISK(indexPairsBRISK(:,1));
matchedDistortedBRISK = validPtsDistortedBRISK(indexPairsBRISK(:,2));

matchedOriginalSURF = validPtsOriginalSURF(indexPairsSURF(:,1));
matchedDistortedSURF = validPtsDistortedSURF(indexPairsSURF(:,2));

BRISK の推定マッチを可視化します。

figure
showMatchedFeatures(original,distorted,matchedOriginalBRISK,...
            matchedDistortedBRISK)
title('Putative matches using BRISK & FREAK')
legend('ptsOriginalBRISK','ptsDistortedBRISK')

Figure contains an axes object. The axes object with title Putative matches using BRISK & FREAK contains 4 objects of type image, line. One or more of the lines displays its values using only markers These objects represent ptsOriginalBRISK, ptsDistortedBRISK.

BRISK および SURF のマッチ候補の局所特徴を組み合わせます。Location プロパティを使用して、BRISK と SURF の特徴からの点の位置を組み合わせます。

matchedOriginalXY  = ...
    [matchedOriginalSURF.Location; matchedOriginalBRISK.Location];
matchedDistortedXY = ...
    [matchedDistortedSURF.Location; matchedDistortedBRISK.Location];

BRISK と SURF の特徴のインライア点と幾何学的変換を判定します。

[tformTotal,inlierIdx] = estgeotform2d(matchedDistortedXY,...
        matchedOriginalXY,'similarity');
inlierDistortedXY = matchedDistortedXY(inlierIdx, :);
inlierOriginalXY = matchedOriginalXY(inlierIdx, :);

結果を表示します。この結果には 1 つの特徴検出器を使用した例よりも多くのマッチが含まれています。

figure
showMatchedFeatures(original,distorted,inlierOriginalXY,inlierDistortedXY)
title('Matching points using SURF and BRISK (inliers only)')
legend('ptsOriginal','ptsDistorted')

Figure contains an axes object. The axes object with title Matching points using SURF and BRISK (inliers only) contains 4 objects of type image, line. One or more of the lines displays its values using only markers These objects represent ptsOriginal, ptsDistorted.

元のイメージと復元されたイメージを比較します。

outputView = imref2d(size(original));
recovered = imwarp(distorted,tformTotal,OutputView=outputView);
 
figure
imshowpair(original,recovered,'montage')

Figure contains an axes object. The axes object contains an object of type image.

参照

[1] Rosten, E., and T. Drummond. “Machine Learning for High-Speed Corner Detection.” 9th European Conference on Computer Vision. Vol. 1, 2006, pp. 430–443.

[2] Mikolajczyk, K., and C. Schmid. “A performance evaluation of local descriptors.” IEEE Transactions on Pattern Analysis and Machine Intelligence. Vol. 27, Issue 10, 2005, pp. 1615–1630.

[3] Harris, C., and M. J. Stephens. “A Combined Corner and Edge Detector.” Proceedings of the 4th Alvey Vision Conference. August 1988, pp. 147–152.

[4] Shi, J., and C. Tomasi. “Good Features to Track.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. June 1994, pp. 593–600.

[5] Tuytelaars, T., and K. Mikolajczyk. “Local Invariant Feature Detectors: A Survey.” Foundations and Trends in Computer Graphics and Vision. Vol. 3, Issue 3, 2007, pp. 177–280.

[6] Leutenegger, S., M. Chli, and R. Siegwart. “BRISK: Binary Robust Invariant Scalable Keypoints.” Proceedings of the IEEE International Conference. ICCV, 2011.

[7] Nister, D., and H. Stewenius. "Linear Time Maximally Stable Extremal Regions." 10th European Conference on Computer Vision. Marseille, France: 2008, No. 5303, pp. 183–196.

[8] Matas, J., O. Chum, M. Urba, and T. Pajdla. "Robust wide-baseline stereo from maximally stable extremal regions."Proceedings of British Machine Vision Conference. 2002, pp. 384–396.

[9] Obdrzalek D., S. Basovnik, L. Mach, and A. Mikulik. "Detecting Scene Elements Using Maximally Stable Colour Regions."Communications in Computer and Information Science. La Ferte-Bernard, France: 2009, Vol. 82 CCIS (2010 12 01), pp. 107–115.

[10] Mikolajczyk, K., T. Tuytelaars, C. Schmid, A. Zisserman, T. Kadir, and L. Van Gool. "A Comparison of Affine Region Detectors. "International Journal of Computer Vision. Vol. 65, No. 1–2, November 2005, pp. 43–72 .

[11] Bay, H., A. Ess, T. Tuytelaars, and L. Van Gool. “SURF: Speeded Up Robust Features.” Computer Vision and Image Understanding (CVIU). Vol. 110, No. 3, 2008, pp. 346–359.

[12] Alcantarilla, P.F., A. Bartoli, and A.J. Davison. "KAZE Features", ECCV 2012, Part VI, LNCS 7577 pp. 214, 2012

[13] Rublee, E., V. Rabaud, K. Konolige and G. Bradski. "ORB: An efficient alternative to SIFT or SURF." In Proceedings of the 2011 International Conference on Computer Vision, 2564–2571. Barcelona, Spain, 2011.

[14] Lowe, David G.. "Distinctive Image Features from Scale-Invariant Keypoints." Int. J. Comput. Vision 60 , no. 2 (2004): 91--110.

関連するトピック