画面を平滑化する つまり 画面をぼかす方法には色々な手法が準備されています。
bilateralFilterメソッドは、バイラテラルフィルタを用いてぼかしを行います。(ここを参照 なんか難しい式が一杯!!)
static void bilateralFilter(Mat src, Mat dst, int d, double sigmaColor, double sigmaSpace)
static void bilateralFilter(Mat src, Mat dst, int d, double sigmaColor, double sigmaSpace,
int borderType)
Mat src : 変換元Mat ”CV_8UC1″, “CV_8UC3″のみ処理可能
Mat dst : 変換後ぼかした結果 変換元Matと同じサイズ・CvTypeになる
int d : フィルタリングで利用される,各ピクセル近傍領域の直径.これが正値でない場合、sigmaSpace から求められます。
double sigmaColor : 色空間におけるフィルタシグマ。
このパラメータが大きくなると、ピクセル近傍内(sigmaSpace を参照してください)にある、色的により遠くのピクセルが混ぜ合わせられ,結果として同じような色の領域がより大きくなります。
double sigmaSpace : 座標空間におけるフィルタシグマ。
このパラメータが大きくなると,より遠くのピクセル同士が影響を及ぼしあいます(ただし,それらの色が十分に近い場合に限ります。sigmaColor を参照してください) そして、d>0 ならば sigmaSpace に関係なく近傍領域のサイズが決まり,そうでなければ sigmaSpace との比率が d となるようにサイズが決まります。
上の説明は 殆どOpenCvC++リファレンスのパクリですが、自分には殆ど意味不明です。(汗;;)
ともかく実験してみます。
実行結果 |
単純に Imgproc.bilateralFilter(mat, mat2, 10, 50, 0);などとすると 入力が “CV_8UC1”, “CV_8UC3″じゃないよと エラーになりました。前回調べたように”CV_8U”だからですね。
bilateralFilterの前後で色空間の変換をすることにします。
Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGBA2BGR);
Imgproc.bilateralFilter(mat, mat2, 10, 50, 0);
Imgproc.cvtColor(mat2, mat2, Imgproc.COLOR_BGR2RGBA);
sigmaColorを変えて実験してみました。
上段:元画像
中段:Imgproc.bilateralFilter(mat, mat2, 50, 50, 0);
下段:Imgproc.bilateralFilter(mat, mat3, 50, 200, 0);
まさかLOOP? と思うほど処理が重い割には どこがぼけてる??? と疑ってしまうような結果。きっと引数が不適当なだけと思いますが 深追いはやめときます。
by Android2.2 with OpenCv 2.3.1 for Android |