Visualize

Visual系、もとい画像系研究者の端くれのブログ。専門は画像符号化。画質評価、画像処理全般に興味あり。最近はネットワーク分野(特にEthernet)も勉強中。

画質評価指標SSIMについて調べてみた

実質的な第1回目の記事は、画質評価指標のSSIMについて調べてみました。

背景

以前、仕事でH.264/AVCエンコーダの開発をしていました。

エンコーダを開発する際は性能の良し悪しの重要な観点として、
符号化→復号した際の画質劣化をどれくらい抑えられるかを評価する必要があります。

画質評価の方法として、当時は客観評価と主観評価の両方をやっていたのですが、
客観評価にはPSNR (と参考程度に市販の画質評価ツール) を使用していました。

PSNR (Peak-Signal to Noize Ratio) はこの分野で伝統的に広く用いられている評価手法です。

{ \displaystyle
PSNR = 10 \cdot \log_{10} \frac{MAX^2}{MSE}
}

ここで、MAXは画素値の最大値です。1画素8bitの画像なら画素値は0~255なので、最大値は255です。
また、MSE = {(符号化前の画素値 - 符号化後の画素値)^2 の1画素あたりの平均値}です。

つまり、PSNRは符号化前の画素値と符号化後の画素値が平均的にどれだけ変わったかで
画質の良し悪しを判断しようという指標です。

しかし、PSNRの良し悪しと人間が感じる画質の良し悪しは必ずしも一致しないことが知られてます。

例えば、PSNRでは複数の画素値がわずかに異なる場合と、1画素のみ画素値が大きく異なる場合が区別できません。
また、人間は画素値の変化量は同じでも絵柄が複雑なところより、
絵柄が平坦なところのほうが変化に気づきやすいという視覚特性がありますが、
これもPSNRでは区別することができません。

よって、PSNRより良い客観画質指標がほしいところです。
SSIMはその有力候補として存在しているのは知っていたのですが、
なんとなく使う機会がなかったためよくわからないまま放置してしまっていました。

そこで、今更感はありますが今回はSSIMについて勉強してみました。

SSIM (structural similarity)

下記サイトにあるSSIMの論文 (Image Quality Assessment: From Error Visibility to Structural Similarity) を読んでみました。
https://ece.uwaterloo.ca/~z70wang/research/ssim/

以下は、上記論文の内容のまとめです。

SSIMの定義式

SSIMは画像内の小領域(window)毎に算出されます。

{ \displaystyle
SSIM(\mathbf{x}, \mathbf{y}) = \frac{(2\mu_{x}\mu_{y} + C_{1})(2\sigma_{xy} + C_{2})}{(\mu_{x}^2 + \mu_{y}^2 + C_{1})(\sigma_{x}^2 + \sigma_{y}^2 + C_{2})}
}

ここで、{ \displaystyle \mathbf{x} }{ \displaystyle \mathbf{y} }はそれぞれ符号化前の画像と符号化後の画像におけるwindow内の各画素を要素とするベクトル ({ \displaystyle \mathbf{x} }{ \displaystyle \mathbf{y} }はどちらが符号化前でどちらが符号化後でも結果は同じになります)、
{ \displaystyle \mu }はそれぞれのwindow内の平均画素値、{ \displaystyle \sigma_x }{ \displaystyle \sigma_y }は同window内の画素値の標準偏差{ \displaystyle \sigma_{xy}}{ \displaystyle \mathbf{x} }{ \displaystyle \mathbf{y} }の共分散です。
また、{ \displaystyle C_1 }{ \displaystyle C_2 }は分母の値が非常に小さくなった時に評価値が不安定にならないための定数です。
{ \displaystyle C_1 = (K_1 L)^2 }{ \displaystyle C_2 = (K_2 L)^2 }で、{ \displaystyle L}は画素値のダイナミックレンジ(8bit画像だと255)です。
{ \displaystyle K_1}および{ \displaystyle K_2}は定数で、本論文では{ \displaystyle K_1 = 0.01}{ \displaystyle K_2 = 0.03}としています。



