Gaussian Filter を用いた画像の暈し.

SFMをやります!」と言いながらだいぶ基礎的なエントリになるのですが,

SFMをやる!」
ー>「特徴点はSFMの基礎だから,SIFTとAKAZEくらいは抑えておこう.」
ー>「まてよ,Scale Space ってなんや?」

という流れで,フィルタリングを簡単にまとめておくことにしました.「SFMシリーズ!」としてエントリをまとめてみようと思ったのですが,そうするとだいぶ先まで見通してエントリを書かないといけないので,小出しに個別のエントリを書くことにしました.一通りやりきることができたら,あとでリライトします.

ということで,国際通りの3次元復元まで,道のりは遠いですね...

Gaussian Filter とは.

 テンプレートマッチングや機械学習するときに,画像の前処理としてフィルタリングをすることもあると思います.自分はこのあたりあまり考えず,「ちょっと画像暈したいなあ.」とかって具合に使ってたんですが(笑),Gaussian Filter には意味があったみたいです.Gaussian Filter はググればいっぱい有益な情報が出てくるので,かっちりとした話はそちらを見ていただくとして,ここではその意味合い的な部分を掘り下げられればと思います.

参考サイト1
imagingsolution.blog.fc2.com

標準偏差 (σ)と暈しの程度を考える.

 Gaussian Filterはガウスカーネルを持つフィルタなので,フィルタの設定値として標準偏差(σ)を指定します.OpenCV の関数でいうと,,,

    cv2.getGaussianKernel(ksize, sigma, ktype)

sigma の部分です.この関数を使う上で気を付けないといけないことは,sigma を大きくした場合,それに伴って ksize の値も大きくしないといけないということです.(σが大きくなるにつれて,当該ピクセルの値を計算するために必要な隣接ピクセルの数が増えていくため.)

それでは,画像に Gaussian Filter を適用する場合にこの σ がどんな意味を持つのかちょっと考えてみます.実験として,下記画像に対してガウシアンフィルタを適用してみます.まず簡単のために,x方向だけの1Dガウシアンフィルタを使いたいので,画像はとてもシンプルにy方向には何も変化がないものにしています.

f:id:rkoichi2001:20200507123241p:plain
ガウシアンフィルタを適用する実験画像.

ちなみに,上記の実験画像は高さが61pix, 幅が501pixで,画像の中心の白帯の幅が11pix になります.次に,σを変化させたときの1Dガウシアンカーネルをプロットしてみると,下記のようになります.

f:id:rkoichi2001:20200507131433p:plain
σを変化させたときの1Dガウシアンカーネルの様子.

で,実際に実験画像に上記の1Dガウシアンカーネルを適用した結果が下記になります.ここでは「画像の中で幅11pixの領域として映っているものが,σ を変化させたときにどのようにぼかされていくか?」を見ています.左側のグラフは,右側画像をx軸に平行な断面で切って横から見た図です.

f:id:rkoichi2001:20200507131539p:plain
σを変化させたガウシアンカーネルを適用した実験画像.

上図を見るとわかると思うのですが,σ が11を超えたあたりから急速に白帯が消失してく様子がわかります.σが 11 を超えるまでは,どちらかというとエッジの部分がぼかされていたのに対して,11を超えてくると黒画像領域に白帯が溶け出してきます.ということでガウスフィルタを使うときは,

「画像のなかで暈したいスケール (pix) を決め,σをそのスケールよりも少し大きくとる」

ことをすれば,いい具合に画像をぼかせそうです.

画像にGaussian Filterを適用する.

次に,実際の2D画像に Gaussian Filter を適用してみたいと思います.ここでは実際に上の議論が成立しているかどうかを見るために,下記のような実験画像を用意しました.四角形,丸,三角形が並んでいますが,上から順に 10 x 10pix,20 x 20pix, 40 x 40pix, 80 x 80pix, 80 x 160pix の大きさで書いてます.一番下はちょっと扁平にしてみました.

f:id:rkoichi2001:20200507142214p:plain
異なるスケールの図形を描いた実験画像.

で,この画像に対して,「それぞれの図形スケール + α」の標準偏差を持つガウスフィルタを適用してみます.ここまでの議論が正しければ,図形のスケールよりも大きい標準偏差を持つガウスフィルタを適用すると図形は消えるはず!といことで,やってみます.

σ = 5

1番スケールの小さい図形(10 x 10 pix)はだいぶ暈されてますが,まだ残ってます.

f:id:rkoichi2001:20200507143208p:plain
σ = 5 のガウスフィルタ適用

σ = 12.5

1番スケールの小さい図形(10 x 10 pix)が消えました.

f:id:rkoichi2001:20200507143942p:plain
σ = 12.5 のガウスフィルタ適用

σ = 25

2番目スケールの図形(20 x 20 pix)が消えました.

f:id:rkoichi2001:20200507144003p:plain
σ = 25 のガウスフィルタ適用

σ = 50

3番目スケールの図形(40 x 40 pix)が消えました.

f:id:rkoichi2001:20200507144026p:plain
σ = 50 のガウスフィルタ適用

σ = 100

4番目スケールの図形(80 x 80 pix)が消えました.

f:id:rkoichi2001:20200507144053p:plain
σ = 100 のガウスフィルタ適用

σ = 180

5番目スケールの図形(80 x 160 pix)が消えました.

f:id:rkoichi2001:20200507144124p:plain
σ = 180 のガウスフィルタ適用

ということで,思ったような結果になりました.ただ,暈しなので完全には消えておらず薄っすらと残ってますが,大体のスケールを決めてやれば暈しの効果をある程度操ることはできそうです.ということで,次は Laplacian FIlter と Scale Space の話をします.

実験に使ったコード.

github.com

参考文献.

Scale-space theory: A basic tool for analyzing structures at different scales

Distinctive image features from scale-invariant keypoints

http://www.cs.unc.edu/~lazebnik/spring11/lec08_blob.pdf