import cv2
import numpy as np
import mathdef psnr(target, ref):#将图像格式转为float64target_data = np.array(target, dtype=np.float64)ref_data = np.array(ref,dtype=np.float64)# 直接相减,求差值diff = ref_data - target_data# 按第三个通道顺序把三维矩阵拉平diff = diff.flatten('C')# 计算MSE值rmse = math.sqrt(np.mean(diff ** 2.))# 精度eps = np.finfo(np.float64).epsif(rmse == 0):rmse = epsreturn 20*math.log10(255.0/rmse)# 计算单通道图像
IMG_1 = cv2.imread("yuer.jpg",0)
IMG_2 = cv2.imread("june.jpg",0)# 计算三通道图像(假如输入的是三通道图像的话)
# IMG_1 = cv2.imread("yuer.jpg")
# IMG_2 = cv2.imread("june.jpg")# 这里resize是因为我使用的两张图大小不一样,所以resize到同样的大小
# 正常情况下待计算psnr的两张图一般是相同大小的,不需要resize
# 而且大小不同的两张图,resize后求得的psnr也没有啥意义
IMG_1 = np.resize(IMG_1, (100,100))
IMG_2 = np.resize(IMG_2, (100,100))print(psnr(IMG_1,IMG_2))

python计算psnr的时候可能会出现和其他方法计算出的psnr结果不同,相差比较大,这种情况一般是因为python里面的unit8和float数据类型造成的,把图片数据先转成float类型的再计算,一般不会出错。

另外,假如两个人算的psnr不同,但误差不大不小,差个一两dB,不是特别夸张的情况下,有可能是其中一个是按三通道计算的,另一个是按照单通道计算的。

这些都是容易忽略的坑,特此记录一下。

//输入格式是Mat类型,I1,I2代表是输入的两幅图像
double getPSNR(const Mat& I1, const Mat& I2)
{Mat s1;absdiff(I1, I2, s1);       // |I1 - I2|AbsDiff函数是 OpenCV 中计算两个数组差的绝对值的函数s1.convertTo(s1, CV_32F);  // 这里我们使用的CV_32F来计算,因为8位无符号char是不能进行平方计算s1 = s1.mul(s1);           // |I1 - I2|^2Scalar s = sum(s1);         //对每一个通道进行加和double sse = s.val[0] + s.val[1] + s.val[2]; // sum channelsif (sse <= 1e-10) // 对于非常小的值我们将约等于0return 0;else{double  mse = sse / (double)(I1.channels() * I1.total());//计算MSEdouble psnr = 10.0 * log10((255 * 255) / mse);return psnr;//返回PSNR}
}int main()
{//先定义PSNRdouble psnr;//然后读取输入的两幅图像Mat img1 = imread("101.jpg");Mat img2 = imread("103.jpg");//调用函数psnr = getPSNR(img1, img2);cout << psnr << endl;
}

python/c++计算psnr相关推荐

  1. 使用OpenCV和Python高效计算视频的总帧数

    使用OpenCV和Python高效计算视频的总帧数 1. 效果图 2. 源码 参考 这篇博客将介绍两种使用OpenCV和Python计算视频文件中帧数的方法. 超级快,它依靠OpenCV的视频属性功能 ...

  2. 在Python中计算一次性计算多个百分位数percentile、quantile

    在Python中计算一次性计算多个百分位数percentile. quantile 目录 在Python中计算一次性计算多个百分位数percentile. quantile

  3. python代码计算图像的分辨率

    python代码计算图像的分辨率 def jpeg_res(filename):""""This function prints the resolution ...

  4. 无网络服务器(linux ubuntu),pip安装python科学计算所有需要包(packages)

    无网络服务器(linux ubuntu),pip安装python科学计算所有需要包(packages) # 在windows上打开anaconda,进入环境tab页,在base环境处单击,然后点开te ...

  5. 独家 | 教你用Python来计算偏差-方差权衡

    作者:Jason Brownlee 翻译:吴振东 校对:车前子 本文约3800字,建议阅读8分钟. 本文为你讲解模型偏差.方差和偏差-方差权衡的定义及联系,并教你用Python来计算. 衡量一个机器学 ...

  6. 目前比较流行的Python科学计算发行版

    经常有身边的学友问到用什么Python发行版比较好? 其实目前比较流行的Python科学计算发行版,主要有这么几个: Python(x,y) GUI基于PyQt,曾经是功能最全也是最强大的,而且是Wi ...

  7. python星期计算_Python简单计算给定某一年的某一天是星期几示例

    本文实例讲述了Python简单计算给定某一年的某一天是星期几.分享给大家供大家参考,具体如下: # -*- coding:utf-8 -*- #计算某特定天使星期几 #蔡勒公式:w=y+[y/4]+[ ...

  8. python的计算符号说明_python中的计算符号

    1.算数计算符号:+ - * / //(取整) %(取余) **(次方) 1 >>> 6+8 2 14 3 >>> 9-3 4 6 5 >>> 3 ...

  9. python科学计算基础教程pdf下载-Python科学计算基础教程_PDF电子书

    因资源下载地址容易失效,请加微信号359049049直接领取,直接发最新下载地址. 前言 ======================================================= ...

最新文章

  1. Android中GridView的实现实例
  2. HTML中的转义字符 (转)
  3. 两家云服务器价格比较
  4. iphone全部机型_苹果12,十三岁iPhone最鸡贼的一次发布会
  5. OceanBase在蚂蚁金服的智能运维实践之路
  6. CentOS+Nginx一步一步开始配置负载均衡
  7. 从 0 到 1 | 手把手教你如何使用哈工大 NLP 工具 —— PyLTP!
  8. 关于二级域名Cookie的问题及解决方法
  9. 星梦邮轮世界梦号推出深圳母港特别航次
  10. 【只推荐一位】木东居士,数据挖掘的大神!
  11. js实现pc打开摄像头,拍照,下载
  12. WORKNC基础到进阶视频教程
  13. 忍看朋辈离职去,怒向HR要加薪
  14. Mac配置Sublime Text全部以标签页打开
  15. 喝酒神器小程序源码+全新带特效/多种游戏/支持流量主
  16. Python--几种set集合去重的方法
  17. getopt.h和getopt(),getopt_long()等函数
  18. php 爬取新闻,scrapy抓取学院新闻报告
  19. 这部手机爆火了,网友:新一代自拍神器?
  20. Java内存溢出与栈溢出

热门文章

  1. 如何导出树结构清晰的代码机构目录
  2. 51信用卡 Android自动埋点实践
  3. angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  4. 【转】C#安装包(自动卸载低版本)
  5. Unity3D-RPG项目实战(1):发动机的特殊文件夹
  6. Social Emotional Computing -价值观的运算
  7. 工作流性能优化(敢问activiti有扩展性?)(3)
  8. 简单的线程同步问题:两个线程交替执行N次【Synchronized、Lock、ArrayBlockingQueue】...
  9. hdu1054(最小顶点覆盖)
  10. AX2012 referencegroup