在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发送伪造的arp请求
Jan 09 Python
python脚本实现统计日志文件中的ip访问次数代码分享
Aug 06 Python
浅谈Python的异常处理
Jun 19 Python
Python实现在线音乐播放器
Mar 03 Python
Python之Scrapy爬虫框架安装及使用详解
Nov 16 Python
Python简单实现socket信息发送与监听功能示例
Jan 03 Python
python更改已存在excel文件的方法
May 03 Python
python学习开发mock接口
Apr 28 Python
Django中间件基础用法详解
Jul 18 Python
Python函数参数分类原理详解
May 28 Python
python删除文件、清空目录的实现方法
Sep 23 Python
python使用re模块爬取豆瓣Top250电影
Oct 20 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 empty函数 使用说明
2009/08/10 PHP
PHP上传图片进行等比缩放可增加水印功能
2014/01/13 PHP
如何使用php脚本给html中引用的js和css路径打上版本号
2015/11/18 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
2015/12/31 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
2019/05/21 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
2020/06/02 PHP
限制文本字节数js代码
2007/03/06 Javascript
仿jQuery的siblings效果的js代码
2011/08/09 Javascript
jQuery选择器源码解读(一):Sizzle方法
2015/03/31 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
2015/10/10 Javascript
JS实现表单多文件上传样式美化支持选中文件后删除相关项
2016/09/30 Javascript
js中DOM三级列表(代码分享)
2017/03/20 Javascript
Webpack中css-loader和less-loader的使用教程
2017/04/27 Javascript
Javascript中将变量转换为字符串的三种方法
2017/09/19 Javascript
详解html-webpack-plugin用法全解
2018/01/22 Javascript
JS删除数组里的某个元素方法
2018/02/03 Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
2019/05/31 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
基于JavaScript实现猜数字游戏代码实例
2020/07/30 Javascript
vue 函数调用加括号与不加括号的区别
2020/10/29 Javascript
Python编程之变量赋值操作实例分析
2017/07/24 Python
OpenCV 边缘检测
2019/07/10 Python
使用Python制作一个打字训练小工具
2019/10/01 Python
pytorch 实现模型不同层设置不同的学习率方式
2020/01/06 Python
CSS3对图片照片进行边缘模糊处理的实现
2018/08/08 HTML / CSS
使用CSS3的ruby-position固定注音位置的用法示例
2016/07/05 HTML / CSS
HTML5新特性 多线程(Worker SharedWorker)
2017/04/24 HTML / CSS
html2canvas截图空白问题的解决
2020/03/24 HTML / CSS
应届毕业生个人自我评价
2013/09/20 职场文书
酒店管理专业学生求职信
2013/09/27 职场文书
办公室文员工作自我评价
2013/12/01 职场文书
综合办公室主任职责
2013/12/16 职场文书
欢迎横幅标语
2014/06/17 职场文书
暑假生活随笔
2015/08/15 职场文书
Java使用httpRequest+Jsoup爬取红蓝球号码
2021/07/02 Java/Android
java设计模式--三种工厂模式详解
2021/07/21 Java/Android