画面を平滑化する つまり 画面をぼかす方法には色々な手法が準備されています。
GaussianBlurメソッドは、ガウシアンフィルターを用いたガウスぼかしを行います。
static void GaussianBlur(Mat src, Mat dst, Size ksize, double sigma1)
static void GaussianBlur(Mat src, Mat dst, Size ksize, double sigma1, double sigma2)
static void GaussianBlur(Mat src, Mat dst, Size ksize, double sigma1, double sigma2, int borderType)
Mat src : 変換元Mat
Mat dst : 変換後ぼかした結果
Size ksize : ガルシアンカーネルサイズ
ksize.width ksize.heightは正の奇数を指定します。
この値を大きくするとぼかしが強くなります。
また両方の値をゼロにすると sigma1,sigma2から計算されます。
double sigma1,double sigma2 : ガウシアンカーネルの,XとY方向の標準偏差.
この値を大きくするとぼかしが強くなります。
sigmaY が 0 ならば, sigmaX と等しくなるようにセットされ、
両方の値が 0 の場合は,それぞれ ksize.width と ksize.height から求められます。
int borderType : ピクセル外挿手法
『画像を回転する』と同様 こちらを参照してください。
実行結果 |
sigma1,sigma2に同じ値を指定し ksizeのみ変化した場合
上段:元画像
中段:Imgproc.GaussianBlur(mat, mat2, new Size(9,7), 8, 6);
下段:Imgproc.GaussianBlur(mat, mat3, new Size(19,15),8,6);
ksizeを2倍大きくするとぼかしがかなり強くなります。
ksizeに同じ値を指定し sigma1,sigma2のみ変化した場合
上段:元画像
中段:Imgproc.GaussianBlur(mat, mat2, new Size(9,7), 8, 6);
下段:Imgproc.GaussianBlur(mat, mat3, new Size(9,7), 32, 24);
sigma1,sigma2を4倍にしましたが 大きな変化はみられません。
ksizeおよびsigma1,sigma2にゼロを指定した場合
OpenCVリファレンスのGaussianBlurの説明ではsigma1,sigma2にゼロを指定した時 ksizeから求める式は getGaussianKernelを参照してくださいとあります。
それによると sigma = 0.3*(ksize/2 – 1) + 0.8
例えば ksize=(17,13) とすると sigma=(3.05 , 2.45)になります。
上段 : Imgproc.GaussianBlur(mat, mat1, new Size(17,13), 3.05, 2.45);
中段 : Imgproc.GaussianBlur(mat, mat2, new Size(17,13), 0, 0);
下段 : Imgproc.GaussianBlur(mat, mat3, new Size(0,0), 3.05, 2.45);
の結果を下図に示します。体感的には全く同じ結果のように思います。
by Android2.2 with OpenCv 2.3.1 for Android |