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

这篇具有很好参考价值的文章主要介绍了图像质量评估算法SSIM(结构相似性)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SSIM(structural similarity index)

由于最近在阅读图像超分辨率方面的RCAN论文,里面涉及到了两幅图像之间的相似性,所以就引入了这个指标,并最终使用pyhton进行实现。结构相似性,是一种衡量两幅图像相似度的指标。该指标首先由德州大学奥斯丁分校的图像和视频工程实验室(Laboratory for Image and Video Engineering)提出。而如果两幅图像是压缩前和压缩后的图像,那么SSIM算法就可以用来评估压缩后的图像质量。本文着重在于代码实现SSIM函数,而该算法的原理以及为什么需要高斯核函数作为模板的权值并不关心,如果需要的话可以在文章的后面大的连接里面自行阅读。

如何计算结构相似性

在计算两幅图像的结构相似性,需要高斯模板用来作为一个像素区域的概率值,进而计算得到某个区域的像素平均值,标准差,方差和协方差等概念。除此之外给出一组公式用来计算SSIM:
L ( X , Y ) = 2 μ X μ Y + C 1 μ X 2 + μ Y 2 + C 1 L(X,Y) = \frac{2\mu_X \mu_Y+C_1}{\mu_X^2 + \mu_Y^2+C1} L(X,Y)=μX2+μY2+C12μXμY+C1
C ( X , Y ) = 2 σ X σ Y + C 2 σ 2 2 + σ Y 2 + C 2 C(X,Y) = \frac{2\sigma_X\sigma_Y+C_2}{\sigma_2^2+\sigma_Y^2+C_2} C(X,Y)=σ22+σY2+C22σXσY+C2
S ( X , Y ) = σ X Y + C 3 σ X σ Y + C 3 S(X,Y) = \frac{\sigma_{XY+C_3}}{\sigma_X\sigma_Y+C3} S(X,Y)=σXσY+C3σXY+C3
当里面的参数 C 3 = C 2 / 2 C_3 = C_2/2 C3=C2/2 S S I M ( X , Y ) 也 可 以 写 成 下 面 的 式 子 SSIM(X,Y)也可以写成下面的式子 SSIM(X,Y)
S S I M ( X , Y ) = L ( X , Y ) C ( X , Y ) S ( X , Y ) = 2 μ X μ Y + C 1 μ X 2 + μ Y 2 + C 1 ∗ 2 σ X Y + C 2 σ 2 2 + σ Y 2 + C 2 SSIM(X,Y) = L(X,Y)C(X,Y)S(X,Y)=\frac{2\mu_X \mu_Y+C_1}{\mu_X^2 + \mu_Y^2+C1}* \frac{2\sigma_{XY}+C_2}{\sigma_2^2+\sigma_Y^2+C_2} SSIM(X,Y)=L(X,Y)C(X,Y)S(X,Y)=μX2+μY2+C12μXμY+C1σ22+σY2+C22σXY+C2
里面的 μ X 、 σ X \mu_X、\sigma_X μXσX分别代表X这幅图片里面的均值。
下面用图示的方式演示涌口滑动的过程:
ssim,深度学习,opencv,机器学习,算法,计算机视觉,概率论
上图的左边是高斯核尺寸是 ( 2 k + 1 ) ∗ ( 2 k + 1 ) (2k+1)*(2k+1) (2k+1)(2k+1),加入我们将要从图片的第 ( i , j ) (i,j) (i,j)个位置与高斯核进行运算(如果熟悉卷积神经网络的话大家肯定就很快就可以理解)。然后我们使用高斯模块在整个图像上移动得到一个SSIM_MAP,其尺寸就是 ( w − 2 k ) ∗ ( d − 2 k ) (w-2k)*(d-2k) (w2k)(d2k)

高斯核的实现

