OpenCVでバイラテラルフィルタを行う場合はcvSmooth関数の第3引数にCV_BILATERALを指定すればよいのですが、OpenCV.jpのページなどを見ても、なぜか、それらしい処理結果になっているサンプルをあまり見かけません。
cvSmoothの定義は
void cvSmooth(
const CvArr* src,
CvArr* dst,
int smoothtype = CV_GAUSSIAN,
int param1 = 3,
int param2 = 0,
double param3 = 0,
double param4 = 0
);
で、バイラテラルフィルタの場合、
param1 | アパーチャサイズ |
param2 | アパーチャサイズ |
param3 | 空間領域のシグマ |
param4 | 色領域のシグマ |
ただし、
インプレースモード | 非対応 |
チャンネル数 | 1,3 |
srcの深度 | 8 |
dstの深度 | 8 |
となっています。
そこで、param3、param4を変えながら、処理結果の比較をしてみました。
【入力画像】
【処理画像】
cvSmooth(src, dst, CV_BILATERAL, 11, 11, param3, param4);
(param3, param4) = (0, 0) | (50, 0) | (100, 0) |
(0, 50) | (50, 50) | (100, 50) |
(0, 100) | (50, 100) | (100, 100) |
という事で、今回使用した画像では
cvSmooth(src, dst, CV_BILATERAL, 11, 11, 50, 100);
としたときが、いかにもバイラテラルフィルタっぽいでしょうか?
param4を少し大きめにした方が良さそうです。
逆にparam1, param2の値を大きくすると、処理時間がやたらとかかるので、あまり大きくできません。
コメント