2012年3月24日土曜日

画像を平滑化する その2 - OpenCV for Android


前回に続いて平滑化です。

ボックスフィルタを用いた平滑化を行うにはImgproc.boxFilter()メソッドを利用します。


Imgproc.boxFilter(Mat src, Mat dst, int ddepth,
Size ksize, Point anchor, boolean normalize, int borderType)

Mat src         処理したい元画像のMat
Mat dst         変換後Mat
int ddepth        変換後のビット深度
Size ksize       カーネルサイズ
Point anchor      アンカー点
boolean normalize  正規化の有無
int borderType     ピクセル外挿手法


ddepthについては、変換後の画像のビット深度を指定します。
通常はsrc.type()を指定すれば良いようです。

ksizeについては、この値が大きくなるとぼかしが強くなります。

anchorについては、どちらかに寄せると画像が少しズレます。
new Size(-1, -1)で中心を指定すれば良いようです。

normalizeについては、trueを指定すると正規化されます。
正規化されていないボックスフィルタは、特徴検出などに利用されるようです。

また、Imgproc.blur()というメソッドもありますが、boxFilter()メソッドの第6引数にtrueを指定したものと同じ結果になります。



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

元画像です。


正規化有です。
Imgproc.boxFilter(mat, dstMat, mat.type(),
  new Size(10, 10), new Point(-1, -1), true);


ksizeを変えてみます。
Imgproc.boxFilter(mat, dstMat, mat.type(),
  new Size(50, 5), new Point(-1, -1), true);


正規化無しです。
Imgproc.boxFilter(mat, dstMat, mat.type(),
  new Size(2, 1), new Point(-1, -1), false);


ksizeを変えてみます。
あまり大きな数字にすると画像が真っ白になります。
Imgproc.boxFilter(mat, dstMat, mat.type(),
  new Size(2, 2), new Point(-1, -1), false);


ちなみにddepthにおかしなtypeを指定すると、処理は可能ですが当然こうなります。
Imgproc.boxFilter(mat, dstMat, CvType.CV_16S,
  new Size(10, 10), new Point(-1, -1), true);


余談でしたね。

0 コメント:

コメントを投稿