と、ここまではググるとすぐ出てくるのですが、どうしてこういう式になるのか気になります。
ということで、以下には論文で説明されている式の意味を記します。

SSIMの定義式の意味

SSIMは、以下の3つの要素が符号化前と符号化後でどれくらい変化したかで画質を評価しているようです。

  • 画素値(輝度値)の変化
  • コントラストの変化
  • 構造の変化

まず、輝度値の変化は下記の式のとおり平均輝度値を用いて評価します。

{ \displaystyle
l(\mathbf{x}, \mathbf{y}) = \frac{(2\mu_{x}\mu_{y} + C_{1})}{(\mu_{x}^2 + \mu_{y}^2 + C_{1})}
}
次に、コントラストはすなわち「輝度値の高いところと低いところがどれくらい離れているか」なので
輝度値の分布の広がり具合を表す分散および標準偏差(標準偏差^2 = 分散)を用いて下記の式で評価します。
式としては{ \displaystyle l(\mathbf{x}, \mathbf{y})}中の平均輝度値{ \displaystyle \mu }標準偏差{ \displaystyle \sigma }になっただけですね。

{ \displaystyle
c(\mathbf{x}, \mathbf{y}) = \frac{(2\sigma_{x}\sigma_{y} + C_{2})}{(\sigma_{x}^2 + \sigma_{y}^2 + C_{2})}
}

さらに、構造についてですが、これは画像内に写っている物体の構造に依存するものなので、
照明環境等に依存する輝度値やコントラストの変化に影響されないものです。

ということで輝度値から照明環境の影響を排除するために、平均輝度値を引いて分散で正規化した値{ \displaystyle (\mathbf{x} - \mu_x) / \sigma_x}{ \displaystyle (\mathbf{y} - \mu_y) / \sigma_y}を求めます。
そして、{ \mathbf{x}}{ \mathbf{y}}内積を求めることで両者の相関を評価するのですが、
これは結局{ \mathbf{x}}{ \mathbf{y}}の相関係数の定義式と同じになり(!)、以下の式になります。

{ \displaystyle
s(\mathbf{x}, \mathbf{y}) = \frac{(2\sigma_{xy} + C_{3})}{(\sigma_{x}\sigma_{y} + C_{3})}
}

と、これで各観点の3つの式ができました。
これを下記のような形でがっちゃんこします。

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


問題はこのがっちゃんこするときの{ \displaystyle \alpha }{ \displaystyle \beta }{ \displaystyle \gamma }をどうするかですが、
上記論文では簡単のために{ \displaystyle \alpha = \beta = \gamma = 1}とし、更に{ \displaystyle C_3 = C_2 / 2 }としています。

すると、最初に示した定義式になります。


・・・・・・うーん、後半がやや強引な気がします。
以上が、SSIMの式の意味です。


また、上記のようにSSIMはwindow単位で算出されるものなので、画像全体の指標としてはwindowを
少しずつずらしながら画像全体でSSIMをM個算出して平均をとったMSSIMを使います。
式にすると以下の通りになります。

{ \displaystyle
MSSIM(\mathbf{X}, \mathbf{Y}) = \frac{1}{M} \sum^M_{j=1}SSIM(\mathbf{x}_j, \mathbf{y}_j)
}

感想・補足

以上で、SSIMの基本的な算出法、および意味は押さえられたのではないかと思います。
本当は、SSIMを算出するサンプルコードや画像とSSIM値、PSNR値の関係の例などを示せれば良いと思ったのですが、
一旦ここまでとしたいと思います。

また、実際にSSIMを算出する際には、上記では出てこなかった手順が追加されることが多いようです。
例えば、上記論文中にも出てくるのですがSSIMを算出する前にガウシアンフィルタをかけたりするようです。

ここが割と評価者の自由に変えられてしまうので、客観指標値としての信憑性や使いやすさがいまいちになってしまっているのが、
結局未だにPSNRが使われ続けている理由の一つかなと思います。

SSIMにはさらに改良版の論文もあるようなので、今度はそちらも読んでみたいと思います。

客観指標値の研究は色々なところでされていると思うので、今後に期待したいと思います。