SSIM(结构相似度算法)不同实现版本的差异

简介:

前言

最近用ssim测试图片画质损伤时,发现matlab自带ssim与之前一直使用的ssim计算得分有差异,故和同事开始确定差异所在。

不同的SSIM版本

这里提到不同的ssim版本主要基于matlab。如前言所述,主要分为2个实现。

2个版本的差异

虽然2个版本的代码实现完全不一样,但总的说,差异可以归结为以下几点:

1. downsample

  • Zhou Wang实现版本有downsample,他也推荐这么做,原因如下:

The precisely right scale depends on both the image resolution and the viewing distance and is usually difficult to be obtained. In practice, we suggest to use the following empirical formula to determine the scale for images viewed from a typical distance (say 3~5 times of the image height or width): 1) Let F = max(1, round(N/256)), where N is the number of pixels in image height (or width); 2) Average local F by F pixels and then downsample the image by a factor of F; and 3) apply the ssim_index.m program. For example, for an 512 by 512 image, F = max(1, round(512/256)) = 2, so the image should be averaged within a 2 by 2 window and downsampled by a factor of 2 before applying ssim_index.m.

上面这段意思:人看图片时,与图片有一定距离(相当于图片缩小),一些细节可被忽略,如果进行downsample,除了减低运算复杂度,还能更贴合人的主观观看感受。

  • 涉及downsample的代码部分:

    % automatic downsampling
    f = max(1,round(min(M,N)/256));
    
    %downsampling by f
    %use a simple low-pass filter 
    if(f>1)
        lpf = ones(f,f);
        lpf = lpf/sum(lpf(:));
        img1 = imfilter(img1,lpf,'symmetric','same');
        img2 = imfilter(img2,lpf,'symmetric','same');
        img1 = img1(1:f:end,1:f:end);
        img2 = img2(1:f:end,1:f:end);
    end


  • 由于Zhou Wang版ssim对比时,原图与失真图都做了downsample(缩小),其产生的影响是:
    • downsample后的相似度 比 不做downsample的相似度 要高
    • 损失程度不同2张失真图,在downsample后进行ssim,2者相似度差距减少
    downsample是导致 Zhou Wang版本 与 matlab官方版本 计算结果相差较大的主要原因。 而大学官网上其实也提供了Zhou Wang实现的非downsample版本,只不过名字是: ssim_index.m。

2. 滤波部分

  • Zhou Wang版本去掉downsample后,和matlab官方的结果还有约±0.002差距,其原因主要是滤波部分存在差异。
    • 滤波参数:
      • 输入矩阵(图像)
        • 这个是我们传入的,不存差异;
      • 滤波掩模
        • Zhou Wang版本
          代码:

          window = fspecial('gaussian', 11, 1.5);
          % 算子类型:gaussian(高斯)
          % 模版尺寸:11*11
          % 标准差:1.5
          % 以上参数皆hardcode
        • matlab版本
          代码:

          filtRadius = ceil(radius*3);
          filtSize = 2*filtRadius + 1;
          if (N < 3)
          gaussFilt = fspecial('gaussian',[filtSize filtSize],radius); % 2D mask
          else 
          ...% 3D mask
          end
          % 算子类型:gaussian(高斯)
          % 模版尺寸:[filtSize filtSize],使用默认值计算后,为:11*11矩阵;
          % 标准差:radius,默认值为:1.5% 以上参数皆可通过传参改变
      • 滤波模式
        • Zhou Wang版本:
          使用互相关(correlation)
        • matlab版本:
          使用卷积(convolution)
      • 边界填充方式
        • Zhou Wang版本:
          边界通过填充0来扩展,例如:
        • matlab版本:
          通过复制外边界的值来扩展,例如:
      • 结果矩阵
        • Zhou Wang版本
          只返回滤波时未使用边缘补 0 部分进行计算的结果部分(返回矩阵小于输入矩阵),例如:
        • matlab版本
          与输入矩阵大小一致,例如:
    由于以上差异,导致了 Zhou Wang版ssim 与 matlab官方ssim 在计算结果上存在轻微差距

3. 2D与3D图片支持

  • matlab官方的ssim,除了支持2D图片,外还支持3D图片;而Zhou Wang版本只支持2D图片。
  • 2D图片
    ssim只支持对2D灰度图进行结构相似度计算,rgb图(彩图)需转换为灰度图才能计算(可调用rgb2gray进行转换)。
  • 3D图片
    3D图片现在在医疗领域用得较多:

    在matlab2015中,如果直接读入rgb图(不转换为灰度)会被认为是3D图,这个比较坑爹,ssim运行不报错,但结果却是完全错的。



本文转自hyddd博客园博客,原文链接:http://www.cnblogs.com/hyddd/p/7132187.html,如需转载请自行联系原作者。

目录
相关文章
|
21天前
|
存储 缓存 算法
通过优化算法和代码结构来提升易语言程序的执行效率
通过优化算法和代码结构来提升易语言程序的执行效率
|
1月前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
41 3
|
2月前
|
存储 缓存 算法
如何通过优化算法和代码结构来提升易语言程序的执行效率?
如何通过优化算法和代码结构来提升易语言程序的执行效率?
|
3月前
|
存储 算法 大数据
Apriori算法和Eclat算法差异
Apriori算法和Eclat算法差异
|
3月前
|
算法 计算机视觉
Mat未初始化引起拼接算法结果,release版本和debug版本不一致
在OpenCV中由于Mat对象未初始化导致的拼接算法在release版本和debug版本中结果不一致的问题,并提供了通过显式初始化Mat对象为零来解决这一问题的修改方法。
|
5月前
|
算法
Bully、Raft、Zab选举算法的差异比较
Bully算法、Raft算法、Zab的差与异。他们如何脱胎于Paxos而成?
|
4月前
|
机器学习/深度学习 算法 文件存储
【博士每天一篇文献-算法】 PNN网络启发的神经网络结构搜索算法Progressive neural architecture search
本文提出了一种名为渐进式神经架构搜索(Progressive Neural Architecture Search, PNAS)的方法,它使用顺序模型优化策略和替代模型来逐步搜索并优化卷积神经网络结构,从而提高了搜索效率并减少了训练成本。
59 9
|
4月前
|
算法 关系型数据库 MySQL
揭秘MySQL中的版本号排序:这个超级算法将颠覆你的排序世界!
【8月更文挑战第8天】在软件开发与数据管理中,正确排序版本号对软件更新及数据分析至关重要。因MySQL默认按字符串排序版本号,可能出现&#39;1.20.0&#39;在&#39;1.10.0&#39;之前的不合理情况。解决办法是将版本号各部分转换为整数后排序。例如,使用`SUBSTRING_INDEX`和`CAST`函数从`software`表的`version`字段提取并转换版本号,再按这些整数排序。这种方法可确保版本号按逻辑正确排序,适用于&#39;major.minor.patch&#39;格式的版本号。对于更复杂格式,需调整处理逻辑。掌握此技巧可有效应对版本号排序需求。
204 3
|
5月前
|
算法 JavaScript 前端开发
深入了解Vue2和Vue3的Diff算法差异!
总的来说,Vue3在Diff算法上的优化体现了更智能的静态内容处理、更高效的动态内容更新以及更灵活的内部结构。这些优化使得Vue3在运行时性能上有了显著的提升,尤其是在大型应用和复杂界面的场景下。通过不断地技术迭代和优化,Vue3为开发者提供了更高效、更易用的前端开发体验。
386 6
|
5月前
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
299 1