在python中计算ssim的方法(与Matlab结果一致)


Posted in Python onDecember 19, 2019

如下代码可以计算输入的两张图像的结构相似度(SSIM),结果与matlab计算结果一致

// An highlighted block
import cv2
import numpy as np
def ssim(img1, img2):
  C1 = (0.01 * 255)**2
  C2 = (0.03 * 255)**2
  img1 = img1.astype(np.float64)
  img2 = img2.astype(np.float64)
  kernel = cv2.getGaussianKernel(11, 1.5)
  window = np.outer(kernel, kernel.transpose())
  mu1 = cv2.filter2D(img1, -1, window)[5:-5, 5:-5] # valid
  mu2 = cv2.filter2D(img2, -1, window)[5:-5, 5:-5]
  mu1_sq = mu1**2
  mu2_sq = mu2**2
  mu1_mu2 = mu1 * mu2
  sigma1_sq = cv2.filter2D(img1**2, -1, window)[5:-5, 5:-5] - mu1_sq
  sigma2_sq = cv2.filter2D(img2**2, -1, window)[5:-5, 5:-5] - mu2_sq
  sigma12 = cv2.filter2D(img1 * img2, -1, window)[5:-5, 5:-5] - mu1_mu2
  ssim_map = ((2 * mu1_mu2 + C1) * (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) *
                              (sigma1_sq + sigma2_sq + C2))
  return ssim_map.mean()
def calculate_ssim(img1, img2):
  '''calculate SSIM
  the same outputs as MATLAB's
  img1, img2: [0, 255]
  '''
  if not img1.shape == img2.shape:
    raise ValueError('Input images must have the same dimensions.')
  if img1.ndim == 2:
    return ssim(img1, img2)
  elif img1.ndim == 3:
    if img1.shape[2] == 3:
      ssims = []
      for i in range(3):
        ssims.append(ssim(img1, img2))
      return np.array(ssims).mean()
    elif img1.shape[2] == 1:
      return ssim(np.squeeze(img1), np.squeeze(img2))
  else:
    raise ValueError('Wrong input image dimensions.')

img1 = cv2.imread("Test2_HR.bmp", 0)
img2 = cv2.imread("Test2_LR2.bmp", 0)
ss = calculate_ssim(img1, img2)
print(ss)

总结

以上所述是小编给大家介绍的在python中计算ssim的方法(与Matlab结果一致),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python 的 Socket 编程
Mar 24 Python
Flask框架的学习指南之制作简单blog系统
Nov 20 Python
R语言 vs Python对比:数据分析哪家强?
Nov 17 Python
python提取图像的名字*.jpg到txt文本的方法
May 10 Python
Python Tkinter模块实现时钟功能应用示例
Jul 23 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
Apr 15 Python
Python发展简史 Python来历
May 14 Python
Python 实现遥感影像波段组合的示例代码
Aug 04 Python
适合Python初学者的一些编程技巧
Feb 12 Python
python 匿名函数与三元运算学习笔记
Oct 23 Python
matplotlib事件处理基础(事件绑定、事件属性)
Feb 03 Python
Python OpenCV实现传统图片格式与base64转换
Jun 13 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
Dec 19 #Python
Python命令行click参数用法解析
Dec 19 #Python
python3 常见解密加密算法实例分析【base64、MD5等】
Dec 19 #Python
Python定义函数时参数有默认值问题解决
Dec 19 #Python
Python爬取腾讯视频评论的思路详解
Dec 19 #Python
使用Pandas将inf, nan转化成特定的值
Dec 19 #Python
pandas中read_csv的缺失值处理方式
Dec 19 #Python
You might like
PHP中使用asort进行中文排序失效的问题处理
2014/08/18 PHP
使用PHP如何实现高效安全的ftp服务器(二)
2015/12/30 PHP
php实现无限级分类查询(递归、非递归)
2016/03/10 PHP
PHP中session跨子域的三种实现方法
2016/07/25 PHP
基于Swoole实现PHP与websocket聊天室
2016/08/03 PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
2017/08/11 PHP
学习jquery必备 api中英文对照的chm手册 下载
2007/05/03 Javascript
JavaScript 错误处理与调试经验总结
2010/08/10 Javascript
Jquery Ajax xmlhttp请求成功问题
2015/02/04 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
2015/02/25 Javascript
原生javascript实现addClass,removeClass,hasClass函数
2016/02/25 Javascript
浅析Javascript中bind()方法的使用与实现
2016/04/29 Javascript
JavaScript新增样式规则(推荐)
2016/07/19 Javascript
JSON与XML的区别对比及案例应用
2016/11/11 Javascript
JS实现页面中所有img对象添加onclick事件及新窗口查看图片的方法
2016/12/27 Javascript
IntersectionObserver实现图片懒加载的示例
2017/09/29 Javascript
用 Vue.js 递归组件实现可折叠的树形菜单(demo)
2017/12/25 Javascript
使用vue-router beforEach实现判断用户登录跳转路由筛选功能
2018/06/25 Javascript
ES6知识点整理之对象解构赋值应用示例
2019/04/17 Javascript
详解VSCode配置启动Vue项目
2019/05/14 Javascript
vue+element实现表单校验功能
2019/05/20 Javascript
vue子路由跳转实现tab选项卡
2019/07/24 Javascript
Vue 一键清空表单的实现方法
2020/02/07 Javascript
Python单元测试框架unittest简明使用实例
2015/04/13 Python
解决python3 json数据包含中文的读写问题
2018/05/10 Python
Python如何使用OS模块调用cmd
2020/02/27 Python
基于django micro搭建网站实现加水印功能
2020/05/22 Python
为智能设备设计个性化保护套网站:caseable
2017/01/05 全球购物
异常和异常类的概念
2014/09/12 面试题
仓库管理员岗位职责
2014/03/19 职场文书
超市商业计划书
2014/05/04 职场文书
环境卫生整治简报
2015/07/20 职场文书
2015年信息化建设工作总结
2015/07/23 职场文书
用python实现监控视频人数统计
2021/05/21 Python
python3实现常见的排序算法(示例代码)
2021/07/04 Python
TS 类型收窄教程示例详解
2022/09/23 Javascript