Python

Pythonで画像のテンプレートマッチングしてみる

テンプレートマッチングで何ができる?

テンプレートとして与えた画像に近い領域を別の画像から発見することができます。
今回はPythonとopencvを使ってテンプレートマッチングを試します。

環境

使用したPythonとライブラリのバージョンは以下になります。

Python 3.8.12
opencv-python 4.5.5.62
matplotlib 3.5.1

使用データ

いらすとや様のハエホールケーキのイラストを加工して使用しました。

コード

import cv2
import matplotlib.pyplot as plt

# 画像の読み込み
image = cv2.imread("./image.png")
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
template = cv2.imread("./template.png") # テンプレート
template = cv2.cvtColor(template, cv2.COLOR_BGR2RGB)

_, w, h = template.shape[::-1]

# テンプレートマッチング
result = cv2.matchTemplate(image, template, method=cv2.TM_CCORR_NORMED) # 類似度に正規化相互相関を利用

# min_val, max_valにはマッチングのスコアが記録されているが今回は利用しない。
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

# マッチング結果、最もスコアの高い領域の左上の座標を取得
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(image, top_left, bottom_right, 255, 2)

plt.subplot(111), plt.imshow(image, cmap="gray")
plt.title("マッチング結果"), plt.xticks([]), plt.yticks([])
plt.show()

 

実験

今回はケーキの画像中のハエを探します。

ハエ(テンプレート)

ハエの乗ったホールケーキ

ハエの角度とサイズを変えた2パターンを用意しました。

1つめはクエリと同じ角度・サイズのハエが乗ったケーキです。

2つめはクエリから角度とサイズを変えたハエが乗ったケーキです。

マッチングの結果

1つめの画像については上手くハエの位置をマッチングできているようです。

2つめの画像についてはいちごをハエとして検出してしまっています。

上記のテンプレートマッチングでは、テンプレートの角度やサイズを考慮したマッチングをしないため、上手く行きません。

終わりに

今回はテンプレートマッチングを試してみました。

実験結果のように扱いづらい部分がありますが、目的の画像について形状やサイズが決まっていれば使えるかもしれません。

構築の大変なアルゴリズムやモデルを用意する前にテンプレートマッチングが利用できないか考えてもよさそうですね。

Pythonで動画から毎秒のフレームを抽出する動画からのフレーム抽出 以前の記事で画像のパターンマッチングを試しました。 https://gri.jp/media/entry...
Y.N
GRIでデータ分析やアルゴリズム開発、ForecastFlowの開発に携わっています。