画像の膨張・収縮処理を行う(モルフォロジー演算)

前回実験した 膨張(Dilation)と収縮(Erosion)はそれぞれ単体で利用することは少なく それぞれを組み合わせることで様々な画像処理を行います。この画像処理を『モルフォロジー演算』と呼び、2値化した画像 または グレースケール画像から 画像の特徴抽出・ノイズ除去・平滑化などに用いられます。
Android版OpenCvではmorphologyExメソッドにより 膨張処理, 収縮処理, オープニング処理, クロージング処理の基本演算に加え、グラジエント処理,トップハット処理,ブラックハット処理の7種類の演算が可能です。

膨張処理 前回取り上げたdilateメソッドと同様処理
収縮処理 前回取り上げたerodeメソッドと同様処理
オープニング処理 収縮した結果に対して同じ回数だけ膨張する処理
クロージング処理 膨張した結果に対して同じ回数だけ収縮する処理
グラジエント処理  膨張した結果から収縮した結果を差し引く処理(エッジ検出)
トップハット処理   元画像からオープニングした画像を差し引く処理
ブラックハット処理  クロージングした画像から元画像を差し引く処理

static void morphologyEx(Mat src, Mat dst, int op, Mat kernel)
static void morphologyEx(Mat src, Mat dst, int op, Mat kernel, Point anchor)
static void morphologyEx(Mat src, Mat dst, int op, Mat kernel, Point anchor, int iterations)
static void morphologyEx(Mat src, Mat dst, int op, Mat kernel, Point anchor, int iterations, int borderType)
static void morphologyEx(Mat src, Mat dst, int op, Mat kernel, Point anchor, int iterations, int borderType, Scalar borderValue)

int op 以外の引数は 前回実験した dilate・ erodeメソッドと同様です。こちらを参照してください。
int op は演算の種類を決定するもので Imgprocクラスの定数を指定します。
MORPH_ERODE  膨張処理
MORPH_DILATE  収縮処理
MORPH_OPEN    オープニング処理
MORPH_CLOSE     クロージング処理
MORPH_GRADIENT  グラジエント処理
MORPH_TOPHAT   トップハット処理
MORPH_BLACKHAT ブラックハット処理

 実験方法 

テストデータは前回と同じ2値化したデータ。KernelはDefaultの3*3の矩形 anchor以降の引数は省略します。

 膨張処理および収縮処理 

MORPH_ERODE・MORPH_DILATEは、前回のdilate・ erodeメソッドと同様処理とあるが 実行結果を比較すると 下図のようになりました。
左の画像 : 最上段 元画像 中段 dilateメソッド 下段 erodeメソッド
右の画像 : 最上段 元画像 中段 MORPH_DILATE 下段 MORPH_ERODE
全く同じように見えます。

Imgproc.morphologyEx(mat_bin, matdilate,Imgproc.MORPH_DILATE, new Mat());
Imgproc.morphologyEx(mat_bin, materode,Imgproc.MORPH_ERODE, new Mat());   

 オープニング・クロージング・グラジエント処理 

上段 オープニング処理(収縮した結果に対して同じ回数だけ膨張する)
中段 クロージング処理(膨張した結果に対して同じ回数だけ収縮する)
下段 グラジエント処理(膨張した結果から収縮した結果を差し引く)
前回 dilate・ erodeメソッドをコーディングで指定しましたが、こんな便利なメソッドがあるのですね。
グラジエントを施すと黒石・白石ともに白い円になりました。白石は黒石より太くて少し小さめな円になっています。
Imgproc.morphologyEx(mat_bin, matopen,Imgproc.MORPH_OPEN, new Mat());
Imgproc.morphologyEx(mat_bin, matclose,Imgproc.MORPH_CLOSE, new Mat());
Imgproc.morphologyEx(mat_bin, matgradient,Imgproc.MORPH_GRADIENT, new Mat());

 トップハット処理 

上段 元の画像
中段 オープニング処理
下段 トップハット処理(元画像からオープニングした画像を差し引く) 線の一部が白い線で見えているだけ。ひび割れ風
Imgproc.morphologyEx(mat_bin, mattophat,Imgproc.MORPH_TOPHAT, new Mat());

 ブラックハット処理 

上段 元の画像
中段 クロージング処理
下段 ブラックハット処理(クロージングした画像から元画像を差し引く) 
  黒石は真っ黒、白石は白い線の円で見えている。
Imgproc.morphologyEx(mat_bin, matblackhat,Imgproc.MORPH_BLACKHAT, new Mat());

 by Android2.2 with OpenCv 2.3.1 for Android   
スポンサーリンク
Rectangle大広告
Rectangle大広告

シェアする

  • このエントリーをはてなブックマークに追加

フォローする