SSIM結構相似性演算法
應用場景
結構相似性,是一種衡量兩幅影像相似度的指標,通常用作影像質量評估,在影像重建、壓縮領域,可以計算輸出影像與原圖的差距。
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∑[Ii−Ki]2
就是計算重建影像與輸入影像的畫素差的平方,然後在全圖上求平均。
有時候兩張圖片只是亮度不同,但是之間的 MSE loss 相差很大。而一幅很模糊與另一幅很清晰的圖,它們的 MSE loss 可能反而相差很小:
結合神經科學的研究,認為我們人類衡量兩幅圖的距離時,更偏重於兩圖的結構相似性,而不是逐畫素計算兩圖的差異。
SSIM演算法
SSIM使用的兩張影像中,一張為未經壓縮的無失真影像,另一張為失真後的影像。
相似性按三個維度進行比較:
- 亮度(luminance)l(x,y)
- 對比度(contrast)c(x,y)
- 結構(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=N−1∗σx
相似函式
三個公式定量計算這三者的相似性,公式的設計遵循三個原則:
- 對稱性: S ( x , y ) = S ( y , x ) S(x,y)=S(y,x) S(x,y)=S(y,x)
- 有界性: S ( x , y ) ≤ 1 S(x,y)≤1 S(x,y)≤1
- 極限值唯一: 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 K1≪1是一個常數,具體程式碼中的取值為 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}}
N−1∗σxx−μx和
y
−
μ
y
N
−
1
∗
σ
y
\frac{\mathrm{y}-\mu_{y}}{\sqrt{N-1}*\sigma_{y}}
N−1∗σ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)=(N−11σxx−μx)⋅(N−11σyy−μy)=σxσy1(N−11i=1∑N(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=N−11∑i=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)=M1∑j=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]
相關文章
- 文字相似性計算--MinHash和LSH演算法演算法
- 資料結構與演算法:圖形結構資料結構演算法
- 資料結構:初識(資料結構、演算法與演算法分析)資料結構演算法
- 資料結構與演算法-資料結構(棧)資料結構演算法
- 結構與演算法(02):佇列和棧結構演算法佇列
- 資料結構與演算法之線性結構資料結構演算法
- 資料結構&演算法資料結構演算法
- 【PHP資料結構】PHP資料結構及演算法總結PHP資料結構演算法
- leetcode演算法資料結構題解---資料結構LeetCode演算法資料結構
- python演算法與資料結構-演算法和資料結構介紹(31)Python演算法資料結構
- 資料結構——Floyd演算法資料結構演算法
- 基本資料結構演算法資料結構演算法
- 資料結構演算法題資料結構演算法
- 前端演算法 - 資料結構前端演算法資料結構
- 資料結構及演算法資料結構演算法
- 資料結構與演算法資料結構演算法
- 資料結構和演算法資料結構演算法
- 資料結構和演算法總結--棧資料結構演算法
- 資料結構與演算法-連結串列資料結構演算法
- [資料結構與演算法] 排序演算法資料結構演算法排序
- 【演算法與資料結構】經典排序演算法總結演算法資料結構排序
- 資料結構與演算法整理總結---雜湊演算法資料結構演算法
- 資料結構與演算法整理總結---演算法複雜度資料結構演算法複雜度
- python演算法與資料結構-什麼是資料結構Python演算法資料結構
- 資料結構與演算法-連結串列(上)資料結構演算法
- JavaScript資料結構與演算法(連結串列)JavaScript資料結構演算法
- 資料結構與演算法分析——連結串列資料結構演算法
- [ JavaScript ] 資料結構與演算法 —— 連結串列JavaScript資料結構演算法
- 資料結構與演算法-連結串列(下)資料結構演算法
- 資料結構與演算法:查詢演算法資料結構演算法
- 資料結構與演算法——貪心演算法資料結構演算法
- 資料結構與演算法02資料結構演算法
- 資料結構與演算法-堆資料結構演算法
- 演算法(4)資料結構:堆演算法資料結構
- 資料結構與演算法03資料結構演算法
- 資料結構-KMP模式演算法資料結構KMP模式演算法
- 【JavaScript 演算法與資料結構】JavaScript演算法資料結構
- 資料結構與演算法(java)資料結構演算法Java