2012年3月20日火曜日

画像の膨張・収縮処理を行う その3 - OpenCV for Android


膨張、収縮処理についてもう一点。

kernelことdilate()、erode()、morphologyEx()メソッドに渡す構造要素についてです。

はじめは以下のように、コンストラクタでサイズを指定してMatクラスのインスタンスを生成したのですが、どうやらこれでは間違っているようです。
Imgproc.dilate(mat, mat, new Mat(5, 10, CvType.CV_8UC1));




実行するたびに若干違う結果になったり、数ピクセル画像がズレたり、正しく画像を処理できません。

デフォルトコンストラクタでMatを生成した場合は特に問題は起きないので、サイズがゼロだと正しく3×3の構造要素を作成してくれるようです。

では構造要素を指定したい場合どうするかと言うと、Imgproc.getStructuringElement()メソッドを利用します。


Imgproc.getStructuringElement(int shape, Size ksize, Point anchor)

int shape   構造要素の形状
Size ksize  構造要素のサイズ
Point anchor 要素内のアンカー位置


shapeについては、Imgprocに用意された以下の定数から選択します。

MORPH_RECT   矩形構造要素
MORPH_ELLIPSE  楕円構造要素
MORPH_CROSS  十字形構造要素


anchorについては、十字形構造要素の場合にのみ意味を成します。


それでは実際にやってみましょう。

矩形構造要素です。
Imgproc.dilate(mat, mat,
  Imgproc.getStructuringElement(Imgproc.MORPH_RECT,
  new Size(2, 10));


楕円構造要素です。若干丸みがありますね。
Imgproc.dilate(mat, mat,
  Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE,
  new Size(2, 10));


十字形構造要素です。まずはアンカー位置デフォルトから。
Imgproc.dilate(mat, mat,
  Imgproc.getStructuringElement(Imgproc.MORPH_CROSS,
  new Size(5, 10), new Point(-1, -1)));


アンカー位置を端によせてみます。
Imgproc.dilate(mat, mat,
  Imgproc.getStructuringElement(Imgproc.MORPH_CROSS,
  new Size(5, 10), new Point(4, 9)));


逆サイドへ。
Imgproc.dilate(mat, mat,
  Imgproc.getStructuringElement(Imgproc.MORPH_CROSS,
  new Size(5, 10), new Point(0, 0)));


色々な形状の構造要素を試してみくなりましたが、それはまた別の機会に。

0 件のコメント:

コメントを投稿