SSIM結構相似性演算法

qq_43133135發表於2020-12-18

應用場景

結構相似性,是一種衡量兩幅影像相似度的指標,通常用作影像質量評估,在影像重建、壓縮領域,可以計算輸出影像與原圖的差距。

MSE

有很多演算法可以計算輸出影像與原圖的差距,其中最常用的一種是 Mean Square Error loss(MSE)。它的計算公式很簡單:

M S E = 1 n ∑ [ I i − K i ] 2 MSE=\frac{1}{n} \sum [I_i-K_i]^{2} MSE=n1[IiKi]2

就是計算重建影像與輸入影像的畫素差的平方,然後在全圖上求平均。
有時候兩張圖片只是亮度不同,但是之間的 MSE loss 相差很大。而一幅很模糊與另一幅很清晰的圖,它們的 MSE loss 可能反而相差很小:
在這裡插入圖片描述
結合神經科學的研究,認為我們人類衡量兩幅圖的距離時,更偏重於兩圖的結構相似性,而不是逐畫素計算兩圖的差異。

SSIM演算法

SSIM使用的兩張影像中,一張為未經壓縮的無失真影像,另一張為失真後的影像。

相似性按三個維度進行比較:

  1. 亮度(luminance)l(x,y)
  2. 對比度(contrast)c(x,y)
  3. 結構(structure)s(x,y)

最終相似度為這三者的函式:
在這裡插入圖片描述

亮度

以平均灰度來作為亮度測量的估計:
在這裡插入圖片描述

對比度

所謂對比度,就是影像明暗的變化劇烈程度,也就是畫素值的標準差,測量系統知道要把平均灰度值從訊號中去除,對於離散訊號,可使用標準差來做對比度估量值。
在這裡插入圖片描述

結構

需要注意的是,對一幅圖而言,其亮度和對比度都是標量,而其結構顯然無法用一個標量表示,而是應該用該圖所有畫素組成的向量來表示。同時,研究結構相似度時,應該排除亮度和對比度的影響,即排除均值和標準差的影響,可用歸一化影像向量 ( x − μ x ) (x-μ _x) (xμx)來做結構對比估計。該向量長度為

∑ i = 1 N ( x i − μ x ) 2 = N − 1 ∗ σ x \sum_{i=1}^{N}(x_{i}-\mu_{x})^2=\sqrt{N-1} *\sigma_{x} i=1N(xiμx)2=N1 σx

相似函式

三個公式定量計算這三者的相似性,公式的設計遵循三個原則:

  1. 對稱性: S ( x , y ) = S ( y , x ) S(x,y)=S(y,x) S(x,y)=S(y,x)
  2. 有界性: S ( x , y ) ≤ 1 S(x,y)≤1 S(x,y)1
  3. 極限值唯一: S ( x , y ) = 1 S(x,y)=1 S(x,y)=1當且僅當 x = y x = y x=y

作者用如下公式衡量兩幅圖 x 和 y 的亮度相似度

l ( x , y ) = 2 μ x μ y + C 1 μ x 2 + μ y 2 + C 1 l(x,y)= \frac{2μ_xμ _y+C1}{μ_x^2+μ _y^2+C_1} l(x,y)=μx2+μy2+C12μxμy+C1

這裡 C 1 C_1 C1 是為了防止分母為零的情況,且:

C 1 = ( K 1 L ) 2 C_{1}=\left(K_{1} L\right)^{2} C1=(K1L)2

其中 K 1 ≪ 1 K_1≪1 K11是一個常數,具體程式碼中的取值為 0.01,L 是灰度的動態範圍,由影像的資料型別決定,如果資料為 uint8 型,則 L=255。該公式對稱且小於等於1,當 x = y 時等號成立。

對比度的相似度(標準差)公式和亮度(均值)公式極為相似,,所以相似度也可以借鑑過來,作者定義對比度相似度
不過把均值換成了方差,作者定義:

c ( x , y ) = 2 σ x σ y + C 2 σ x 2 + σ y 2 + C 2 c(\mathrm{x}, \mathrm{y})=\frac{2 \sigma_{\mathrm{x}} \sigma_{\mathrm{y}}+C_{2}}{\sigma_{\mathrm{x}}^{2}+\sigma_{\mathrm{y}}^{2}+C_{2}} c(x,y)=σx2+σy2+C22σxσy+C2
其中:

C 2 = ( K 2 L ) 2 C_{2}=\left(K_{2} L\right)^{2} C2=(K2L)2

一般 K 2 K_2 K2在程式碼中取 0.03。該公式也對稱且小於等於1,當 x = y 時等號成立。

對於結構相似度,可以採用是歸一化的兩個向量: x − μ x N − 1 ∗ σ x \frac{\mathrm{x}-\mu_{x} }{\sqrt{N-1}*\sigma_{x}} N1 σxxμx y − μ y N − 1 ∗ σ y \frac{\mathrm{y}-\mu_{y}}{\sqrt{N-1}*\sigma_{y}} N1 σyyμy之間的關係來衡量。
它們的餘弦相似度為:

