OpenCV

【OpenCV】バイラテラルフィルタ(cvSmooth,CV_BILATERAL)

スポンサーリンク

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の値を大きくすると、処理時間がやたらとかかるので、あまり大きくできません。

 

OpenCVへ戻る

 

コメント

タイトルとURLをコピーしました