SSIMを計算する時に出てくるガウシアンフィルター

本日のお題: window = fspecial('gaussian', 11, 1.5)


昨日、SSIMとPSNRの比較をして、

SSIMってのは、無限のバリエーションがあるので、SSIM値を指定して電子化発注をする場合、ちゃんと具体的な計算式を指定しないと、いけないよ

っぽいことを主張しました。


無限のバリエーションが発生する原因は、様々なのですが、とりあえず、ガウシアンフィルターとディスタンスというものを例示しました。


そんで、本日はまず、ガウシアンフィルターをやっつけようと思います。


ガウシアンフィルターというのは、http://d.hatena.ne.jp/denshikA/20091211でもちょろっと紹介したような、「凸凹を滑らかにするような画像処理」です。なぜ、そんな処理をするのか、ということは、そのうち書きたいと思います。


ガウシアンフィルターについて、詳しく知りたい方は、Akiraさんの解説がよろしいかと思います。
http://imagingsolution.blog107.fc2.com/blog-entry-88.html
http://imagingsolution.blog107.fc2.com/blog-entry-165.html


ひとつだけ、皆さんが理解しやすいように補足しておきますと、Akiraさんが、http://imagingsolution.blog107.fc2.com/blog-entry-165.htmlで載せています以下の画像ですが、

オリジナル画像の
二次元フーリエ変換画像
ガウシアンフィルタ処理後の
二次元フーリエ変換画像

左側は全体的に散らばっている感じで、右側は外側が黒くなった感じですね。この「外側が黒くなった」感じが、「凸凹が滑らかになった」感じです。その観点で見れば、移動平均処理やメディアンフィルタ処理と比べて、ガウシアンフィルターがうまく「凸凹を滑らかにした」様子がわかると思います。


さて、ここまではガウシアンフィルターの一般的な話です。ここからは、SSIMの計算におけるガウシアンフィルターを確認してみましょう。ちょびっとマニアな領域です。


SSIMの計算例で具体的に説明しておきますと、ガウシアンフィルターは、http://www.ece.uwaterloo.ca/~z70wang/research/ssim/ssim_index.mにある、

window = fspecial('gaussian', 11, 1.5);

という部分で作成されて、

mu1 = filter2(window, img1, 'valid');
mu2 = filter2(window, img2, 'valid');

という部分で、フィルターをかけて、凸凹をならしています。
そして、先ほどの

window = fspecial('gaussian', 11, 1.5);

という部分の、11と1.5ですが、これがユーザーが勝手に決めちゃう部分なのです*1。11の部分は奇数じゃないといけないよ、というルールがありますが、それ以外なら、3でも257でも、とりあえずOKなんです。1.5の部分も何でもいいんですが、「凸凹を滑らかにする度合」を調整することができます. 菅谷さんによる下図が分かりやすいと思うのですが、青が1.0で、赤が2.0ですので、1.5というと、その中間くらいです。


http://teo.sourceforge.jp/doc/TeoProgrammingGuide/section5-2.html#fig:5.13


というわけで、本日は、ガウシアンフィルターが何なのか、そして、それがSSIMの計算の中でどのように出現して、どの部分がSSIM無限バリエーションを産んでいるのか、を足早に確認しました。


というわけで、しつこいようですが、SSIMというのは、それほど画一的な指標ではないんですよ、ということをご理解ください。

*1:なので、この部分があるので、SSIMの値は無限のバリエーションができるわけです。そして、この部分をいじることで、SSIMをある程度「演出」できちゃうんですよー。