Pythonによるデータ分析・機械学習ブログ

Pythonによるデータの前処理・グラフ化、機械学習、統計解析、画像処理、Webスクレイピング、自然言語処理の基礎について紹介していきます。

MENU

【第4回】OpenCVを用いた画像のエッジ検出

はじめに

OpenCVとはインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリで、画像処理・画像解析および機械学習等の機能を持つC/C++JavaPythonMATLAB用ライブラリとなっています。

Opencvには以下のような機能があります。

  • グレースケール化
  • 2値化
  • 輪郭の検出
  • 顔検出
  • ノイズ除去
  • テンプレートマッチング

本記事では、Opencvを用いた画像のエッジ検出について紹介します。具体的には、Sobel処理、ラプラシアン処理、Canny処理の手法について紹介します。

SAMURAI TERAKOYA

1. 本記事で使用する画像

ポルトガルリスボンで撮影した以下の画像を本記事で使用します。

 

2. Sobel処理(cv2.Sobel())

Sobel処理ではcv2.Sobel()を用います。cv2.sobel処理は以下の様に使用します。

dst = cv2. Sobel(src, ddepth, dx, dy, ksize=***)

それぞれ以下の項目になります。

引数 内容
src 処理したい画像
ddepth ビット深度
dx x方向の微分次数
dy y方向の微分次数
ksize カーネルサイズ

ここで、ビット深度ddepthの設定内容を示します。ビット深度とは1ピクセル当りに割り当てるデータ量のことです。それぞれ指定して一度実行してみてほしいですが、大抵ddepth=-1とすると比較的きれいにエッジ検出できました。

ddepth 内容
-1 元の画像の配列を使用
cv2.CV_8S int8
cv2.CV_8U unit8
cv2.CV_16S int16
cv2.CV_16U unit16
cv2.CV_32S int32
cv2.CV_32F float32
cv2.CV_64F float64

それではコード例を記載いたします。まずは、読み込んだ画像をグレースケール化してその後、Sobel処理をします。以下の例では、cv2.Sobel()の引数として、ddepthは元の画像の配列を使用、x方向の微分次数は1、y方向の微分次数は1、カーネルサイズは3を指定しています。

出力結果は以下になります。

 

3. ラプラシアン処理(cv2.Laplacian())

ラプラシアン処理ではcv2.Laplacian()を用います。cv2.Laplacian()は以下の様に使用します。

dst = cv2.Laplacian(src, ddepth, ksize=***)

それぞれ以下の項目になります。

引数 内容
src 処理したい画像
ddepth ビット深度
ksize カーネルサイズ

それではコード例を記載いたします。まずは、読み込んだ画像をグレースケール化してその後、ラプラシアン処理をします。以下の例では、cv2.Lappacian()の引数として、ddepthは元の画像の配列を使用、カーネルサイズは3を指定しています。

出力結果は以下の様になります。

 

4. Canny処理(cv2.Canny())

ラプラシアン処理ではcv2.Canny()を用います。cv2.Canny()は以下の様に使用します。

dst = cv2.Canny(image, threshold1, threshold2)

imageは元の画像です。threshold1とthreshold2は閾値であり、画素値の微分がthreshold2よりも大きい場合にエッジと判断し、threshold2を下回ってもthreshold1よりも大きく、かつthreshold2よりも大きい値の箇所と繋がっていればエッジと判断します。

それではコード例を記載いたします。まずは、読み込んだ画像をグレースケール化してその後、Canny処理をします。以下の例では、cv2.Canny()の引数として、threshold1は150.0、threshold2は280.0を指定しています。このthresholdは自分で調整する必要があります。

出力結果は以下の様になります。

 

オススメ書籍

Pythonで始めるOpenCV4プログラミング

実践OpenCV4 for Python 画像映像情報処理と機械学習

 

スキル修得&転職

 近年、DXの進展に伴うデジタル人材の需要の高まりに追いついていない状況が続いていると経済産業省がホームページで記載している通り、DX人材、IT人材が不足しているのが現状です。さらにコンピュータの性能向上やAI技術の発展により、よりDX人材、IT人材の需要が高まってきます。さらには、今後の長期間安定して職がある業種とも考えられます。

以下の求人では、IT業界の転職や、IT未経験だけどIT人材を志望する就活を支援してくれます。無料で会員登録もできるので、まずは登録だけでもして様子を見てみてはいかがでしょうか?

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

 

おわりに

本記事では、Opencvを用いた画像のエッジ検出について紹介します。具体的には、Sobel処理、ラプラシアン処理、Canny処理の手法について紹介しました。一般的にきれいにエッジ検出をするにはCanny処理だと言われています。

今回の写真に関しても比較的きれいにエッジ検出できていると思います。一方でSobel処理やラプラシアン処理ではノイズが入っていたことにより、きれいにエッジ検出できなかったと考えられます。その点を踏まえながら適切なエッジ検出を実施していく必要があります。