僕の考えた最強の画質評価

SSIMをパクった

算出方法

1・すべての画素ついての画質値を求める
2・画質値が一定以下の画素だけ取り出して、画質値の平均を求める
3・画質値の平均が高い画像ほど画質がいい

画質値の算出方法

1・元画像aと比較画像bを読み込む。
2・2つの画像の、参照画素及び周囲3x3の合計9ドットの、輝度の平均値を求める(平均aと平均b)
3・2つの画像の、参照画素及び周囲3x3の合計9ドットの、輝度の相関値を求める(相関値)
4・画質値 = (平均aと平均bの差の絶対値) / (画像のダイナミックレンジ) * 相関値で求める
画像のダイナミックレンジは、RGB8bitカラーなら255

相関値の求め方

実際は9ドットだけど、めんどいから4ドットで考える。

画像a 画像b aとbの平均 aの平均の差 bの平均の差 ←2つの積
ドット1の輝度値 100 70 +15 -10 -150
ドット2の輝度値 90 90 +5 +10 +50
ドット3の輝度値 80 70 -5 -10 +50
ドット4の輝度値 70 90 -15 +10 -150
4ドットの平均値 85 80     -50
4ドットの二乗の平均     125 100  

↑の表から、太字の数字を拾って、相関値 = (-50) / √125 / √100 で求める。
↑の場合、だいたい0.45になる。
↑の表から、太字の数字を拾って、相関値 = (-50 * 2) / (125+100) で求める。
↑の場合、だいたい0.44になる。
実際は、0除算を防ぐために、隠し味を使う。
相関値 = (-50+隠し味) / √(125+隠し味) / √(100+隠し味)
相関値 = (-50*2 +隠し味) / (125+100+隠し味)

画質値が一定以下の画素だけ取り出す方法

 なんでこんな事するのかというと、画像の一部だけすごくノイジーなのと、画像全体がちょっぴりノイジーなのでは、少なくとも画像圧縮における画質評価では前者のほうが画質が悪いと判断すべきだと思ったから。
 めんどくさいので、一番画質値が低い画素を基準に

画質値 最低画質 抽出画素
ドット1 0.7 0.7
ドット2 0.8   0.8
ドット3 0.9   0.9
ドット4 1.0    
画質値の平均 0.85   0.8

↑では、0.7が最低画質なので、画質値が0.7+9 / 10 = 0.97 より低い画素を取り出して、それの平均を求める。
(追記)色々試してたら、基準は、全画素の画質値の平均値を使ったほうがいいっぽい。
(追記)うーん。ディザ無し減色した時のマッハバンドをうまく拾ってくれないお…
(追記)SSIMの式を誤読してた箇所を修正したら若干マシになった。エントリも修正。