OpenCVのエッジ検出を解説

OpenCVのエッジ検出を解説プログラミング
ゆうすけ
ゆうすけ

OpenCVのエッジ検出って何ですか…?

資格マフィア
資格マフィア

エッジ検出とは「画像から物体の輪郭を検出する」処理だ。
OpenCV のエッジ検出には様々な方法がある。

 

✔️ 本記事のテーマ

OpenCVのエッジ検出について

 

✔️ 読者さんへの前置きメッセージ

本記事は「OpenCV の様々なエッジ検出方法」について書いています。

 

画像処理ライブラリの OpenCV を使うことでエッジ検出を簡単に行うことができます。

ただ、OpenCV のエッジ検出にはさまざまな方法があります。

 

この記事では、それぞれの方法をサンプルコードとともに解説しています。

 

この記事に掲載しているサンプルコードは環境さえ整っていれば、
コピペで動くはずなので使用して頂いてOKです。

 

それでは、解説していきましょう。

 

まずはOpenCVをインストールする

OpenCVを使うには、まず自身の環境にOpenCVをインストールする必要があります。

 

以下のコマンドでOpenCVをインストールしましょう。

pip install opencv-python

 

OpenCVのインストール方法について詳しく知りたい場合は
【python】OpenCVのインストール方法
の記事を参照してみて下さい。

 

OpenCV のエッジ検出とは?

エッジ検出とは

画像中の物体から輪郭を検出して際立たせる

画像処理のことです。

 

OpenCV の機能を使うことでエッジ検出を簡単に行うことができます。

OpenCV のエッジ検出とは?

 

また、OpenCV にはエッジ検出のための様々な方法があります。

 

この記事ではそれぞれの方法を解説して比較していきます。

 

OpenCV のエッジ検出手法

OpenCV のエッジ検出には以下の方法があります。

  • Sobelフィルターによるエッジ検出
  • Laplacianフィルターによるエッジ検出
  • Canny 法によるエッジ検出

 

それぞれの処理によって、
検出されるエッジが異なるので順番に解説していきましょう。

 

Sobelフィルターによるエッジ検出

Sobelフィルターによるエッジ検出

OpenCV では Sobel フィルターによるエッジ検出をすることができます。

 

Sobel フィルターでは、1次微分による勾配検出フィルタで輪郭を検出します。

特徴として、はっきりと分かりやすい輪郭検出です。

 

Sobel フィルターによるエッジ検出には cv2.Sobel 関数を使います。

import cv2


img = cv2.imread('./sample.png')

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

img_after = cv2.Sobel(img_gray, cv2.CV_32F, 1, 0, ksize=3)

cv2.imwrite('./sample_after.png', img_after)

 

cv2.Sobel 関数の引数

  • src: 入力画像
  • bit: 出力画像のビット深度
  • dx: x方向微分の次数
  • dy: y方向微分の次数
  • ksize: カーネルサイズ

となっています。

 

Laplacianフィルターによるエッジ検出

Laplacianフィルターによるエッジ検出

OpenCV では Laplacian フィルターによるエッジ検出をすることができます。

 

Laplacian フィルターでは、2次微分による勾配検出フィルタで輪郭を検出します。

そのため、細かく繊細な輪郭検出になります。

 

Laplacian フィルターによるエッジ検出には cv2.Laplacian 関数を使います。

import cv2


img = cv2.imread('./sample.png')

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

img_after = cv2.Laplacian(img_gray, cv2.CV_32F)

cv2.imwrite('./sample_after.png', img_after)

 

cv2. Laplacian 関数の引数

  • src: 入力画像
  • bit: 出力画像のビット深度

となっています。

 

Canny 法によるエッジ検出

Canny 法によるエッジ検出

OpenCV では Canny 法によるエッジ検出をすることができます。

 

Canny 法は以下のように閾値を使ってエッジ検出を行う方法です。

  • ガウシアンフィルタで画像を平滑化
  • ソーベルフィルタで勾配の大きさと方向を求める
  • 勾配方向と大きさを元に細線化する
  • 閾値化でエッジを検出する

 

公式ドキュメント:
http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_canny/py_canny.html

 

Canny 法によるエッジ検出には cv2.Canny 関数を使います。

import cv2


img = cv2.imread('./sample.png')

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

img_after = cv2.Canny(img_gray, 100, 200)

cv2.imwrite('./sample_after.png', img_after)

 

cv2. Canny 関数の引数

  • src: 入力画像
  • threshold1: 小さい方の閾値
  • threshold2: 大きい方の閾値

となっています。

 

OpenCV のそれぞれのエッジ検出の比較

ここまでさまざまな OpenCV のエッジ検出を解説してきました。

 

それぞれの手法によって出来上がる画像も違います。

Sobelフィルター, Laplacianフィルター, Canny 法によるエッジ検出画像を並べてみましょう。

OpenCV のそれぞれのエッジ検出の比較

並べてみるとエッジの細かさや検出する線が異なることが分かります。

 

画像処理のスキルをつけるのにベストな 1 冊

画像処理のスキルをつけるのにベストな 1 冊

OpenCVのエッジ処理について解説しました。

 

OpenCVは画像処理には欠かすことのできないライブラリです。

 

もし、OpenCVについて独学でスキルをつけるなら、以下の書籍がオススメです。

 

この書籍はOpenCVの基礎から応用までを
丁寧にかつ詳細に解説しています。

 

OpenCVのほぼ全てを網羅しているとも言えるほどの徹底ぶりなので、
関数のリファレンスとしても使用することができます。
本記事で解説したcv2.Canny 関数も掲載されています。

エンジニアとしての自身の価値をチェックする(完全無料)

エンジニアとして、

自分の価値がどれくらいのものかご存知でしょうか?

 

エンジニアとしてIT業界に身を置いていると

今の会社でずっと働くのか、フリーランスとして独立するのか …

と様々な選択肢があります。

 

どの選択肢が正解なのかを見極めるためにも、選択肢を広げるためにも

自身の価値を知っておくことはとても重要です。

 

TechClips ME では、

職務経歴書をアップロードするだけで企業からのスカウトを受けることができます。

▼▼▼▼▼

▲▲▲▲▲

しかもTechClips MEでは想定年収を企業から提示してくれるので、

自身の価値を数字で分かりやすくたしかめることができます。

 

登録はもちろん完全無料なので、一度登録してみると良いかもしれません。

 

コメント

タイトルとURLをコピーしました