大山昇太の今日このごろ

COBOLerから始めたSE生活。独立後はマイクロソフトどっぷり。予算ゼロの中 ボケ防止も兼ね脱MSを目指す。

広告

※このエリアは、60日間投稿が無い場合に表示されます。記事を投稿すると、表示されなくなります。

画像の膨張・収縮処理を行う

2012年06月06日 | OpenCv android 実験記

画像の『膨張・収縮処理』とは、一般に2値化された画像に対し行われ、ターゲットとなるピクセルの周辺に1ピクセルでも 白があれば白に置き換える膨張処理(Dilation)と、逆に1ピクセルでも 黒があれば黒に置き換える収縮処理(Erosion)からなり、ノイズを消す処理に用いるとのこと。
詳しくは 以下のサイトを参照ください かなり詳しく説明されています。

http://imagingsolution.blog107.fc2.com/blog-entry-101.html
http://d.hatena.ne.jp/shokai/20090203/1233608481

Android版OpenCvでは
膨張処理はImgprocクラスのdilateメソッドで行い、収縮処理はerodeメソッドで行います。

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

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

Mat src : 元の画像 
Mat dst : 変換後画像
Mat kernel : 膨張または収縮処理のために用いる周辺領域の大きさを示すMat 
 defaultでは 3*3 つまり上下左右

Point anchor : 要素内のアンカー位置 defaultはkernelの中心を表す特別な値(-1,-1)です。
int iterations : 実行回数
int borderType : ピクセル外挿手法
Scalar borderValue
  borderType = BORDER_CONSTANT(定数指定)の場合 境界外に埋める色を示す定数

  borderType borderValue については 『画像を回転する』 を参照してください。

ノイズ・ひび割れの除去のため dilateメソッド・erodeメソッドを単独で使うのではなく、収縮⇒膨張で 小さなゴミを消し 膨張⇒収縮でひび割れを押しつぶす効果があるとのこと。(ここにサンプルがあります)

Kernelを変えた実験は nooj loonさんの ぎーくなぁど に詳しく載っているので省略し ここではDefaultの3*3 とし anchor=Point(-1、-1)のまま実行回数を変えて結果を比較してみます。

 テストデータ 

カメラで撮影した画像を 透視変換で直行化・グレースケール化した後 2値化したデータ(下図の最下段の画像)をテストデータとします。


 

 収縮 ⇒ 膨張 

収縮を先に行って続けて膨張処理をやってみました。
1段目:上記元画像
2段目:収縮1回後 膨張1回
3段目:収縮2回後 膨張2回  うーーーむ なんか石と石の間が潰れてる !!

 膨張 ⇒ 収縮 

今度は膨張を先に行って続けて収縮処理をやってみました。
1段目:上記元画像
2段目:膨張1回後 収縮1回
3段目:膨張2回後 収縮2回  あらら 線が消えちゃった!!


ノイズ除去とかひび割れ退治に有効とはいえ適切な手順・パラメータは 元画像に依存しそう 難しい!!!

 by Android2.2 with OpenCv 2.3.1 for Android   
ジャンル:
ウェブログ
コメント   この記事についてブログを書く
この記事をはてなブックマークに追加
« 画像ピラミッドを作成する | トップ | 画像の膨張・収縮処理を行う... »
最近の画像もっと見る

コメントを投稿


コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。

あわせて読む

OpenCv android 実験記」カテゴリの最新記事

この記事を見た人はこんな記事も見ています

トラックバック

この記事のトラックバック  Ping-URL