はじめに
OpenCVとはインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリで、画像処理・画像解析および機械学習等の機能を持つC/C++、Java、Python、MATLAB用ライブラリとなっています。
Opencvには以下のような機能があります。
- グレースケール化
- 2値化
- 輪郭の検出
- 顔検出
- ノイズ除去
- テンプレートマッチング
本記事では、Opencvを用いた画像のエッジ検出について紹介します。具体的には、Sobel処理、ラプラシアン処理、Canny処理の手法について紹介します。
- はじめに
- 1. 本記事で使用する画像
- 2. Sobel処理(cv2.Sobel())
- 3. ラプラシアン処理(cv2.Laplacian())
- 4. Canny処理(cv2.Canny())
- オススメ書籍
- スキル修得&転職
- おわりに
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処理やラプラシアン処理ではノイズが入っていたことにより、きれいにエッジ検出できなかったと考えられます。その点を踏まえながら適切なエッジ検出を実施していく必要があります。