膨張、収縮処理についてもう一点。
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 コメント:
コメントを投稿