SSIM(structural similarity)算法原理

SSIM(structural similarity)结构相似性,也是一种全参考的图像质量评价指标,它分别从亮度、对比度、结构三方面度量两幅图像相似性,其值越大越好,最大为1;作为结构相似性理论的实现,结构相似度指数从图像组成的角度将结构信息定义为独立于亮度、对比度的,反映场景中物体结构的属性,并将失真建模为亮度、对比度和结构三个不同因素的组合;用均值作为亮度的估计,标准差作为对比度的估计,协方差作为结构相似程度的度量。

与传统检测图像质量的方法MSE,PSNR与人眼的实际视觉感知是不一致的,SSIM算法在设计上考虑了人眼的视觉特性,比传统方式更符合人眼视觉感知,MSE或者是PSNR算法,都是对绝对误差的评估,SSIM是一种基于感知的计算模型,它能够考虑到图像的结构信息在人的感知上的模糊变化,该模型还引入了一些与感知上的变化有关的感知现象,包含亮度mask和对比mask,结构信息指的是像素之间有着内部的依赖性,尤其是空间上靠近的像素点。这些依赖性携带着目标对象视觉感知上的重要信息。

SSMI算法的计算公式:

其中ux、uy分别表示图像X和Y的均值,σX、σY分别表示图像X和Y的方差,σXY表示图像X和Y的协方差,即

最后把三个函数组合起来,得到SSIM指数函数:

                                   

      这里,用来调整三个模块间的重要性。

      为了得到简化形式,设,其中C1、C2、C3为常数,为了避免分母为0的情况,通常取C1=(K1*L)^2, C2=(K2*L)^2, C3=C2/2, 一般地K1=0.01, K2=0.03, L=255. 则

即: 

SSIM取值范围[0,1],值越大,表示图像失真越小.

在实际应用中,可以利用滑动窗将图像分块,令分块总数为N,考虑到窗口形状对分块的影响,采用高斯加权计算每一窗口的均值、方差以及协方差,然后计算对应块的结构相似度SSIM,最后将平均值作为两图像的结构相似性度量,即平均结构相似性MSSIM:

python的代码实现:

def batch_ssim(dbatch):
    im1,im2=np.split(dbatch,2)
    imgsize=im1.shape[1]*im1.shape[2]
    avg1=im1.mean((1,2),keepdims=1)
    avg2=im2.mean((1,2),keepdims=1)
    std1=im1.std((1,2),ddof=1)
    std2=im2.std((1,2),ddof=1)
    cov=((im1-avg1)*(im2-avg2)).mean((1,2))*imgsize/(imgsize-1)
    avg1=np.squeeze(avg1)
    avg2=np.squeeze(avg2)
    k1=0.01
    k2=0.03
    c1=(k1*255)**2
    c2=(k2*255)**2
    c3=c2/2
    return np.mean((2*avg1*avg2+c1)*2*(cov+c3)/(avg1**2+avg2**2+c1)/(std1**2+std2**2+c2))

 

 

Reference:

ssim算法原理

图像质量评价方法PSNR+SSIM&&评估指标SROCC,PLCC

PSNR和SSIM

评价图像质量的新方式SSIM

图像质量评估算法 SSIM(结构相似性)

OpenCV 实现SSIM结构相似性算法

除了 MSE loss,也可以试试用它:SSIM 的原理和代码实现

 

 

 

你可能感兴趣的:(Deep,Learning,Machine,Learning,tensorflow,GAN,pytorch,SSMI,图像结构相似度)