OpenCV界隈でよく言われる「膨張」や「収縮」って何ですか…?
「膨張」は領域を広げるとき、「収縮」は領域を狭めるときに使われる。
ノイズ除去などに威力を発揮するぞ。
✔️ 本記事のテーマ
OpenCVの膨張と収縮について
✔️ 読者さんへの前置きメッセージ
本記事は「膨張/収縮処理とその実装方法」について書いています。
画像処理プログラミングでは、
画像に対して膨張処理や収縮処理をかけることがあります。
これらの膨張処理や収縮処理をかけることでノイズ除去などの効果を得ることができます。
画像処理ライブラリのOpenCVでも膨張処理や収縮処理を行うことができます。
この記事では
- 実際に膨張処理や収縮処理をかけると画像がどのように変換されるのか
- OpenCVで膨張処理や収縮処理を実装するにはどのようにコードを書けば良いのか
について解説します。
それでは、解説していきましょう。
まずはOpenCVをインストールする
OpenCVを使うには、
まず自身の環境にOpenCVをインストールする必要があります。
以下のコマンドでOpenCVをインストールしましょう。
pip install opencv-python
以上で、OpenCVのインストールは完了です。
OpenCVのインストール方法についてもっと詳しく知りたい場合は
「【python】OpenCVのインストール方法」
の記事を参照してみて下さい。
OpenCVを使った収縮処理
OpenCVの収縮処理を簡潔に説明すると、物体の境界箇所やノイズを消す処理です。
内部的なことを詳細に解説すると、画像に対してカーネルをスライドさせていき、カーネル領域に含まれる画素の画素値が全て1であれば1となり、そうでなければ0として処理しています。
これにより、物体の境界付近の全画像が白(1)から黒(0)になり、消えてしまいます。
その結果として白い画素が占める領域が収縮するように見えるため収縮と呼ばれています。
この収縮処理は以下のケースに有効です。
- 画像中の白色ノイズの除去
- 繋がっている複数物体を分割
実際に以下の画像に対して、収縮処理をかけてみましょう。
以下のコードで収縮処理をかけることができます。
import cv2
import numpy as np
img = cv2.imread('sample.png', 0)
kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(img, kernel, iterations=1)
cv2.imwrite('./sample_erosion.png', erosion)
このコードを実行すると、
上記画像のように「j」という文字の境界線が薄くなった画像に変換されます。
OpenCVを使った膨張処理
OpenCVの膨張処理を簡潔に説明すると、物体の境界線を太くする処理です。
内部的なことを詳細に解説すると、収縮の逆の処理です。カーネル内に1の画素が一つでも含まれれば、カーネル内の全ての画素値を1として処理します。
画像中の白色の領域を増やすたり、物体のサイズを増やすための処理として使用されます。
膨張処理の使い所としては、先ほどの縮小処理と合わせて
「収縮処理によって一度ノイズを消した後、膨張処理をかけて物体の領域を増やす」
みたいなユースケースで使用されます。
一度、完全に消したノイズは膨張処理をかけても消えたままなので、
物体のサイズは変えずにノイズだけを消すことができます。
あとは、物体から離れてしまった部分を再び付けたい時などに便利です。
以下のコードで収縮処理をかけることができます。
import cv2
import numpy as np
img = cv2.imread('./sample.png', 0)
kernel = np.ones((5, 5), np.uint8)
dilation = cv2.dilate(img, kernel, iterations=1)
cv2.imwrite('./sample_dilation.png', dilation)
このコードを実行すると、
上記画像のように「j」という文字の境界線が太くなった画像に変換されます。
OpenCVの膨張処理や収縮処理を応用した処理
このように、OpenCVの膨張処理や収縮処理をかけることで、
画像中の物体のサイズを変更することができます。
ここまで解説したのは、OpenCVの膨張処理や収縮処理の基本的な使い方です、
OpenCVの膨張処理や収縮処理は応用することで、
以下のようにより実践的な画像処理をすることができます。
- OpenCVのオープニング処理
- OpenCVのクロージング処理
- OpenCVのモルフォロジー勾配処理
順番に解説していきましょう。
OpenCVのオープニング処理
オープニング処理とは「収縮の後に膨張する」処理です。
既に述べたように、ノイズ除去にとても有効です。
関数は cv2.morphologyEx() を使います。
import cv2
import numpy as np
img = cv2.imread('./sample.png',0)
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
このコードを実行することによって、左側の画像が右側の画像になります。
分かりやすくノイズが除去されていますね。
OpenCVのクロージング処理
クロージング処理とはオープニング処理の逆の処理で「膨張の後に収縮する」処理です。
物体中の小さな黒い点を消すのに有効です。
オープニング処理と同様 cv2.morphologyEx() を使いますが、
第2引数のフラグに cv2.MORPH_CLOSE を指定する必要があります。
import cv2
import numpy as np
img = cv2.imread('./sample.png',0)
kernel = np.ones((5,5),np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
このコードを実行することによって、左側の画像が右側の画像になります。
こちらも綺麗に物体中のノイズが除去されていますね。
OpenCVのモルフォロジー勾配処理
モルフォロジー勾配処理とは「膨張した画像と収縮した画像の差分をとる」処理です。
結果として、物体の境界線を取り出すことができます。
同様に関数は cv2.morphologyEx() を使いますが、
第2引数のフラグに cv2. MORPH_GRADIENT を指定します。
このコードを実行することによって、左側の画像が右側の画像になります。
OpenCVのスキルをつけるのに最適の一冊
OpenCVの膨張処理と縮小処理について解説しました。
OpenCVを使うことで、数多くの画像処理を簡単に実施することができます。
もし、OpenCVについて、
独学でスキルをつけるなら以下の書籍がオススメです。
この書籍は画像処理ライブラリのOpenCVの基礎から応用までを
丁寧にかつ詳細に解説しています。
OpenCVのほぼ全てを網羅しているとも言えるほどの徹底ぶりなので、
関数のリファレンスとしても使用することができます。
本記事で解説した dilate/erode/morphologyEx 関数についても掲載されています。
エンジニアとしての自身の価値をチェックする(完全無料)
エンジニアとして、
自分の価値がどれくらいのものかご存知でしょうか?
エンジニアとしてIT業界に身を置いていると
今の会社でずっと働くのか、フリーランスとして独立するのか …
と様々な選択肢があります。
どの選択肢が正解なのかを見極めるためにも、選択肢を広げるためにも
自身の価値を知っておくことはとても重要です。
TechClips ME では、
職務経歴書をアップロードするだけで企業からのスカウトを受けることができます。
▼▼▼▼▼
▲▲▲▲▲
しかもTechClips MEでは想定年収を企業から提示してくれるので、
自身の価値を数字で分かりやすくたしかめることができます。
登録はもちろん完全無料なので、一度登録してみると良いかもしれません。
コメント
[…] OpenCVの膨張処理と収縮処理について […]