手習ひデジタル信号処理(152) Scilab、{IPCV}、画像特徴点、いろいろあるけど?

Joseph Halfmoon

前回まで「なんちゃら変換」。今回から「画像特徴点」に進出?英語で”Detect features from an image”あるいは”Feature detection”か。”Keypoint detection”言う場合は微妙に目的が違う感じがします。そのクセ同じお名前のアルゴリズムが登場。素人老人は知らんけど。

※「手習ひデジタル信号処理」投稿順 Indexはこちら

※Windows11上の    Scilab2024.0.0およびScilab上のScilab IPCVツールボックスを使用させていただいております。

画像特徴点の抽出

CNNベース全盛の世の中に、今回とりあげるような「人為的」なアルゴリズムは「ちょっち」クラッシックな感じもしないでもないです。知らんけど(素人老人の戯言です。)でもま、古代より綿々と研究されてきており、目的によってはハマる用途も多いのではと思います。

さて、IPCVツールボックスにはこの特徴点を発見するためのアルゴリズムを実装した関数多数が存在します。思うに、

    1. 特徴点の位置を発見する
    2. 該当の特徴点「回り」の特徴量というものを計算する
    3. 異なる画像中の特徴点の特徴量を比較していって
    4. これとこれが一致よ、と答える

てなステップの第1段階であります。古典的な用途としたら

車載カメラで撮った画像の中から交通標識を認識する

などでしょうか。そこで重要なのが、

大きさに対して不変、回転に対して不変

という点であります。遠くから見ても、近くから見ても、ちょっと角度がついていても、時速40km制限の標識は同じに認識したいです(知らんかったとは言わせん?)

さてIPCVツールボックス中には以下のアルゴリズムを実装した関数群が存在します。

    • SIFT、 Scale-Invariant Feature Transformation
    • SURF、 Speeded Up Robust Features
    • FAST、 Features from Accelerated Segment Test
    • BRISK、 Binary Robust Invariant Sclable Keypoints
    • ORB、 Oriented FAST and Rotated BRIEF
    • STAR
    • MSER、 Maximally Stable Extermal regions
    • GFTT、 Good Features to Track

上記はHELPページに記載されている関数のみで、どうも上記以外のアルゴリズムを実装した関数も「存在」するやに見えます。まあお惚け老人はHELPページ無には使い方が分からんのでやらんけど。

なお以下のOpenCV日本語ドキュメント(『鳥取大学』様サイト内のもの、多分あちこちに同等のページ散在しており)を読んでいて1つ注意点に遭遇。

ORB Oriented FAST and Rotated BRIEF

1か所引用させていただきます。

SIFTとSURFは特許使用料を支払う必要はありますが,ORBは違います.

そうだったのね~。SIFTが最も古典的で、それを簡素で軽くしたSURF、そしてより速くより軽いアルゴリズムが百花繚乱という感じじゃないかと思うので(お惚け老人の個人の感想っす)、商用利用する場合に今更古いアルゴリズムは使わんかも知れんけど。

改造した処理例

例によってHELPファイル記載の各関数の処理例をつなぎ合わせてみたコードが以下です。列挙した中でも古典的なやつから、よく聞くものどもを5種類ほど選んでみました(個人の偏見デス。)

S = imcreatechecker(8,8,[1 0.5]);
fobjSI = imdetect_SIFT(S);
fobjSU = imdetect_SURF(S);
fobjFA = imdetect_FAST(S);
fobjBR = imdetect_BRISK(S);
fobjOR = imdetect_ORB(S);
scf();
subplot(161); title('Original'); imshow(S);
subplot(162); title('SIFT'); imshow(S); plotfeature(fobjSI);
subplot(163); title('SURF'); imshow(S); plotfeature(fobjSU);
subplot(164); title('FAST'); imshow(S); plotfeature(fobjFA);
subplot(165); title('BRISK'); imshow(S); plotfeature(fobjBR);
subplot(166); title('ORB'); imshow(S); plotfeature(fobjOR);

上記の結果が以下に。featureDetection

青×マークで特徴点の場所が示されておるのですが、イマイチ見えずらい?お手数かけますが拡大してくだされや。こうしてみると、検出する場所、アルゴリズムによって結構クセが強いのね。。。

手習ひデジタル信号処理(151) Scilab、{IPCV}、流域変換って何よ? へ戻る

手習ひデジタル信号処理(153) Scilab、{IPCV}、画像特徴点、つづき へ進む