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

はじめに

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

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

実験用プログラム 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/

Gaussian について

中心から遠くなるほど重みが小さくなるようなカーネルを使用して畳み込みを行う。つまり、中央から遠い画素の影響よりも近い画素の影響の方が大きくなる。
重みのつけ方は標準偏差を用いて計算される。

図のようにσが大きくなるに従い、横に広がった形になる。画像処理に置き換えると、シグマが大きくなると周りの影響が大きくなり、ぼやけた画像になる。

gaussianBlur 関数について

void cv::GaussianBlur ( InputArray src,
OutputArray dst,
Size ksize,
double sigmaX,
double sigmaY = 0,
int borderType = BORDER_DEFAULT
)

引数

srcInputArray入力画像カラー or グレースケールの画像 CV_8U, CV_16U, CV_32F
dstOutputArray出力画像フォーマットは入力画像に依存
ksizeSizeカーネルサイズフィルタのサイズ X, Y 指定
sigmaXdouble標準偏差 X方向の標準偏差
sigmaYdouble標準偏差 Y方向の標準偏差
borderTypeint 境界外処理方法 cv::BorderTypes
画面 もしくは roi の境界処理をどうするか。
詳しくは下記参照
https://iryachi.stars.ne.jp/opencv_bordertype/

カーネル

カーネルは以下の様な感じ。(一例)

sigma の数値の違い
縦横異なる sigma の場合

処理例

終わりに

gaussianBlur はエッジを残してノイズ除去をする、元の画素情報をなるべく残してノイズ除去をしたい時に役に立つ。
逆にごま塩ノイズのようなものには向かないこともある。