MSE/PSNR vs  SSIM の比較画像紹介

# はじめに

MSE/PSNR に比べて SSIM の方が見た目の差分をよく反映する典型的なケースを集めたドキュメントを紹介します。 

- Mean Squared Error:Love It or Leave It? A New Look at Signal Fidelity Measures
   - https://ece.uwaterloo.ca/~z70wang/publications/SPM09_figures.pdf

Fig.4 まで注釈します。(参照先のドキュメントでは Fig.15 まであります)

# 前提知識

２つの画像がどの程度似ているかの定量化、画像類似度指標として特に有名なものとして、MSE/PSNR と SSIM があります。

## MSE/PSNR

まず、２枚の画像の同じ位置同士のピクセル輝度差に abs をとって集計するのを思いつくでしょう。AE (Absolute Error) と呼びます。

```math
AE = \sum^{m-1}_{i=0} \sum^{n-1}_{j=0} | I(i,j) - K(i,j) |
```

単純に足すと画像サイズにより値が変わるので、その平均を使うのが MAE (Mean Absolute Error) です。

```math
MAE = \frac{1}{m \, n} \sum^{m-1}_{i=0} \sum^{n-1}_{j=0} | I(i,j) - K(i,j) |
```

この差分を二乗差にしたのが MSE (Mean Square Error) 。

```math
MSE = \frac{1}{m \, n} \sum^{m-1}_{i=0} \sum^{n-1}_{j=0} [ I(i,j) - K(i,j) ]^2
```

更に差が大きすぎると鈍くなる人の目の感覚に近づけるよう $ \frac{MAX^2}{MSE} $ の(底が10の)対数をとって10乗算したのが PSNR (Peak Signal to Noise Ratio)です。PSNR の単位はデシベル(Db)です、


```math
\begin{aligned}
PSNR &= 10 \cdot \log_{10} \left( \frac{MAX^2_I}{MSE} \right) \\
     &= 20 \cdot \log_{10} \left( \frac{MAX_I}{\sqrt{MSE}} \right)   \\
     &= 20 \cdot \log_{10} (MAX_I) - 10 \cdot  \log_{10}(MSE)
\end{aligned}
```

MSE/PSNR は単純に同じ位置のピクセル輝度値がどの位変わったのかを示します。
例えば全ピクセルが１つずれると見た目変わらないのに、MSE/PSNR は過敏に反応するといった分かりやすい欠点が色々とあります。
特に動画/画像コーデックのように、見た目の劣化が少ないよう工夫しながら、圧縮がよく効くように RGB 値を大胆に元の値から変化させていく。そんなケースとは相性がよくありません。

## SSIM

輝度、コントラスト、構造に対して、ピクセル毎にその周囲の平均、分散、共分散をとることで、ピクセル単体のみならず、ピクセルの空間的な相関を取り込んだ指標です。

- SSIM index (とりあえず使える版)

```math
SSIM(x,y) =  \frac{(2 \mu_x  \mu_y +  c_1)(2  \sigma_{x y} + c_2)}{( \mu_x^2 +  \mu_y^2 + c_1)( \sigma_x^2 +  \sigma_y^2 + c_2)}
```


- SSIM (α、β、γパラメータを調整して使う)

```math
SSIM(x,y) =  [l(x,y)^{\alpha} \cdot c(x,y)^{\beta} \cdot s(x,y)^{\gamma} ]
```

```math
\begin{aligned}
l(x,y) &=  \frac{ 2 \mu_x  \mu_y +  c_1}{\mu_x^2 +  \mu_y^2 + c_1} :輝度平均 \\
c(x,y) &=  \frac{2  \sigma_x \sigma_y + c_2}{\sigma_x^2 +  \sigma_y^2 + c_2} :輝度のばらつき \\
s(x,y) &=  \frac{\sigma_{x y} + c_3}{\sigma_x \sigma_y + c_3} :輝度の偏り \\
\end{aligned}
```

(c) https://en.wikipedia.org/wiki/Structural_similarity

基本的にはブラーをかけた上で上記の計算を行います。

ピクセルずれへの過敏な反応は MSE/PSNRより抑えられますし、元々ごちゃったとした場所や高い輝度でマスクされる場所を人の目はあまり気にしないといった視覚特性も反映します。
MSE/PSNR より高度な画質評価のメジャーな方式です。

# MSE/PSNR vs SSIM

さて、ここから本題で、MSE/PSNR と SSIM を比較した図です。
極端な例が多いですが、実際に MSE/PSNR だと見た目の差分と合わないケースがこれらで説明できる事もあります。

## Fig.3(a)

- MSE:404 相当にノイズを全体的に混ぜる。(左上→左下の変換 - noize)
- 左ピクセルから暗＞明の順に並び替える (左上→右上の変換 - reordering)
- 左上→右上と同じ手順で並び替える (左下→右下の変換 - identical reordering)

