前回に続いて平滑化です。
ボックスフィルタを用いた平滑化を行うには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);
余談でしたね。