OpenCVと言えば、顔認識で有名です。
しかし、それ以外にも使える機能がたくさんあります。
例えば、この記事で解説するエッジ検出です。
エッジ検出は、画像処理の基本中の基本と言えます。
本記事の内容
- エッジ検出とは?
- OpenCVにおけるエッジ検出
- cv2.Canny関数によるエッジ検出
それでは、上記に沿って解説していきます。
エッジ検出とは?
エッジ検出とは、画像処理における用語です。
専門用語というヤツです。
その内容は、特徴検出や特徴抽出の一つと言えます。
では、具体的にどのようにして画像の特徴を掴むのでしょうか?
それは、画像の明るさが鋭敏になっている箇所を特定することで特徴を掴みます。
ここで言う鋭敏とは、明るさが不連続に変化している箇所を意味しています。
鋭敏とか不連続とか用語が難しい!!
ざっくり言えば、境界線を認識することで画像の特徴を検出するのです。
エッジは、一般的には「ふち」「へり」「端」を意味します。
何かの端と何かの端が合わさると、それは境界線となりますよね。
よって、エッジ検出とは境界線を認識(検出)することだと言えます。
境界線を表示するとどうなるのでしょうか?
試しに、上の画像において境界線を表示してみましょう。
このような結果となります。
境界線を表示すると、何かを検出・抽出することができます。
つまり、物体を検出できるということです。
以上をひっくるめて、エッジ検出と言います。
これで、エッジ検出が何たるかイメージできたはずです。
次に、OpenCVにおけるエッジ検出を見ていきましょう。
OpenCVにおけるエッジ検出
エッジ検出には、様々な手法が存在しています。
そして、OpenCVにもいろいろな手法が関数として用意されています。
「OpenCV エッジ検出」で調べると、以下がヒットします。
- Canny法
- Sobel(ソーベル)フィルタ
- Laplacian(ラプラシアン)フィルタ
- Prewitt(プレヴィット)フィルタ
ただ、基本的に覚えるのは一つでいいでしょう。
Canny法、とりあえずはこれだけを覚えましょう。
他の手法も使いこなせた方がよいのは、確かでしょう。
関数として存在している時点で、利用価値は存在しているはずです。
しかし、「エッジ検出」のWikiには次のように記載されています。
事前条件が特殊でない限り、キャニー法よりも性能のよいエッジ検出法を見つけることは難しい。
以上より、エッジ検出はCanny法で行うのがよいでしょう。
もちろん、OpenCVにはCanny法でエッジ検出を行うための関数が用意されています。
その関数名は、そのまんまの「cv2.Canny」です。
次では、実際にcv2.Canny関数でエッジ検出を行いましょう。
cv2.Canny関数によるエッジ検出
前提として、OpenCVをインストールしておいてください。
OpenCVのインストールに関しては、次の記事で解説しています。
cv2.Canny関数でエッジ検出を行うためのサンプルコードは以下。
import cv2 img = cv2.imread('sample.jpg', 0) edges = cv2.Canny(img, 100, 200) cv2.imwrite('sample_edge.jpg', edges)
たったこれだけで、Canny法によるエッジ検出が実現可能です。
sample.jpgは、入力用の画像となります。
スクリプトを同じ場所に画像を設置します。
sample.jpg
プログラムを実行すると、同じフォルダ上にエッジ検出した結果の画像が作成されます。
sample_edge.jpg
簡単ですね。
cv2.Canny関数のパラメータは、状況によって変更する必要はあるでしょう。
でも、画像処理の素人がこうも簡単にエッジ検出をできてしまいます。
Canny法を考えたキャニーさん、OpenCVを開発している有志に感謝。