按照前人的做法是使用一个 ( 2 k + 1 ) ∗ ( 2 k + 1 ) (2k+1)*(2k+1) (2k+1)(2k+1)的高斯模板滑动整个图像得到一个SSIM_MAP之后再计算其平均值作为两幅图像的SSIM。这里需要强调的是区域里面的每个像素出现的概率是符合高斯分布的,而不是均匀分布。故我们首先要设计一个高斯核函数确定权重,计算公式如下:
K ( i , j ) = 1 2 π σ 2 e x p − ( i − k ) 2 + ( j − k ) 2 2 π σ 2 , 0 ≤ i , j ≤ 2 k K(i,j) = \frac{1}{2\pi\sigma^2}exp^{-\frac{(i-k)^2+(j-k)^2}{2\pi\sigma^2}}, 0 \le i,j \le2k K(i,j)=2πσ21exp2πσ2(ik)2+(jk)2,0i,j2k

区域平均值实现

由于区域里面的每个点具有不同的权重,在这里我们认为从图片的 ( i , j ) (i,j) (i,j)点开始与高斯核匹配的的平均值是:
μ X ( i , j ) = Σ m = 0 m = 2 k Σ n = 0 n = 2 k k ( m , n ) X ( i + m , j + n ) \mu_X(i,j) = \Sigma_{m=0}^{m=2k}\Sigma_{n=0}^{n=2k}k(m,n)X(i+m,j+n) μX(i,j)=Σm=0m=2kΣn=0n=2kk(m,n)X(i+m,j+n)

区域方差实现

