如何使用Opencv计算PSNR
2017-09-08 13:09
183 查看
什么是PSNR和MSE
最近正在做超分辨率相关的工作,在底层图像处理(或者说是CV领域的low-level vision)工作中,评价标准有两种:1. 主观方法
通过人眼去判断,给出主观评价
2. 客观方法
主要有MSE(Mean Square Error 平均平方误差)和PSNR(Peak Signal Noise Ratio,峰值信噪比)等
MSE
如何用OpenCV实现PSNR的计算
在使用Opencv的时候,我们可以借用矩阵的操作,而不用循环嵌套去一个一个计算,特别地,要把uint8转换成float,否则在精度问题上的出错会导致很大的偏差double compute_PSNR(cv::Mat Mat1, cv::Mat Mat2) { cv::Mat M1 = Mat1.clone(); cv::Mat M2 = Mat2.clone(); int rows = M2.rows; int cols = M2.cols // 确保它们的大小是一致的 cv::resize(mGND,mGND,cv::Size(cols,rows) ); mGND.convertTo(M1,CV_32F); mSR.convertTo(mSR,CV_32F); // compute PSNR Mat Diff; // Diff一定要提前转换为32F,因为uint8格式的无法计算成平方 Diff.convertTo(Diff,CV_32F); cv::absdiff(M1,M2,Diff); // Diff = | M1 - M2 | Diff= Diff.mul(Diff); // | M1 - M2 |.^2 Scalar S = cv::sum(Diff); // 分别计算每个通道的元素之和 double sse; // square error if (mDiff.channels()==3) sse = S.val[0] +S.val[1] + S.val[2]; // sum of all channels else sse = S.val[0]; int nTotalElement = mGND.channels()*mGND.total(); double mse = ( sse / (double)nTotalElement ); // // 加上0.0000001作为偏置,不至于发生除了的错误 double psnr = 10.0 * log10( 255*255 / (Mse+0.0000001) ); std::cout<< "PSNR : " << Psnr << std::endl; return psnr;
相关文章推荐
- shell编程中如何计算使用除法
- 如何在Visual C++ 6.0上使用OpenCV(MFC)
- ABAP–如何在’REUSE_ALV_GRID_DISPLAY’使用自定义F4帮助,返回多个字段以及计算修改其他字段
- 如何正确使用并行计算对集合进行写操作?
- 【android学习】如何在android上使用预编译好的opencv2.3.1包
- (转载)directshow的下载、VC2008中的配置、入门教程以及如何在opencv中使用
- 如何于DataGridView中使用计算字段
- Windows中如何计算时间间隔(2)使用SYSTEMTIME和FILETIME
- 如何在C++ Builder(BCB)中使用OpenCV
- C#里如何使用Timespan(计算时间差)
- 使用mouse_event时屏幕绝对坐标如何计算
- 如何在Android中使用OpenCV
- 如何使用AppCAD计算传输线的特性阻抗?
- ABAP--如何在'REUSE_ALV_GRID_DISPLAY'使用自定义F4帮助,返回多个字段以及计算修改其他字段
- 如何利用windosAPI计算程序运行时间 不使用VC的库,也就是说不跨系统,跨编译器
- JAVA内存使用--如何计算一个Java对象占用的字节数
- 如何计算 一个音视频文件 (.ts)文件 (包含pcr信息). 播放所使用的带宽
- 如何在iphone上使用opencv
- 使用mouse_event时屏幕绝对坐标如何计算
- ABAP--如何在'REUSE_ALV_GRID_DISPLAY'使用自定义F4帮助,返回多个字段以及计算修改其他字段