![tmp-002.png](https://qiita-image-store.s3.amazonaws.com/0/1798/b7c7ce1d-6f92-cd81-b221-6819cefc9049.png)

左のペアと右のペアは、どちらも MSE は 404 ですが画像の見た目の差分は全然違います。
平坦な場所ではノイズがより目立つ事が分かりやすい例です。

## Fig.3(b)

画像の合成で MSE/PSNR が実態を表さないケースです。

- 元画像と相関の高い画像を合成する。(左)
- 元画像と相関の低い画像を合成する (右)

![tmp-003.png](https://qiita-image-store.s3.amazonaws.com/0/1798/8bdc82f5-f6c6-c77e-0c19-e6143791fc57.png)

同じ画像を２つの異なる画像に合成した場合、それらの MSE は同一ですが、重ねる相手によってその違和感が全然異なります。

## Fig.3(c)

- 均等に明るくする (左→右上)
- 明るくするのと暗くするのをランダムに入れる (左→右下)

![tmp-004.png](https://qiita-image-store.s3.amazonaws.com/0/1798/51f35bdc-329a-39b9-b09d-4525ae039dfe.png)

全体を均等に明るくしても人の目は画質が悪くなったとは(あまり)思いませんが、明るい方向と暗くする方向の両方に費やすと MSE/PSNR は同じですが見た目は全然違ってきます。

## Fig.3(d)

ヒートマップの白黒版です。全体的に均一にノイズを混ぜた場合。
Local absolute difference (MSE/PSNR 相当)だとそのまま全体に均一に差が出ますが、
Local SSIM では元々ノイズっぽい場所に新たなノイズが混ざっても気にならない一方、綺麗なグラデーション部分に混ざると目立つといった、人の目の性質に近い結果が出ます。

![tmp-005.png](https://qiita-image-store.s3.amazonaws.com/0/1798/bd4978bb-ceda-7995-84fa-71c101e4b2ff.png)

## Fig.4

円周上の画像は全て MSE/PSNR だと同じ値になりますが、実際の見た目が全然違います。SSIM はこの見た目に相関した値を示します。

![tmp-006.png](https://qiita-image-store.s3.amazonaws.com/0/1798/1a52aa09-fd6d-72b2-1639-9671c8cadd4f.png)

# さいごに

Fig.5 〜 Fig.15 はもう少し理論的な話になるので、その解説は気が向いた時にでも。。

あと、SSIM も単純な統計量をとっている以上騙す事は出来ます。

苦手なケースもあるので、絶対的に信頼するのでなく、ひとつの方法として捉えるのが良いでしょう。

## 追記 (2018/10/04)

SSIM が苦手な画像が紹介されていたのでリンクを張ります。

- SSIMがウソをつく例
  - https://qiita.com/miyanaga/items/16c8b89b3aa20356b6fe

```
SSIMは輝度・コントラスト・構造を元に類似度を数値化するということで、色相は軽視されているのかもしれません。
変換BのSSIM値が絶対的に高かったのは、輝度やコントラストには色相ほどの変化がなかったのではないかと推測します。
```

(無印)SSIM はグレースケール画像のアルゴリズムなので、カラー画像だと R,G,B を独立に SSIM 計算する事が多く、以下の右３つの画像に対する処理になります。

|画像| Red | Green | Blue |
|---|---|---|---|
![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/cff90791-916f-d965-0910-051d4b8ec9cc.png)|![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/8154cb7b-8e8a-fdbb-f382-1c487197b0aa.png) | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/a21c785e-656b-8fae-e936-e3fb31565423.png) | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/0224b748-9bbb-a48c-83e6-c1d98802fdae.png) |
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/f22f6d0d-f1fa-1fd1-4b9e-e6f7c0179825.png) | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/69f1afa2-bbe8-e02f-9f7d-b4da6bb0dea3.png) | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/9c52c829-9742-ae76-1e9d-fb571532a48c.png) | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/b944c1d2-5260-67e1-e637-0353f5fa9219.png) |

SSIM の欠点として、グラデーションの違いを過小評価し過ぎる点があり、この画像の場合、階調を落とす事で生じる偽輪郭を差異として捉えているのですが、面積として占める割合が小さいので、結果として差異を小さく見積もってしまうようです。
あと、平均はともかく分散や共分散はガウス窓でブラーかける際の σ に強く影響されるので、デフォルト値がどうなってるのか気になります。

# 参考 URL

- https://en.wikipedia.org/wiki/Structural_similarity
- https://www.worddisk.com/wiki/SSIM/
- https://www.cns.nyu.edu/pub/eero/wang03-reprint.pdf
   - https://ece.uwaterloo.ca/~z70wang/publications/HIVP_chapter83.pdf