根据方差的公式我们写作:
σ X 2 ( i , j ) = Σ m = 0 m = 2 k Σ n = 0 n = 2 k k ( m , n ) ( X ( i + m , j + n ) − μ X ( i , j ) ) 2 = Σ m = 0 m = 2 k Σ n = 0 n = 2 k k ( m , n ) ( X ( i + m , j + n ) 2 − 2 X ( i + m , j + n ) μ X ( i , j ) 2 + μ X 2 ( i , j ) = Σ m = 0 m = 2 k Σ n = 0 n = 2 k k ( m , n ) X ( i + m , j + n ) 2 − μ X 2 ( i , j ) \sigma_X^2(i,j) = \Sigma_{m=0}^{m=2k}\Sigma_{n=0}^{n=2k}k(m,n)(X(i+m,j+n)-\mu_X(i,j))^2 \\=\Sigma_{m=0}^{m=2k}\Sigma_{n=0}^{n=2k}k(m,n)(X(i+m,j+n)^2-2X(i+m,j+n)\mu_X(i,j)^2+\mu_X^2(i,j) \\=\Sigma_{m=0}^{m=2k}\Sigma_{n=0}^{n=2k}k(m,n)X(i+m,j+n)^2-\mu_X^2(i,j) σX2(i,j)=Σm=0m=2kΣn=0n=2kk(m,n)(X(i+m,j+n)μX(i,j))2=Σm=0m=2kΣn=0n=2kk(m,n)(X(i+m,j+n)22X(i+m,j+n)μX(i,j)2+μX2(i,j)=Σm=0m=2kΣn=0n=2kk(m,n)X(i+m,j+n)2μX2(i,j)

区域协方差实现

协方差公式:
σ X , Y = Σ m = 0 m = 2 k Σ n = 0 n = 2 k k ( m , n ) ( X ( i + m , j + n ) − μ X ( i , j ) ) ( Y ( i + m , j + n ) − μ Y ( i , j ) ) = Σ m = 0 m = 2 k Σ n = 0 n = 2 k k ( m , n ) X ( i + m , j + n ) Y ( i + m , j + n ) − μ X ( i , j ) μ Y ( i , j ) \sigma_{X,Y} = \Sigma_{m=0}^{m=2k}\Sigma_{n=0}^{n=2k}k(m,n)(X(i+m,j+n)-\mu_X(i,j))(Y(i+m,j+n)-\mu_Y(i,j))\\ = \Sigma_{m=0}^{m=2k}\Sigma_{n=0}^{n=2k}k(m,n)X(i+m,j+n)Y(i+m,j+n) - \mu_X(i,j)\mu_Y(i,j) σX,Y=Σm=0m=2kΣn=0n=2kk(m,n)(X(i+m,j+n)μX(i,j))(Y(i+m,j+n)μY(i,j))=Σm=0m=2kΣn=0n=2kk(m,n)X(i+m,j+n)Y(i+m,j+n)μX(i,j)μY(i,j)

代码实现

由于上面的几部分已经将SSIM公式里面的参数计算出来了,下面就是我基于自己的理解编写出来的代码:

import numpy as np
import cv2

def getres(img, kernel, i,j):
    k_w, k_d = kernel.shape
    res = np.sum(img[i:i+k_w, j:j+k_d]*kernel)
    return res

def conv2d(img, kernel):
    img_w, img_d = img.shape
    k_w, k_d = kernel.shape
    res = [[getres(img, kernel, i,j) for j in range(img_d-k_d+1)] for i in range(img_w-k_w+1)]
    return np.array(res, dtype=np.float32)

def ssim(img1=None, img2=None, k=11, sigma=1.5):  #输入的图片是三通道的rgb图片格式为uint8
    if img1.shape != img2.shape:
        print("the shape of the two image is different, please check!!!")
        return None
    if k <= 5 and k%2 == 0:
        print("the kernel size is small or odd!!!")
        return None
    if sigma <= 0:
        print("the sigma can not be 0 or less 0!!!")
        return None
    
    img1 = cv2.cvtColor(img1, cv2.COLOR_RGB2YCR_CB)[:,:,0].astype(np.float32)
    img2 = cv2.cvtColor(img2, cv2.COLOR_RGB2YCR_CB)[:,:,0].astype(np.float32)
    c1 = (0.01*255)**2
    c2 = (0.03*255)**2
    filter = [[ ((i-k//2)*(i-k//2) + (j-k//2)*(j-k//2))/(-2*sigma*sigma) for j in range(k)] for i in range(k)]
    filter = np.array(np.exp(filter), dtype=np.float32)
    filter = filter / np.sum(filter)

    mu1 = conv2d(img1, filter)
    mu2 = conv2d(img2, filter)
    mu1_sq = mu1 * mu1
    mu2_sq = mu2 * mu2
    mu1_mu2 = mu1 * mu2
    sigma1_sq = conv2d(img1*img1, filter) - mu1_sq
    sigma2_sq = conv2d(img2*img2, filter) - mu2_sq
    sigma12 = conv2d(img1*img2, filter) - mu1_mu2

    ssim_map = (2*mu1_mu2 +c1)*(2*sigma12+c2) / (mu1_sq + mu2_sq + c2) / (sigma1_sq + sigma2_sq + c2)
    return np.mean(ssim_map)

代码使用

如果大家只是为了使用函数得到两幅图像之间的SSIM,那么简单来说就是先读取图像,并且将图片的通道转化为RGB模式,这个原因是因为我在代码里面将图片转化为YCBCR并且仅计算Y通道上的SSIM。这里的计算方式是参照RCAN论文所述。

#首先读取两张图片,因为opencv是按照BGR读入的所以我就先进行了color的cvt。
#要是引用的该函数的话只用调用ssim(x,y)即可,里面的其他变量我已经在函数里面设置好了。
#可以更改的就是高斯核的大小即参数k, 已经高斯核的标准差sigma
img1 = cv2.imread("D:/microsoft/RCAN-master/RCAN_TestCode/HR/B100/x4/3096_HR_x4.png")
img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
img2 = img1
ssim(img1, img2)

引用

图像质量评估算法 SSIM(结构相似性)
今天终于弄清楚了fspecial(‘gaussian’,3,1.8)怎么算的了

附加资料

Residual Channel Attention Networks即RCAN差分辨率网络
SSIM百度百科文章来源地址https://www.toymoban.com/news/detail-799818.html

到了这里,关于图像质量评估算法SSIM(结构相似性)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【2023华中杯数学建模】B 题 小学数学应用题相似性度量及难度评估详细建模方案及实现代码

    更新时间:2023-5-1 14:00 B 题 小学数学应用题相似性度量及难度评估 某 MOOC 在线教育平台希望能够进行个性化教学,实现用户自主学习。在用户学习时,系统从题库中随机抽取若干道与例题同步的随堂测试题,记录、分析学生的学习和答题信息,并且课后会自动生成作业题(或

    2024年02月06日
    浏览(42)
  • 图像检索技术研究:深度度量与深度散列在相似性学习中的应用比较与实践 - 使用Python与Jupyter环境

    引言 在计算机视觉领域,图像检索是一个长期存在并持续受到研究者关注的重要话题。随着大数据时代的到来,如何高效、准确地从海量数据中检索到相似的图像成为一个巨大的挑战。传统的检索方法在大数据环境下表现不佳,而深度学习技术的崛起为图像检索带来了新的机

    2024年02月12日
    浏览(34)
  • 照片相似性搜索引擎Embed-Photos;赋予大型语言模型(LLMs)视频和音频理解能力;OOTDiffusion的基础上可控制的服装驱动图像合成

    ✨ 1: Magic Clothing Magic Clothing是一个以可控制的服装驱动图像合成为核心的技术项目,建立在OOTDiffusion的基础上 Magic Clothing是一个以可控制的服装驱动图像合成为核心的技术项目,建立在OOTDiffusion的基础上。通过使用Magic Clothing,可以在不同的场景下达到根据服装设计或者需求

    2024年04月26日
    浏览(27)
  • 常见的相似性度量方法

    有如下几种计算相似性方法: X ⋅ Y = ∣ X ∣ ∣ Y ∣ c o s θ = ∑ i = 1 n x i ∗ y i begin{aligned} X cdot Y = |X||Y|costheta \\\\ = sum_{i=1}^n x_i * y_i end{aligned} X ⋅ Y ​ = ∣ X ∣∣ Y ∣ cos θ = i = 1 ∑ n ​ x i ​ ∗ y i ​ ​ 向量内积的结果是没有界限的,解决办法就是先归一化再相乘,就是

    2024年02月14日
    浏览(39)
  • 矩阵的相似性度量的常用方法

    1,欧氏距离 欧式距离是最易于理解的一种距离计算方法,源自欧式空间中两点间的距离公式。 (1)二维平面上的点 a ( x 1 , y 1 ) a(x_1,y_1) a ( x 1 ​ , y 1 ​ ) 和点 b ( x 2 , y 2 ) b(x_2,y_2) b ( x 2 ​ , y 2 ​ ) 的欧式距离为 d = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 d=sqrt{(x_1-x_2)^2+(y_1-y_2)^2} d = (

    2024年02月07日
    浏览(36)
  • 如何计算2个矩阵的相似性?

    如下图所示,如何计算功能连接和结构连接的矩阵相似性? 原理 :把结构矩阵或者功能连接矩阵的上三角矩阵提取出来,然后利用squeeze把上三角矩阵转化为一列,然后计算相关性。 皮尔逊相关系数公式实际上就是在计算夹角余弦之前将两个向量减去各个样本的平均值,达到

    2024年02月13日
    浏览(40)
  • 相似性和相异性的度量

    相似度(Similarity): 两个数据对象相似程度的数值度量; 对象越相似,值越高; 通常在[0, 1]区间取值。 有时候相似度的取值范围可能在[-1, 1]之间,这时正负号包含了一定信息,这种情况下可以保留其符号,而非强行转换到[0, 1]之间。 相异度(Dissimilarity): 两个对象不同

    2024年02月07日
    浏览(37)
  • 相似性搜索:第 7 部分--LSH 组合物

    Vyacheslav Efimov – Medium S 相似性搜索 是一个问题,给定一个查询,目标是在所有数据库文档中找到与其最相似的文档。         在数据科学中,相似性搜索经常出现在 NLP 领域、搜索引擎或推荐系统中,其中需要检索最相关的文档或项目以进行查询。有多种不同的方法可以

    2024年02月07日
    浏览(35)
  • 安全研究 # 二进制代码相似性检测综述

    本文参考: [1]方磊,武泽慧,魏强.二进制代码相似性检测技术综述[J].计算机科学,2021,48(05):1-8. (信息工程大学数学工程与先进计算国家重点实验室, 国家重点研发课题,北大核心) 代码相似性检测常用于 代码预测 、 知识产权保护 和 漏洞搜索 等领域,可分为 源代码相似性检测

    2024年02月02日
    浏览(33)
  • 相似性度量(距离度量)方法(一):基本种类与公式

    相似性度量(或距离度量)方法在多元统计中的聚类分析、判别分析中的距离判别法、泛函分析、机器学习等方面都有应用。所以对于数据分析、机器学习等方面,掌握相似性的不同度量方法是十分重要且必要的。 相似性度量与距离度量本质上是同一件事情。如果两组数据之

    2024年01月24日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包