SSIM(结构相似度算法)不同实现版本的差异
前言
最近用ssim测试图片画质损伤时,发现matlab自带ssim与之前一直使用的ssim计算得分有差异,故和同事开始确定差异所在。
不同的SSIM版本
这里提到不同的ssim版本主要基于matlab。如前言所述,主要分为2个实现。
- 版本1:Zhou Wang实现的版本(也是我之前一直用的版本),具体见:
滑铁卢大学:https://ece.uwaterloo.ca/~z70wang/research/ssim/
纽约大学:http://www.cns.nyu.edu/~lcv/ssim/ - 版本2:matlab2015-ssim(matlab从2014开始加入了ssim)
 
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版本
                        代码:
            ```js
filtRadius = ceil(radius3);
filtSize = 2filtRadius + 1;
if (N < 3)
gaussFilt = fspecial('gaussian',[filtSize filtSize],radius); % 2D mask
else
...% 3D mask
end
% 算子类型:gaussian(高斯)
% 模版尺寸:[filtSize filtSize],使用默认值计算后,为:11*11矩阵;
% 标准差:radius,默认值为:1.5;
% 以上参数皆可通过传参改变
```
	- <font color=#FF4500>**滤波模式**</font>
		- Zhou Wang版本:
                        使用互相关(correlation)
		- matlab版本:
                        使用卷积(convolution)
	- <font color=#FF4500>**边界填充方式**</font>
		- Zhou Wang版本:
                        边界通过填充0来扩展,例如:
                        
		- matlab版本:
                        通过复制外边界的值来扩展,例如:
                        
	- <font color=#FF4500>**结果矩阵**</font>
		- Zhou Wang版本
			只返回滤波时未使用边缘补 0 部分进行计算的结果部分(返回矩阵小于输入矩阵),例如:
                            
		- matlab版本
			与输入矩阵大小一致,例如:
                            
由于以上差异,<font color=#FF4500>导致了 Zhou Wang版ssim 与 matlab官方ssim 在计算结果上存在轻微差距</font>。
3. 2D与3D图片支持
- matlab官方的ssim,除了支持2D图片,外还支持3D图片;而Zhou Wang版本只支持2D图片。
 - 2D图片
ssim只支持对2D灰度图进行结构相似度计算,rgb图(彩图)需转换为灰度图才能计算(可调用rgb2gray进行转换)。 - 3D图片
3D图片现在在医疗领域用得较多:

在matlab2015中,如果直接读入rgb图(不转换为灰度)会被认为是3D图,这个比较坑爹,ssim运行不报错,但结果却是完全错的。 
SSIM(结构相似度算法)不同实现版本的差异的更多相关文章
- 文本相似度算法——空间向量模型的余弦算法和TF-IDF
		
1.信息检索中的重要发明TF-IDF TF-IDF是一种统计方法,TF-IDF的主要思想是,如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分 ...
 - 文本相似度 余弦值相似度算法 VS L氏编辑距离(动态规划)
		
设置n为字符串s的长度.("我是个小仙女") 设置m为字符串t的长度.("我不是个小仙女") 如果n等于0,返回m并退出.如果m等于0,返回n并退出.构造两个向 ...
 - python结巴分词余弦相似度算法实现
		
过余弦相似度算法计算两个字符串之间的相关度,来对关键词进行归类.重写标题.文章伪原创等功能, 让你目瞪口呆.以下案例使用的母词文件均为txt文件,两种格式:一种内容是纯关键词的txt,每行一个关键词就 ...
 - "如何用70行Java代码实现深度神经网络算法" 的delphi版本
		
http://blog.csdn.net/hustjoyboy/article/details/50721535 "如何用70行Java代码实现深度神经网络算法" 的delphi ...
 - Spark/Scala实现推荐系统中的相似度算法(欧几里得距离、皮尔逊相关系数、余弦相似度:附实现代码)
		
