PythonとOpenCVで画像のテンプレートマッチング(SSD)を行う方法をソースコード付きで解説します。
テンプレートマッチング(SSD)
テンプレートマッチング(Template matching)とは、入力画像中からテンプレート画像(部分画像)と最も類似する箇所を探索する処理です。
今回は、SSDを類似評価値とし、以下の2通りの方法でテンプレートマッチングの処理を実装する方法を解説します。
①OpenCVの「cv2.matchTemplate」で実装
②NumPyで実装
SSD(Sum of Absolute Difference)では、「画素値の差分の二乗値の和」で類似度を評価します。
この場合も値が最小になる場所が類似度が最も高いことになります。
書式(OpenCV)
match = cv2.matchTemplate(gray, temp, cv2.TM_SQDIFF) min_value, max_value, pt_min, pt_max = cv2.minMaxLoc(match)
パラメータ | 説明 |
---|---|
gray | 入力画像(グレースケール) |
temp | テンプレート画像(グレースケール) |
pt_min | スコアが最小の走査位置(最も類似する点) |
pt_max | スコアが最大の走査位置(最も類似しない点) |
サンプルコード①「cv2.matchTemplate」で実装
サンプルコード②NumPyで実装
実行結果
サンプルプログラムの実行結果です。
■左から入力画像(input.jpg)、テンプレート画像(temp.jpg)、出力画像(result.jpg)
お借りした画像:プロ生ちゃん(暮井 慧)
テンプレートマッチング(SAD)
SAD(Sum of Absolute Difference)では、「画素値の差分の絶対値の和」で類似度を評価します。
この場合も値が最小になる場所が類似度が最も高いことになります。
今回は、SADを評価値とし、以下の2通りの方法でテンプレートマッチングの処理を実装しました。
– | – |
---|---|
1 | OpenCVの「cv2.matchTemplate」で実装 |
2 | NumPyライブラリで実装 |
書式(OpenCV)
match = cv2.matchTemplate(gray, temp, cv2.TM_SQDIFF_NORMED) min_value, max_value, pt_min, pt_max = cv2.minMaxLoc(match)
パラメータ | 説明 |
---|---|
gray | 入力画像(グレースケール) |
temp | テンプレート画像(グレースケール) |
pt_min | スコアが最小の走査位置(最も類似する点) |
pt_max | スコアが最大の走査位置(最も類似しない点) |
サンプルコード①
サンプルコード②
実行結果
サンプルプログラムの実行結果です。
■左から入力画像(input.jpg)、テンプレート画像(temp.jpg)、出力画像(result.jpg)
お借りした画像:プロ生ちゃん(暮井 慧)
テンプレートマッチング(NCC)
NCC(Normalized Cross Correlation)では、「正規化相互相関」で類似度を評価します。
NCCの値は-1.0~1.0に収まり、最大値である1.0に近いほど類似度が高くなります。
https://algorithm.joho.info/image-processing/template-matching-sad-ssd-ncc/
今回は、NCCを評価値とし、以下の2通りの方法でテンプレートマッチングの処理を実装しました。
①OpenCVの「cv2.matchTemplate」で実装
②NumPyライブラリで実装
書式(OpenCV)
match = cv2.matchTemplate(gray, temp,cv2.TM_CCORR_NORMED) min_value, max_value, pt_min, pt_max = cv2.minMaxLoc(match)
パラメータ | 説明 |
---|---|
gray | 入力画像(グレースケール) |
temp | テンプレート画像(グレースケール) |
pt_min | スコアが最小の走査位置(最も類似しない点) |
pt_max | スコアが最大の走査位置(最も類似する点) |
サンプルコード①
サンプルコード②
サンプルプログラムの実行結果です。
■左から入力画像(input.jpg)、テンプレート画像(temp.jpg)、出力画像(result.jpg)
お借りした画像:プロ生ちゃん(暮井 慧)
テンプレートマッチング(ZNCC)
ZNCC(Zero-mean Normalized Cross Correlation)では、「ゼロ平均正規化相互相関」で類似度を評価します。
ZNCCの値は-1.0~1.0に収まり、最大値である1.0に近いほど類似度が高くなります。
今回は、ZNCCを評価値とし、以下の2通りの方法でテンプレートマッチングの処理を実装する方法を解説します。
①NumPyライブラリで実装
②OpenCVの「cv2.matchTemplate」で実装
書式
match = cv2.matchTemplate(gray, temp, cv2.TM_CCOEFF_NORMED) min_value, max_value, pt_min, pt_max = cv2.minMaxLoc(match)
パラメータ | 説明 |
---|---|
gray | 入力画像(グレースケール) |
temp | テンプレート画像(グレースケール) |
pt_min | スコアが最小の走査位置(最も類似しない点) |
pt_max | スコアが最大の走査位置(最も類似する点) |
サンプルコード①
サンプルコード②
実行結果
サンプルプログラムの実行結果です。
■左から入力画像(input.jpg)、テンプレート画像(temp.jpg)、出力画像(result.jpg)
コメント