OpenCVの膨張処理と収縮処理について

プログラミング
ゆうすけ
ゆうすけ

OpenCV界隈でよく言われる「膨張」「収縮」って何ですか…?

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

「膨張」は領域を広げるとき、「収縮」は領域を狭めるときに使われる。
ノイズ除去などに威力を発揮するぞ。

 

✔️ 本記事のテーマ

 OpenCVの膨張と収縮について

 

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

本記事は「膨張/収縮処理とその実装方法」について書いています。

 

画像処理プログラミングでは、
画像に対して膨張処理や収縮処理をかけることがあります。

 

これらの膨張処理や収縮処理をかけることでノイズ除去などの効果を得ることができます。

 

画像処理ライブラリのOpenCVでも膨張処理や収縮処理を行うことができます。

 

この記事では

  • 実際に膨張処理や収縮処理をかけると画像がどのように変換されるのか
  • OpenCVで膨張処理や収縮処理を実装するにはどのようにコードを書けば良いのか

について解説します。

 

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

 

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

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

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

 

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

pip install opencv-python

 

以上で、OpenCVのインストールは完了です。

 

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

 

OpenCVを使った収縮処理

OpenCVを使った収縮処理

OpenCVの収縮処理を簡潔に説明すると、物体の境界箇所やノイズを消す処理です。

 

内部的なことを詳細に解説すると、画像に対してカーネルをスライドさせていき、カーネル領域に含まれる画素の画素値が全て1であれば1となり、そうでなければ0として処理しています。

これにより、物体の境界付近の全画像が白(1)から黒(0)になり、消えてしまいます。
その結果として白い画素が占める領域が収縮するように見えるため収縮と呼ばれています。

 

この収縮処理は以下のケースに有効です。

  • 画像中の白色ノイズの除去
  • 繋がっている複数物体を分割

 

実際に以下の画像に対して、収縮処理をかけてみましょう。

OpenCVの膨張/縮小処理のインプット画像

 

以下のコードで収縮処理をかけることができます。

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)

OpenCVの縮小処理の結果画像

このコードを実行すると、
上記画像のように「j」という文字の境界線が薄くなった画像に変換されます。

 

OpenCVを使った膨張処理

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)

OpenCVの膨張処理の結果画像

このコードを実行すると、
上記画像のように「j」という文字の境界線が太くなった画像に変換されます。

 

OpenCVの膨張処理や収縮処理を応用した処理

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のopening処理の結果画像

分かりやすくノイズが除去されていますね。

 

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のclosing処理の結果画像

こちらも綺麗に物体中のノイズが除去されていますね。

 

OpenCVのモルフォロジー勾配処理

モルフォロジー勾配処理とは「膨張した画像と収縮した画像の差分をとる」処理です。

 

結果として、物体の境界線を取り出すことができます。

 

同様に関数は cv2.morphologyEx() を使いますが、
第2引数のフラグに cv2. MORPH_GRADIENT を指定します。

 

このコードを実行することによって、左側の画像が右側の画像になります。

OpenCVのモルフォロジー勾配処理の結果画像

 

OpenCVのスキルをつけるのに最適の一冊

OpenCVのスキルをつけるのに最適の一冊

OpenCVの膨張処理と縮小処理について解説しました。

 

OpenCVを使うことで、数多くの画像処理を簡単に実施することができます。

 

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

 

この書籍は画像処理ライブラリのOpenCVの基礎から応用までを
丁寧にかつ詳細に解説しています。

 

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

 

また、Pythonについて基礎から学ぶのであれば、オンラインスクールがオススメです。


オンラインスクールで学習すると、講義も分かりやすく、
サポート体制もしっかりしているので、これからPythonを学ぶ人にもオススメです。


オンラインで無料レッスンを体験することもできるので、
自分にあっているかどうかを確かめることができます。


オススメは以下の3つです。
どのスクールも無料体験が用意されているので、
契約前に自分に最適なスクールを探すことができるでしょう。

✔️オススメのプログラミングスクール ベスト3

これらのプログラミングスクールは全て無料の体験コースがあります。

 

「雰囲気だけでも知りたい」
「プログラミング学習の全体像を知りたい」
「スクールに入るかどうか迷っている」
という方はとりあえず無料カウンセリングを受けてみることをオススメします。

 

無料カウンセリングだけなら費用はかかりませんし、
スクールに通うにしろ、独学で学ぶにしろ、
カウンセリングで得ることができる情報には価値があります

 

プログラミングスクールについては「プログラミングスクールで失敗しないためには【オススメベスト3も紹介】」の記事でも紹介しています。


気になった方はぜひチェックしてみて下さい〜!

コメント

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