在推荐系统中,协同过滤算法是应用较多的,具体又主要划分为基于用户和基于物品的协同过滤算法,核心点就是基于"一个人"或"一件物品",根据这个人或物品所具有的属性, ...
 - elasticsearch算法之词项相似度算法(一)
		
一.词项相似度 elasticsearch支持拼写纠错,其建议词的获取就需要进行词项相似度的计算:今天我们来通过不同的距离算法来学习一下词项相似度算法: 二.数据准备 计算词项相似度,就需要首先将词项 ...
 - 10. 选主算法、多版本兼容性及滚动升级 | 深入浅出MGR
		
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 1. 选主算法 2. 多版本兼容性 3. MGR 5.7滚动升级至8.0 4. 小结 参考资料.文档 免责声明 文章 ...
 - git日志输出格式及两个版本之间差异列表
		
查看commit id git log --pretty=format:"%h" git log --pretty=format:"%H" 获取两个版本间差异的 ...
 - Android USER 版本与ENG 版本的差异--MTK官方解释
		
分类: Android(4) Description]Android USER 版本与ENG 版本的差异 [Keyword]USER ENG user eng 用户版本 工程版本 差异 [Solu ...
 
随机推荐
- 10、借助POI实现Java生成并打印excel报表(1)
			
10.1.了解 Apache POI 实际开发中,用到最多的是把数据库中数据导出生成报表,尤其是在生产管理或者财务系统中用的非常普遍.生成报表格式一般是EXCEL或者PDF .利用Apache PO ...
 - 张小龙的野心:用小程序重构web|小程序好处及可能的不足
			
一:张小龙的野心:用小程序重构web 一 很多年以前,张小龙写了一款软件:Foxmail. 这款软件当年有数百万用户,这是一个相当庞大的量,因为彼时网民也只有千万当量级的规模. 我是一个非常忠实的用户 ...
 - javaWeb学习总结(4)- HttpServletResponse
			
一.简介: Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象. request和response对象即然代表请求和 ...
 - 开涛spring3(3.4) - DI 之 3.4 Bean的作用域
			
3.4 Bean的作用域 什么是作用域呢?即“scope”,在面向对象程序设计中一般指对象或变量之间的可见范围.而在Spring容器中是指其创建的Bean对象相对于其他Bean对象的请求可见范围. ...
 - 元类(meta class)
			
元类(meta class),这个名字想必很多人都听过,网上也有很多关于元类的介绍,今天我就按照自己这两天的理解来简单探讨一下这个玩意,有误之处还望指出. 首先,下载objc源码,源码地址:https ...
 - jQuery对象的创建(一)
			
在jQuery的常规用法中,执行"$()"返回的是一个jQuery对象,在源码中,它是这样定义的: ... var jQuery = function() { return new ...
 - 读 Zepto 源码之集合元素查找
			
这篇依然是跟 dom 相关的方法,侧重点是跟集合元素查找相关的方法. 读Zepto源码系列文章已经放到了github上,欢迎star: reading-zepto 源码版本 本文阅读的源码为 zept ...
 - Javascript事件模型(一):DOM0事件和DOM2事件
			
javascript事件模型,本文主要有以下内容: DOM0事件模型 DOM2事件模型 一.DOM0事件模型 早期的事件模型称为DOM0级别. DOM0的事件具有极好的跨浏览器优势, 会以最快的速度 ...
 - php面向对象2
			
类与对象的区别和联系 通过 http://www.cnblogs.com/we-jack/p/object.html 和 http://www.cnblogs.com/we-jack/p/php.ht ...
 - 关于Eclipse+SVN 开发配置
			
入职快一个月,学的比较慢,但学的东西很多,受益匪浅.有时候真正意义上,感受到:代码使我快乐,我爱编程. 好久没有开笔,不知道说些什么,也不知道应该说什么. 但总觉得有些东西,很想说出来,不用理会他人的 ...