[scikit-image] 67. テンプレートマッチングを用いた移動体追跡と位置合わせ(skimage.feature match_template)

python

はじめに

テンプレートマッチングは、画像処理において特定のパターン(テンプレート)を別の画像内で探し出す手法です。scikit-imageライブラリのmatch_template関数を使うことで、動く物体の追跡や画像の位置合わせが可能になります。本記事では、この関数の使い方と実際の適用例について解説します。

コード

コードをダウンロード(.pyファイル)

コードをダウンロード(.ipynbファイル)

解説

モジュールのインポートなど

画像の読み込み

本記事ではChromeブラウザの「chrome://dino/」で遊べるゲームの画像を使用します。分析対象は、下記記事を参考にして切り取ったスクリーンショットです。

[scikit-image] 64. 画像の切り取り(skimage.util crop)
scikit-imageライブラリのcrop関数を使用して画像をトリミングする方法を解説します。基本的な使い方から応用例まで、Pythonコードとともに画像切り取りの実装方法を紹介しています。

mpl_toolkits.axes_grid1 のImageGridを用いて画像を表示すると下記のようになります。

今回はこの画像のサボテンの位置の変化を追跡します。

テンプレートマッチング

テンプレートマッチングについては下記記事で解説しました。

[scikit-image] 44. テンプレートマッチングによる画像識別(skimage.feature match_template)
scikit-imageライブラリのmatch_template関数を用いたテンプレートマッチング技術について解説。画像内から特定のパターンを検出する方法と実装例、応用例を紹介し、画像認識における基本技術の理解を深める内容です。

画像内のサボテンに相当する部分をテンプレートマッチングで検出します。 match_templateにおいてpad_input=Trueを設定すると、適切な補間を使用したテンプレートマッチングが行われ、出力画像のサイズが入力画像と同じになります。

np.unravel_index(np.argmax(result), result.shape)を使用することで、最大値のインデックス(最も適合する部分の位置)を取得できます。

得られるijはy,xの順になっているため、x, y = ij[::-1]と記述して正しいx,y座標を取得します。

結果表示にはGridSpecを使用しています。左側にテンプレート画像、右上に元画像を表示し、最も適合する部分にテンプレートサイズの四角形を描画しています。右下はmatch_templateの出力画像で、サボテンの部分だけが赤く表示されていることが確認できます。

全画像のサボテンの位置を求める

複数の画像に対してテンプレートマッチングを適用し、検出された座標位置に緑色の円を描画しました。各画像は透明度0.1で重ねて表示することで、移動の軌跡を視覚化しています。

テンプレートマッチングで検出した画像の位置合わせ

最初の画像を基準として、各画像におけるサボテンの位置の差分を計算しました。

この差分に基づき、AffineTransformとwarp関数を使用して画像をシフトさせました。すべての画像を透明度0.2で重ねて表示した結果が上記の通りです。

サボテンの位置が完全に一致し、ブレが生じていないことが明確に確認できます。

まとめ

scikit-imageのmatch_template関数を使用したテンプレートマッチングは、画像内の特定パターンを効率的に検出するための強力なツールです。この手法は物体追跡、位置合わせ、画像認識など様々な用途に応用可能です。正規化相関係数を用いることで、照明条件の変化にも比較的ロバストな結果が得られます。テンプレートの適切な選択と前処理が重要であり、実装が比較的シンプルながらも多くの実用的な場面で有効な手法と言えるでしょう。

参考

Template Matching — skimage 0.25.2 documentation
skimage.feature — skimage 0.25.2 documentation
skimage.transform — skimage 0.25.2 documentation
skimage.transform — skimage 0.25.2 documentation

コメント