应用场景

结构相似性,是一种衡量两幅图像相似度的指标,通常用作图像质量评估,在图像重建、压缩领域,可以计算输出图像与原图的差距。

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]

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