[Python]OpenCVによるエッジ検出 Cannyフィルタ
エッジ検出の人気手法CannyフィルタをOpenCVで実装
画像処理の人気は右肩あがりで,私が所属している会社でも需要がどんどん増えています。この画像処理の需要は今後もドンドン増えていくと思いますのでこの分野を勉強するのは合理的です。下に画像処理分野の需要推移について記載します。
こう見ると目覚ましい伸びですよね。今後日本の労働人口が減っていくことを考慮すると今後の伸びにも期待できます。
そんな画像処理において必須技術であるエッジ検出を紹介していきます。
エッジ検出には主に以下3通りのエッジ検出方法があります。
- ラプラシアンフィルタ
- Sobelフィルタ
- Cannyフィルタ (本記事)
その中でも一番人気があるCannyフィルタによるエッジ検出を紹介していきます。
Cannyフィルタによるエッジ検出 Python(OpenCV)で実装
OpenCVは非常に人気のある画像処理ライブラリで,主要な画像処理は簡単なプログラミングで実装できます。
画像処理の基本についてはこちらの記事で,OpenCVによる画像の読込などはこちらの記事で紹介していますので是非見ていってください。
今回はPythonを使って実装していきます。なお,画像処理を行う上でサンプル画像にするのは2020年11月時点で大人気を誇るVTuberの一人,百鬼あやめ様の画像を使わせていただきます。和風な感じでかわいいですし,周りの浮遊霊?でエッジ検出が綺麗に確認できそうです。
こちらの画像をC:\Temp\ayame.jpgという名前で保存して以下のプログラムを実行するだけでCannyフィルタによるエッジ検出ができます。
import cv2
img = cv2.imread('C:/Temp/ayame.jpg') #これでimgに画像データが入る
dst = cv2.Canny(img,40,200) #Cannyフィルタでエッジ検出(40,200をベースとする)
cv2.imwrite('C:/Temp/Canny.jpg',dst) #画像を保存
このプログラムを実行した後の画像が以下になります。
かなり細かくエッジ検出ができていますね。Cannyフィルタはエッジ検出の中でも人気のある手法なので精度が高い事が伺えます。
このCannyフィルタで指定できるパラメータについても紹介していこうと思います。
cv2.Canny関数の解説
Cannyフィルタリングを実施するcv2.Canny関数について解説します。
cv2.Canny(img, threshold1,threshold2)
- img・・・フィルタリング対象の元画像データ
- threshold1・・・1番目の閾値
- threshold2・・・2番目の閾値
なんだかあいまいな引数ですよね。threshold1とthreshold2はちょっと特殊な引数で 小さいほうがエッジ同士を接続するためのパラメータ,大きい方が強いエッジの初期検出に用いられます。上記のサンプル画像はthreshold1を40,threshold2に200を指定していますが,この値を少し変えてみた結果を紹介します。
threshold2を低くするとキメの細かいエッジ処理がされていますね。ただ変化量が少ないので皆さんの画像で試す場合もいくつか試してみたほうが良いと思います。