PSNRとSSIMの違い(総論)

さて、本日は、再びSSIMの話題です。お題は、

後だしジャンケンはやめましょう

です。


前にPSNRとSSIMというのを比較しました*1。簡単にまとめると、「PSNRより、SSIMの方が、私たちの感覚に近い結果を出してくれる」というものでした。一般論としては、合ってるような気がします。


ところが、SSIMというものは、実務上、困ったことを巻き起こします。
SSIMというのは、その計算式の都合上、無限のバリエーションがあるのです。
ちょっと、そのあたりを確認してみましょう。


PSNRというのは、計算式*2を見てみると、ユーザーが勝手に選択できるようなオプションがありません*3。つまり、(グレースケール同士の比較である限り)誰が、どこで、どのプログラムを使って計算しようと、PSNRの値は同じものが出てくるはずです。なので、「PSNRを35±0.5にしろ」と指示して、それを第三者機械的にチェックして、外れているものは、ダメーというような検査(監査)は意味があります。


ところが、SSIMというのは事情が異なります。SSIMの計算式*4には、ユーザーが勝手に選択できるようなオプションがあります。

(マニアな領域)


例えば、http://www.ece.uwaterloo.ca/~z70wang/research/ssim/ssim_index.mにある、

C1 = (K(1)*L)^2;
C2 = (K(2)*L)^2;

という部分で、K(1)、K(2)、Lなどがそうです。

ただ、計算式の中に入っているオプションは、大して大きな違いを産まない*5ので、ここでは無視してみましょう。


計算式のオプションが無視できたとしても、実際の計算を行う上で、いくつかの重要なオプションがあります。その代表は、ガウシアンフィルターとディスタンスです。


ガウシアンフィルターもディスタンスも、公式*6に発表されている計算式


http://d.hatena.ne.jp/denshikA/20091115

には載っていません。ところが、実際の計算をする段階では、だいたい出現します。例えて言えば、各省庁は通達というものを出して、法律を実際に運用するための具体的なルールを提示しています*7。それと似たようなもので、SSIMの計算式上、どこにも載っていないのですが、実際の計算をする上で、例示されています。ガウシアンフィルターやディスタンスを使ったほうが、より良いSSIMの値が出てくる、と信じている研究者がいるからです。


さて、話が長くなっちゃうといけませんので、ガウシアンフィルターとディスタンスの詳細は、次回以降に回しましょう。今日のところは、SSIMの実際の計算において、ユーザーが勝手に選択できるようなオプションがある、ということだけ押えてください。


そして、ここからが重要なのですが、(PSNRと異なり)誰が、どこで、どのプログラムを使って計算したかによって、SSIMの値は全く別のものになる可能性があります。なので、「SSIMを90以上にしろ」と指示して、それを第三者機械的にチェックして、外れているものは、ダメーというような検査(監査)では恣意性*8が残ります。


なので、SSIMの値を指定して発注するときは、「必ず、SSIMの計算式を具体的に提示して、この計算式で○○以上になるようにしろ」という風に指示するようにしましょうね。

*1:http://d.hatena.ne.jp/denshikA/20090921

*2:http://d.hatena.ne.jp/makorin72/20080710を見ると良いでしょう

*3:唯一、誤差が生じるとすると、log10という定数を小数点以下何桁まで使うのかってことくらいなもんです。

*4:http://www.ece.uwaterloo.ca/~z70wang/research/ssim/ssim_index.mを見ると良いでしょう

*5:でも、小さな違いは産むので、注意してくださいね

*6:何を持って公式かという基準はないのですが、私が勝手に、これは公式だな、と勝手に判断しているもの、についてです。

*7:http://123k.zei.ac/kihonn/hourei.html

*8:事前に具体的な計算式を提示せず、後になって、SSIM値が規定を外れています、と指摘するのは、「後だしジャンケン」のようなものですので