SSIM

  • 一、结构相似性
  • 二、SSIM指数
    • 2.1 亮度对比函数
    • 2.2 对比度对比函数
    • 2.3 结构对比函数
    • 2.4 SSIM测量函数
    • 2.5 SSIM函数满足的三个条件
  • 三、MSSIM
  • 四、实现

一、结构相似性

自然图像具有极高的结构性,表现在图像的像素间存在着很强的相关性,这些相关性在视觉场景中携带着关于物体结构的重要信息。我们假设人类视觉系统(HSV)主要从可视区域内获取结构信息。所以通过探测结构信息是否改变来感知图像失真的近似信息,衡量两幅图像的相似度

二、SSIM指数

物体表面的亮度信息与照度和反射系数有关,且场景中的物体的结构与照度是独立的,反射系数与物体有关。我们可以通过分离照度对物体的影响来探索一张图像中的结构信息。这里,把与物体结构相关的亮度和对比度作为图像中结构信息的定义。因为一个场景中的亮度和对比度总是在变化的,所以我们可以通过分别对局部的处理来得到更精确的结果。

SSIM测量系统由三个对比模块组成:亮度、对比度、结构

2.1 亮度对比函数

将图像的平均灰度作为亮度测量的估计
μX=1H×M∑i=1H∑j=1MX(i,j)\mu_X = \frac{1}{H\times M} \sum\limits_ {i=1}^{H}\sum\limits_{j=1}^{M} X(i, j)μX​=H×M1​i=1∑H​j=1∑M​X(i,j)
于是两幅图像的亮度对比函数
l(x,y)=2μxμy+C1μx2+μy2+C1l(x, y) = \frac{2\mu_x\mu_y+C_1}{\mu_x^2+\mu_y^2+C_1}l(x,y)=μx2​+μy2​+C1​2μx​μy​+C1​​

2.2 对比度对比函数

将图像的标准差作为对比度测量估计
σX=(1H+W−1∑i=1H∑j=1M(X(i,j)−μX)2)12\sigma_X = (\frac{1}{H+W-1} \sum\limits_ {i=1}^{H}\sum\limits_{j=1}^{M} (X(i, j)-\mu_X)^2)^{\frac{1}{2}}σX​=(H+W−11​i=1∑H​j=1∑M​(X(i,j)−μX​)2)21​
于是两幅图像的对比度对比函数
c(x,y)=2σxσy+C2σx2+σy2+C2c(x, y) = \frac{2\sigma_x\sigma_y+C_2}{\sigma_x^2+\sigma_y^2+C_2}c(x,y)=σx2​+σy2​+C2​2σx​σy​+C2​​

2.3 结构对比函数

结构对比函数
s(x,y)=σxy+C3σxσy+C3s(x,y) = \frac{\sigma_{xy}+C_3}{\sigma_x\sigma_y+C_3}s(x,y)=σx​σy​+C3​σxy​+C3​​

2.4 SSIM测量函数

最后, 以上三个对比函数构成了SSIM函数
SSIM(x,y)=f(l(x,y),c(x,y),s(x,y))=[l(x,y)]α[c(x,y)]β[s(x,y)]γ\begin{aligned} SSIM(x, y) &= f(l(x, y), c(x, y), s(x, y))\\ &= [l(x, y)]^{\alpha}[c(x, y)]^\beta [s(x, y)]^\gamma\\ \end{aligned} SSIM(x,y)​=f(l(x,y),c(x,y),s(x,y))=[l(x,y)]α[c(x,y)]β[s(x,y)]γ​
其中, α、β、γ>0\alpha 、\beta、\gamma >0α、β、γ>0 ,用来调整这三个模块的重要性
假设α、β、γ都为1\alpha 、\beta、\gamma 都为1α、β、γ都为1, C3=C2/2C_3 = C_2/2C3​=C2​/2 ,则
SSIM(x,y)=(2μxμy+C1)(2σxy+C2)(μx2+μy2+C1)(σx2+σy2+C2)SSIM(x, y) = \frac{(2\mu_x\mu_y+C_1)(2\sigma_{xy}+C_2)}{(\mu_x^2+\mu_y^2+C_1)(\sigma_x^2+\sigma_y^2+C_2)}SSIM(x,y)=(μx2​+μy2​+C1​)(σx2​+σy2​+C2​)(2μx​μy​+C1​)(2σxy​+C2​)​
SSIM函数的值域为[0, 1], 值越大说明图像失真越小,两幅图像越相似

