はじめに
OpenCVとはインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリで、画像処理・画像解析および機械学習等の機能を持つC/C++、Java、Python、MATLAB用ライブラリとなっています。
OpenCVには以下のような機能があります。
- グレースケール化
- 2値化
- 輪郭の検出
- 顔検出
- ノイズ除去
- テンプレートマッチング
テンプレートマッチングとは、画像中からテンプレートと類似した部分を探し出す画像処理のことです。テンプレートマッチングはOpenCV用いて簡単に実施できます。
本記事では、OpenCVを用いたテンプレートマッチングの方法を紹介します。
1. 本記事で使用する画像
本記事では、以下の麺屋こころの全部のせ台湾まぜそばの画像を用います。
そしてテンプレート画像は以下の卵の黄身部分とします。
2. テンプレートマッチング
テンプレートマッチングとは、画像中からテンプレートと類似した部分を探し出す画像処理のことです。
テンプレート画像を用意して、テンプレート画像のサイズで対象画像内で合わせながら、類似度が高い部分を抽出していきます。以下のようにテンプレート画像を左上から右下に動かしていき、類似度を算出します。
類似度を算出すると以下のように各マスに信頼度が格納されたデータを取得することができます。こちらは拡大した図になっていて上記の画像であればもっとマス目があります。下図では類似度1の箇所が最も類似度が高い箇所となります。
そして、上記のように類似度を算出して、類似度が高い部分を抽出していきます。本記事では抽出ではなく、類似度が最も高い部分を赤い枠で囲いたいと思います。最終的には以下のような画像を取得することを目指します。
3. OpenCVを用いたテンプレートマッチング
OpenCVを用いてテンプレートマッチングを実施するには、cv2.matchTemplate()を用います。cv2.matchTemplate()は以下の様に用います。
result = matchTemplate(image, templ, method)
引数は以下の表の内容になります。
引数 | 内容 |
---|---|
img | 対象画像 |
templ | テンプレート画像 |
method | 類似度の計算方法 ・cv2.TM_SQDIFF:二乗差 ・cv2.TM_SQDIFF_NORMED:正規化二乗差 ・cv2.TM_CCORR:相互相関 ・cv2.TM_CCORR_NORMED:正規化相互相関 ・cv2.TM_CCOEFF:相関係数 ・cv2.TM_CCOEFF_NORMED:正規化相関係数 |
類似度の種類は複数ありますが、基本的にはcv2.TM_CCOEFF_NORMEDを用れば問題ないと思います。cv2.TM_CCOEFF_NORMEDでうまくいかないケースでは他の方法も試してみてください。
こちらの返り値のresultは行列情報で、各マスでの類似度が格納されています。
類似度の行列情報から条件を満たす要素のインデックス(位置)を取得するにはnp.where()を用います。例えばresultという0~1の値が格納された行列があり、その格納された値が0.9以上の要素のインデックス(位置)を取得しています。以下の場合、[縦方向位置, 横方向位置]=[237, 441], [237, 442]・・・の組み合わせの座標情報となります。
なお、ここで得られる要素のインデックスは画像の左上を原点としたインデックス(位置)となっています。例えば今回の画像をグラフ化すると下図のようになり、左上が原点になっているのがわかると思います。
類似度が高い箇所に赤枠を描画するにはcv2.rectangle()を用います。四角形を描画するcv2.rectangle()は以下の様に用います。
cv2.rectangle(img, pt1, pt2, color, thickness=***)
引数は以下の様になります。
引数 | 内容 |
---|---|
img | 対象の画像 |
pt1 | 四角形の左上の座標(タプル型) |
pt2 | 四角形の右下の座標(タプル型) |
color | 線の色、(青, 緑, 赤)の順で記載 |
thickness | 線の太さ |
それではテンプレートマッチングを行い、類似度が高いhttps://blog.hatena.ne.jp/chantastu/chantastu.hatenablog.com/edit?utm_source=admin-sidebar&utm_medium=referral&utm_campaign=new_entry#source箇所を赤枠で囲いたいと思います。以下の例では、cv2.TM_CCOEFF_NORMED:正規化相関係数を用いてテンプレートマッチングを行い、類似度を算出しています。さらに類似度の閾値thresholdを設け、類似度が0.95以上の座標情報を取得するようにしています。取得した座標はマッチした箇所の左上の座標になるため、四角形の描画の際の右下の座標を求めるのに、左上の座標(x, y)にテンプレート画像のサイズ(w, h)を足しています。
出力結果は以下の様になります。卵の黄身部分が赤枠で囲われていますね。
オススメ書籍
Pythonで始めるOpenCV4プログラミング
実践OpenCV4 for Python 画像映像情報処理と機械学習
スキル修得&転職
近年、DXの進展に伴うデジタル人材の需要の高まりに追いついていない状況が続いていると経済産業省がホームページで記載している通り、DX人材、IT人材が不足しているのが現状です。さらにコンピュータの性能向上やAI技術の発展により、よりDX人材、IT人材の需要が高まってきます。さらには、今後の長期間安定して職がある業種とも考えられます。
以下の求人では、IT業界の転職や、IT未経験だけどIT人材を志望する就活を支援してくれます。無料で会員登録もできるので、まずは登録だけでもして様子を見てみてはいかがでしょうか?
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
おわりに
本記事では、OpenCVを用いたテンプレートマッチングの方法を紹介しました。こちらの技術を用いることで、人物検出や外観検査や類似度検査などに応用することができます。