Predator's Vision

画像処理、3D点群処理、DeepLearning等の備忘録

画像間の特徴点対応付け~マッチング方式とオプティカルフロー方式~

最終出力として2画像間の特徴点の対応関係を求めたいという場合、その方式には大きく2種類がある。
この観点からまとめられている記事をあまり見た事がないので投稿。

マッチング方式

「特徴点 対応付け」や「特徴点 マッチング」と検索すると引っかかるのは大体この方式のこと。
特徴点は英語では feature (point) と言ったり keypoint と言ったりする。
ブロック図にすると下記のようになる:

マッチング方式のブロック図
BlockDiagram

つまり、処理手順としては

  1. 双方の画像で「特徴点」を見つける
  2. 双方の画像で見つけた特徴点について「特徴量(特徴記述子と言ったりもする)」を求める
  3. 双方の特徴量を比較して一番近しい(似ている)ペアを見つける

という流れ。

特徴点抽出手法や特徴量記述手法にはいろんなものが提案されている。

  • 2つセットで提案されているものとして、例えばSIFT, SURF, ORB, KAZE, AKAZE, etc...
  • 特徴点抽出(検出)手法単体として提案されているものとして、例えばHarrisコーナー, Shi-Tomasiコーナー(=GFTT), FAST, etc...
  • 大抵の特徴点抽出手法や特徴量記述手法はグレースケール画像に対して実施するが、RGB画像をそのまま使用するものもあるようだ。例えば、SIFTに色情報を追加する論文がいくつか見つかる。

処理が理解しやすいように、ブロック図にイメージ図も付け足すとこんな感じ:

マッチング方式のイメージ図
BlockDiagram

ちなみに近しい特徴量が複数ある場合はマッチングに失敗することもある。例えばこんな感じ:

マッチング失敗の例
マッチング失敗の例

このような誤マッチングの回避策として、例えばOpenMVGでは下記のようなチェックがなされている:

誤マッチング回避方法のコンセプト
誤マッチングの回避策

つまり特徴が突出しているわけではなければ、マッチング不成立としよう、という考え方。
他にも、双方向にマッチングしてみて、結果が1対1対応しなければ、棄却する、などという手法もある。
ただ、どんどん計算量が増えていってしまうところが悩みどころ。

オプティカルフロー方式(疎)

ここではLucas-kanade法を扱うこととする。
また、説明の簡単化のためにPyramidの件は省略する。
ブロック図にすると下記のようになる:

疎なオプティカルフロー方式のブロック図
疎なオプティカルフロー方式のブロック図

つまり、処理手順としては

  1. 片方の画像で「特徴点」を見つける
  2. 片方の画像について微分画像」を求める
  3. 片方の画像の特徴点と微分画像ともう片方の画像から、特徴点の移動先を推定する(追跡する)

という流れ。

特徴点を追跡するので英語ではtrackingと言ったりする。matchingしているわけではない。
どうして「こんな処理でもう一方の画像上で対応点が見つかるのか?」という疑問に対する雑な回答としては、
「数学的に計算するとこれでできる」となる。下記でわかりやすく解説されている:
OpenCVでとらえる画像の躍動、Optical Flow - Qiita
オプティカルフロー推定の原理・特徴・計算式 | アルゴリズム雑記


処理が理解しやすいように、ブロック図にイメージ図も付け足すとこんな感じ:

疎なオプティカルフロー方式のイメージ図
疎なオプティカルフロー方式のイメージ図

オプティカルフロー方式でも誤った点対応(誤トラッキング)が発生する可能性がある。
具体的には「同じような模様の繰り返し」である。