s ( x , y ) = ( 1 N − 1 x − μ x σ x ) ⋅ ( 1 N − 1 y − μ y σ y ) = 1 σ x σ y ( 1 N − 1 ∑ i = 1 N ( x i − μ x ) ( y i − μ y ) ) \begin{aligned} s(\mathrm{x}, \mathrm{y}) =\left(\frac{1}{\sqrt{N-1}} \frac{\mathrm{x}-\mu_{\mathrm{x}}}{\sigma_{\mathrm{x}}}\right) \cdot\left(\frac{1}{\sqrt{N-1}} \frac{\mathrm{y}-\mu_{\mathrm{y}}}{\sigma_{\mathrm{y}}}\right) \\ =\frac{1}{\sigma_{\mathrm{x}} \sigma_{\mathrm{y}}}\left(\frac{1}{N-1} \sum_{i=1}^{N}\left(x_{i}-\mu_{\mathrm{x}}\right)\left(y_{i}-\mu_{\mathrm{y}}\right)\right) \end{aligned} s(x,y)=(N1 1σxxμx)(N1 1σyyμy)=σxσy1(N11i=1N(xiμx)(yiμy))

上式中第二行括號內的部分為協方差公式:

σ x y = 1 N − 1 ∑ i = 1 N ( x i − μ x ) ( y i − μ y ) \sigma_{\mathrm{xy}}=\frac{1}{N-1} \sum_{i=1}^{N}\left(x_{i}-\mu_{\mathrm{x}}\right)\left(y_{i}-\mu_{\mathrm{y}}\right) σxy=N11i=1N(xiμx)(yiμy)
為了防止分母為0,分子分母同時加 C 3 C_3 C3

s ( x , y ) = σ x y + C 3 σ x σ y + C 3 s(\mathrm{x}, \mathrm{y})=\frac{\sigma_{\mathrm{xy}}+C_{3}}{\sigma_{\mathrm{x}} \sigma_{\mathrm{y}}+C_{3}} s(x,y)=σxσy+C3σxy+C3

SSIM

根據上面三個公式,定義兩幅影像的相似度為:
S S I M ( x , y ) = l ( x , y ) ⋅ c ( x , y ) ⋅ s ( x , y ) SSIM(x,y)=l(x,y)⋅c(x,y)⋅s(x,y) SSIM(x,y)=l(x,y)c(x,y)s(x,y)

可以巧妙的令 C 3 = C 2 / 2 C_3 = C_2/2 C3=C2/2,使得 c ( x , y ) c(\mathrm{x, y}) c(x,y)的分子和 s ( x , y ) s(\mathrm{x, y}) s(x,y) 的分母可以約分,最終得到 SSIM 的公式:

SSIM ⁡ ( x , y ) = ( 2 μ x μ y + C 1 ) ( 2 σ x y + C 2 ) ( μ x 2 + μ y 2 + C 1 ) ( σ x 2 + σ y 2 + C 2 ) \operatorname{SSIM}(\mathrm{x}, \mathrm{y})=\frac{\left(2 \mu_{\mathrm{x}} \mu_{\mathrm{y}}+C_{1}\right)\left(2 \sigma_{\mathrm{xy}}+C_{2}\right)}{\left(\mu_{\mathrm{x}}^{2}+\mu_{\mathrm{y}}^{2}+C_{1}\right)\left(\sigma_{\mathrm{x}}^{2}+\sigma_{\mathrm{y}}^{2}+C_{2}\right)} SSIM(x,y)=(μx2+μy2+C1)(σx2+σy2+C2)(2μxμy+C1)(2σxy+C2)

MSSIM

上面的 SSIM 不能用於一整幅圖,因為在整幅圖的跨度上,均值和方差往往變化劇烈;同時,影像上不同區塊的失真程度也有可能不同,不能一概而論;此外類比人眼睛每次只能聚焦於一處的特點,採用 sliding window 以步長為 1 計算兩幅圖各個對應 sliding window 下的 patch 的 SSIM,然後取平均值作為兩幅圖整體的 SSIM,稱為 Mean SSIM。簡寫為 MSSIM(注意和後續出現的 multi-scale SSIM:MS-SSIM 作區分)。

假如整幅圖有 M 個 patch,那麼 MSSIM 公式為:

MSSIM ⁡ ( X , Y ) = 1 M ∑ j = 1 M SSIM ⁡ ( x j , y j ) \operatorname{MSSIM}(\mathrm{X}, \mathrm{Y})=\frac{1}{M} \sum_{j=1}^{M} \operatorname{SSIM}\left(\mathrm{x}_{j}, \mathrm{y}_{j}\right) MSSIM(X,Y)=M1j=1MSSIM(xj,yj)

優化技巧

需要知道的數學公式大概是:

σ x 2 = E [ x 2 ] − E 2 [ x ] \sigma_{\mathrm{x}}^{2}=E\left[\mathrm{x}^{2}\right]-E^{2}[\mathrm{x}] σx2=E[x2]E2[x]

σ x y 2 = E [ x y ] − E [ x ] E [ y ] \sigma_{\mathrm{xy}}^{2}=E[\mathrm{xy}]-E[\mathrm{x}] E[\mathrm{y}] σxy2=E[xy]E[x]E[y]

相關文章