はじめに
OpenCVとはインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリで、画像処理・画像解析および機械学習等の機能を持つC/C++、Java、Python、MATLAB用ライブラリとなっています。
Opencvには以下のような機能があります。
- グレースケール化
- 2値化
- 輪郭の検出
- 顔検出
- ノイズ除去
- テンプレートマッチング
本記事では、ノイズ除去・エッジ抽出を目的としたOpenCVを用いた画像のモルフォロジー処理について紹介します。具体的には、ノイズ除去として、膨張処理、収縮処理、オープニング、クロージング、エッジ抽出としてモルフォロジー勾配の手法について紹介します。
1. ノイズ除去
ここでは、膨張処理と収縮処理を確認後、それらを用いたオープニングとクロージングの処理の方法を示します。
1.1 膨張処理・縮小処理で使用する画像
ペイントで簡単に作成してみました。
1.1 膨張処理
膨張処理には、cv2.dilate()を用います。以下の様に使用します。
img = cv2.dilate(src, kernel, iterations=***)
引数は以下の様になります。
引数 | 内容 |
---|---|
src | 処理したい画像 |
kernel | カーネルの大きさ(構造要素を用います) |
iterations | 処理の適用回数 |
ここで、kernelの構造要素の種類を見ていきます。kernelの構造要素の設定はcv2.getStructuringElement()を用います。cv2.getStructuringElement()は以下の様に用います。
kernel = getStructuringElement(shape, ksize)
引数 | 内容 |
---|---|
shape | 構造の形状 |
ksize | カーネルの大きさ |
shapeは以下の様な種類があります。
shape | 構造要素 |
---|---|
cv2.MORPH_RECT | 矩形 |
cv2.MORPH_ELLIPSE | 楕円 |
cv2.MORPH_CROSS | 十字 |
それぞれ試しに構造要素を見てみましょう。
出力結果は以下の様になります。各形状合わせて要素に1が格納されているのがわかると思います。
それでは構造要素を紹介したので、実際に膨張処理を実施していきたいと思います。
出力結果は以下の様になります。白い部分が膨張して太くなっているのがわかると思います。
1.2 収縮処理
膨張処理には、cv2.erode()を用います。以下の様に使用します。
img = cv2.erode(src, kernel, iterations=***)
引数は以下の様になります。
引数 | 内容 |
---|---|
src | 処理したい画像 |
kernel | カーネルの大きさ(構造要素を用います) |
iterations | 処理の適用回数 |
それでは縮小処理を実施してみましょう。
出力結果は以下の様になります。白い部分が縮小されて細くなっているのがわかると思います。
1.3 オープニング
オープニングとは、収縮をN回行った後に膨張をN 回行う処理です。縮小により白い部分のノイズを除去し、その後膨張させることで白い太い部分を元に戻します。
オープニングとクロージングではcv2.morphologyEx()を用います。cv2.morphologyEx()は以下の様に用います。
img = cv2.morphologyEx(src, op, kernel, iterations)
引数 | 内容 |
---|---|
src | 処理したい画像 |
op | モルフォロジー処理の種類 |
kernel | カーネルの大きさ(構造要素を用います) |
iterations | 処理の適用回数 |
オープニングでのモルフォロジー処理の種類はcv2.MORPH_OPENを用います。
それではオープニングを実行していきましょう。以下の例では収縮を3回行った後に膨張を3回行っています。
出力結果は以下の様になります。文字は比較的そのままで細かい点や細い線が消えているのがわかると思います。
1.4 クロージングで使用する画像
続いてクロージングでは穴埋め作業を行いため、文字内に黒い部分を設けた画像を使用します。以下がその画像です。Pythonの白い文字の内側に黒い点や線があるのがわかると思います。
1.5 クロージング
クロージングとは、膨張をN回行った後に収縮をN 回行う処理です。膨張を行うことで白い部分を膨張膨張させて黒いノイズ部分を除去し、その後縮小を行うことで白い部分は元の画像のように戻します。
オープニングと同様にクロージングではcv2.morphologyEx()を用います。
クロージングでのモルフォロジー処理の種類はcv2.MORPH_CLOSEを用います。
それではクロージングを実行していきましょう。以下の例では膨張を3回行った後に収縮を3 回行っています。
出力結果は以下の様になります。文字は比較的そのままで白いPython文字内の黒い細かい点や細い線が消えているのがわかると思います。
3. エッジ抽出:モルフォロジー勾配
最後に、モルフォロジー勾配でエッジ抽出を行いたいと思います。モルフォロジー勾配はN回膨張させた画像からN回縮小した画像を引いた画像を生成する処理になります。
モルフォロジー勾配の処理のイメージを以下の図に示します。
それではモルフォロジー勾配を実施したいと思います。モルフォロジー勾配の処理ではcv2.morphologyEx()を用います。
img = cv2.morphologyEx(src, op, kernel, iterations)
引数 | 内容 |
---|---|
src | 処理したい画像 |
op | モルフォロジー処理の種類 |
kernel | カーネルの大きさ(構造要素を用います) |
iterations | 処理の適用回数 |
モルフォロジー勾配でのモルフォロジー処理の種類はcv2.MORPH_GRADIENTを用います。
モルフォロジー勾配の処理で使用する画像は以下になります。
それでは処理を実施するプログラムを以下に示します。膨張と縮小の処理は3回実施しています。
出力結果は以下の様になります。モルフォロジー勾配の処理により元の「Python OpenCV」の白色の文字のエッジ(輪郭)が抽出されていますね。
オススメ書籍
Pythonで始めるOpenCV4プログラミング
実践OpenCV4 for Python 画像映像情報処理と機械学習
スキル修得&転職
近年、DXの進展に伴うデジタル人材の需要の高まりに追いついていない状況が続いていると経済産業省がホームページで記載している通り、DX人材、IT人材が不足しているのが現状です。さらにコンピュータの性能向上やAI技術の発展により、よりDX人材、IT人材の需要が高まってきます。さらには、今後の長期間安定して職がある業種とも考えられます。
以下の求人では、IT業界の転職や、IT未経験だけどIT人材を志望する就活を支援してくれます。無料で会員登録もできるので、まずは登録だけでもして様子を見てみてはいかがでしょうか?
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
おわりに
本記事では、ノイズ除去・エッジ抽出を目的としたOpenCVを用いた画像のモルフォロジー処理について紹介しました。具体的には、ノイズ除去として、膨張処理、収縮処理、オープニング、クロージング、エッジ抽出としてモルフォロジー勾配の手法について紹介しました。これらの処理は画像処理でよく使う手法になるので、ぜひ覚えましょう。事例的には、ひびが入っている物体の画像からオープニングなどでノイズを除去して、モルフォロジー勾配によるエッジ抽出でそのひびを確認するなどが挙げられると思います。