SSIM结构相似性算法
应用场景结构相似性,是一种衡量两幅图像相似度的指标,通常用作图像质量评估,在图像重建、压缩领域,可以计算输出图像与原图的差距。MSE有很多算法可以计算输出图像与原图的差距,其中最常用的一种是 Mean Square Error loss(MSE)。它的计算公式很简单:MSE=1n∑[Ii−Ki]2MSE=\frac{1}{n} \sum [I_i-K_i]^{2}MSE=n1∑[Ii−Ki]
应用场景
结构相似性,是一种衡量两幅图像相似度的指标,通常用作图像质量评估,在图像重建、压缩领域,可以计算输出图像与原图的差距。
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]
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)