OpenCVのノイズ除去について(Bilateral)

はじめに

OpenCV の Bilateral FIlterを使った処理ついて調べたことをまとめた。

とりあえず関数を試してみたい方

実験用プログラム OpenCV_test の GitHubリポジトリ
URL
https://github.com/iryachi/OpenCV_test
実行ファイルだけ
https://github.com/iryachi/OpenCV_test/releases
使い方
https://iryachi.stars.ne.jp/opencv_test_imple/

Bilateral Filter 処理について

ガウシアンフィルタ(Gaussian Filter) のように注目画素からの距離によって重みを変えるが、さらに注目画素との色の違いも考慮して重みを決定する。注目画素との色の違いが小さい方が重みが大きくなる。

例えば、図のように注目画素の左右の色が違う場合、注目画素に近い色の右の方が重みが大きくなる。

void cv:: bilateralFilter (InputArray src,
OutputArray dst,
int d,
double sigmaColor,
double sigmaSpace,
)

引数

srcInputArray入力画像カラー or グレースケールの画像
CV_8U, CV_16U, CV_16S, CV_32F, CV_64F
dstOutputArray出力画像フォーマットは入力画像に依存
dintフィルタサイズフィルタのサイズ X,Y方向同じ値 負の場合、sigmaSpaceから計算される。
sigmaColordouble色偏差色の差による重みの補正値
sigmaSpacedouble距離偏差注目画素からの距離による重みの補正値
boarderTypeint境界外処理方法cv::BorderTypes
画面 もしくは roi の境界処理をどうするか。

処理例

終わりに

bilateral Filter は gaussianBlur と同様に、エッジを残してノイズ除去をする事を得意とする。
gaussian よりも性能はいいが、計算時間がかかるというデメリットも有る。
画像によってパラメータの効果が変わるので、いろいろなパラメータで試してみる必要があるかと。