OpenCVの勉強も、テンプレートマッチングのところまでやってきました。
ひとくちにマッチングと言っても、いろいろな手法があるようで、テンプレートマッチングを実際にコーディングする前に、各手法の大まかな立ち位置を理解しておこうと思います。
特徴ベースマッチング(Feature-Based Matching)と領域ベースマッチング(Area-Based Matching)の違い
マッチングの手法には大きく分けて、特徴ベースマッチング(Feature-Based Matching)と領域ベースマッチング(Area-Based Matching)があります。
特徴ベースマッチングでは,画像からエッジやコーナー等の特徴点を抽出し、その周囲の領域から特徴量を計算することで画像間のマッチングを行います。
特徴点を元にマッチングを行うので、画像の変形に強いマッチング方法であると言われています。特徴点の抽出には時間がかかることが多いですが、マッチング自体には比較的時間が掛からないため、大量の画像のマッチングに向いています。
それに比して、領域ベースマッチングでは探索したい画像をテンプレートとして用意し、探索対象の画像と逐一比較を行うことで類似領域を見つけ出します。
全探索するので当然のことながらマッチングに時間が掛かりますが、その分、密な探索が可能です。
ただ、テンプレートの差分を逐一比較すると言う手法から、画像の変形には、弱いと言われます。
また、絶対に類似の無い領域の探索を行わないことで大幅にマッチング時間を短縮する手法もあるようです。(今度調べたいと思います)
領域ベースマッチングいろいろ
で、今回のテンプレートマッチングは領域ベースマッチングに属するので、その手法のいくつかについて調べてみました。
テンプレート画像と探索対象の同じ位置の画素の輝度値の差の絶対値を合計することで、両者がどれほど異なるかを計算する。そのため、値が0に近いほど、類似しているといえる。
テンプレート画像と探索対象の同じ位置の画素の輝度値の差の2乗を合計することで、両者がどれほど異なるかを計算する。そのため、値が0に近いほど、類似しているといえる。
上記の2つと異なり、NCC は画像間の類似度を調べる手法。意味的には2点間のコサインに近く、1~-1の値をとる。1なら同一画像ということ、-1ならネガポジ反転画像ということになる。
NCCより明るさの変化に強い、ZNCC(Zero-mean Normalized Cross Correlation)というのもある。
POC は,画像をフーリエ変換して得られる情報のうち、位相情報のみを用いて画像をマッチングする手法。NCCと同様、画像間の類似度を計算している。両者が類似している場合、POC 関数は非常に鋭いピークを有している。なお、このピークの座標は、両類似画像の位置ずれに相当する。