2.5 SSIM函数满足的三个条件

  • 对称性:S(x,y)=S(y,x)S(x, y) = S(y, x)S(x,y)=S(y,x)
  • 有界性:S(x,y)≤1S(x, y) \le 1S(x,y)≤1
  • 最大值唯一性:当且仅当x=y时,S(x,y)=1S(x, y) = 1S(x,y)=1

三、MSSIM

在图像质量评估之中,局部求SSIM指数的效果要好于全局。第一,图像的统计特征通常在空间中分布不均;第二,图像的失真情况在空间中也是变化的;第三,在正常视距内,人们只能将视线聚焦在图像的一个区域内,所以局部处理更符合人类视觉系统的特点;第四,局部质量检测能得到图片空间质量变化的映射矩阵,结果可服务到其他应用中。

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

四、实现

import torch
import torch.nn.functional as F
from math import exp
import numpy as np# 创建一维高斯分布向量
def gaussian(window_size, sigma):gauss = torch.Tensor([exp(-(x-window_size//2)**2)/float(2*sigma**2) for x in range(window_size)])return gauss/gauss.sum()# 创建高斯核
def create_window(window_size, channel=1):# unqueeze(1) 在第二维上增加一个维度_1D_window = gaussian(window_size, 1.5).unsqueeze(1)# t() 转置_2D_window = _1D_window.mm(_1D_window.t()).float().unsqueeze(0).unsqueeze(0)window = _2D_window.expand(channel, 1, window_size, window_size).contiguous()return window# 计算ssim
# 采用归一化的高斯核来 代替计算像素的均值
def ssim(img1, img2, window, window_size, channel=1, size_average=True):(mu1 = F.conv2d(img1, window, padding=window_size//2, stride=1, groups=channel)mu2 = F.conv2d(img2, window, padding=window_size//2, stride=1, groups=channel)mu1_sq = mu1.pow(2)mu2_sq = mu2.pow(2)mu1_mu2 = mu1 *mu2sigma1_sq = F.conv2d(img1*img1, window, padding=window_size//2, stride=1, groups=channel) - mu1_sqsigma2_sq = F.conv2d(img2*img2, window, padding=window_size//2, stride=1, groups=channel) - mu2_sqsigma_12 = F.conv2d(img1*img2, window, padding=window_size//2, stride=1, groups=channel) - mu1_mu2c1 = 0.01 **2c2 = 0.03 **2ssim_map = (2*(mu1_mu2 +c1)*(2*sigma_12 + c2)) / ((mu1_sq + mu2 + c1)*(sigma1_sq + sigma2_sq + c2))if size_average:return ssim_map.mean()else:return ssim_map.mean(1).mean(1).mean(1)class SSIM(torch.nn.Module):def __init__(self, window_size=11, channel, size_average=True):super(SSIM, self).__init__()self.window_size = window_sizeself.size_average = size_averageself.channel = channelself.window = create_window(window_size, channel)def forward(self, img1, img2):(_, channel, _, _) = img1.size()if channel == self.channel and self.window.data.type() == img1.data.type():window = self.windowelse:window = create_window(self.window_size, channel)if img1.is_cuda:window.cuda(img1.get_device())window = window.type_as(img1)self.window = windowself.channel = channelreturn ssim(img1, img2, self.window, self.window_size, channel, self.size_average)

结构相似性(SSIM)原理及其实现相关推荐

  1. matlab snr mse,MATLAB 均方根误差MSE、两图像的信噪比SNR、峰值信噪比PSNR、结构相似性SSIM...

    今天的作业是求两幅图像的MSE.SNR.PSNR.SSIM.代码如下: clc; close all; X = imread('q1.tif');% 读取图像 Y=imread('q2.tif'); ...

  2. 图像增强评价指标学习之——结构相似性SSIM

    SSIM(structural similarity index),结构相似性,是一种衡量两幅图像相似度的指标.该指标首先由德州大学奥斯丁分校的图像和视频工程实验室(Laboratory for Im ...

  3. 【图像处理】——图像质量评价指标信噪比(PSNR)和结构相似性(SSIM)(含原理和Python代码)

    目录 一.信噪比(PSNR) 1.信噪比的原理与计算公式 2.Python常规代码实现PSNR计算 3.TensorFlow实现PSNR计算 4.skimage实现PSNR计算 5.三种方法计算的结果 ...

  4. SSIM(structural similarity index),结构相似性

    ssim算法原理 - 我们都不是神的孩子 - CSDN博客 http://blog.csdn.net/ecnu18918079120/article/details/60149864 一.结构相似性( ...

  5. 两种常用的全参考图像质量评价指标——峰值信噪比(PSNR)和结构相似性(SSIM)

    原文:https://blog.csdn.net/zjyruobing/article/details/49908979 1.PSNR(Peak Signal to Noise Ratio)峰值信噪比 ...

  6. ssim算法计算图片_图像质量评估算法 SSIM(结构相似性)

    SSIM的全称为structural similarity index,即为结构相似性,是一种衡量两幅图像相似度的指标.该指标首先由德州大学奥斯丁分校的图像和视频工程实验室(Laboratory fo ...

  7. 图像质量评估指标:PSNR / SSIM 原理及Python代码

    1. PSNR   PSNR(峰值信噪比,Peak Signal-to-Noise Ratio),用于衡量两张图像之间差异,例如压缩图像与原始图像,评估压缩图像质量:复原图像与ground truth ...

  8. 从千万级数据查询来聊一聊索引结构和数据库原理

    在日常工作中我们不可避免地会遇到慢SQL问题,比如笔者在之前的公司时会定期收到DBA彪哥发来的Oracle AWR报告,并特别提示我某条sql近阶段执行明显很慢,可能要优化一下等.对于这样的问题通常大 ...

  9. DNA复制体结构和工作原理首次被揭示

    来源:科学网 DNA是生命遗传信息的载体,它的复制是生命繁衍过程当中最重要的一步.关于DNA复制分子机制的研究一直是生命科学中最基本的问题之一.近日,美国国立卫生研究院杰出研究员杨薇的课题组揭示了DN ...

  10. 图像的评价指标之SSMI——结构相似性

    图像的评价指标之SSMI--结构相似性 文章目录: https://blog.csdn.net/chaipp0607/article/details/70158835 https://zhuanlan ...

最新文章

  1. 2、求100以内的素数之和。(20分)
  2. 重磅丨人工智能三年国家战略公布:8大领域要火!
  3. [Ms SQL] 基本創建、修改與刪除
  4. [LCS]启用WindowsMessenger5.0的调试日志功能来诊断登录LCS服务器
  5. Mockito测试void方法会引发异常
  6. 【S操作】轻松优雅库移植解决方案,arduino库移植应对方案
  7. 《XNA高级编程:Xbox 360和Windows》1-2
  8. GWT 2 Spring 3 JPA 2 Hibernate 3.5教程– Eclipse和Maven 2展示
  9. [转载] numpy用法(logical_and, nonzero,arange, reshape)
  10. 安装tensorflow时候报错ImportError: DLL load failed: 找不到指定的模块。Failed to load the native TensorFlow runtime.
  11. Qt5开发工具---常用Qt5开发工具(附下载地址)
  12. 账号通过邮箱找回密码功能设计
  13. docker使用国内加速器的正确姿势
  14. 每日内涵微信小程序-2-轮播图圆角
  15. 在使用tr的时候经常遇到的错误1
  16. 如何用阿里云服务器建立个人网站(针对新手)
  17. 学编程很枯燥?用Python制作3个小游戏,边玩边学(含源码)
  18. Apollo简单介绍
  19. mysql外网访问phpmyadmin_MYSQL如何用phpMyAdmin设置外部IP可以访问
  20. python可视化编程(pyQT designer)安装及入门教程

热门文章

  1. 大病保险试点6月底前覆盖全国
  2. Win7连接网络打印机步骤
  3. 介绍打印机脱机的四种恢复方法
  4. 美国地质勘探局官网(USGS)Landsat 8 OLI_TIRS 影像数据下载详解
  5. 超详细解析:Python输出水仙花数
  6. UltraCompare for Mac(文件内容对比神器)v22
  7. android 读写sd权限,android 读写sd卡的权限设置
  8. python大作业设计报告_python大作业.doc
  9. 三人行,必有我师焉。择其善者而从之,其不善者而改之。
  10. 笔记本无线上网的问题