#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
// PSNR 峰值信噪比计算 返回数值为30-50dB 值越大越好
double PSNR(const Mat& I1, const Mat& I2)
{
    cv::Mat s1;
    // 计算图像差|I1 - I2|
    absdiff(I1, I2, s1);
    // 转成32浮点数进行平方
    s1.convertTo(s1, CV_32F);
    // s1*s1,即|I1 - I2|^2
    s1 = s1.mul(s1);
    // 分别叠加每个通道的元素,存于s中
    cv::Scalar s = sum(s1);
    // 计算所有通道元素和
    double sse = s.val[0] + s.val[1] + s.val[2];
    // 当元素很小时返回0值
    if (sse <= 1e-10)
        return 0;
    else
    {
        // 根据公式计算当前I1与I2的均方误差
        double mse = sse / (double)(I1.channels() * I1.total());
        // 计算峰值信噪比
        double psnr = 10.0*log10((255 * 255) / mse);
        return psnr;
    }
}
// MSSIM 结构相似性计算 返回值为0到1 值越大越好
cv::Scalar MSSIM(const Mat& i1, const Mat& i2)
{
    const double C1 = 6.5025, C2 = 58.5225;
    cv::Mat I1, I2;
    // 转换成32浮点数进行平方操作
    i1.convertTo(I1, CV_32F);
    i2.convertTo(I2, CV_32F);
    // I2^2
    cv::Mat I2_2 = I2.mul(I2);
    cv::Mat I1_2 = I1.mul(I1);
    cv::Mat I1_I2 = I1.mul(I2);
    cv::Mat mu1, mu2;
    // 高斯加权计算每一窗口的均值、方差以及协方差
    GaussianBlur(I1, mu1, Size(11, 11), 1.5);
    GaussianBlur(I2, mu2, Size(11, 11), 1.5);
    Mat mu1_2 = mu1.mul(mu1);
    Mat mu2_2 = mu2.mul(mu2);
    Mat mu1_mu2 = mu1.mul(mu2);
    Mat sigma1_2, sigma2_2, sigma12;
    // 高斯平滑,具体原理见4.4节
    GaussianBlur(I1_2, sigma1_2, Size(11, 11), 1.5);
    sigma1_2 -= mu1_2;
    GaussianBlur(I2_2, sigma2_2, Size(11, 11), 1.5);
    sigma2_2 -= mu2_2;
    GaussianBlur(I1_I2, sigma12, Size(11, 11), 1.5);
    sigma12 -= mu1_mu2;
    // 根据计算公式相应参数
    Mat t1, t2, t3;
    t1 = 2 * mu1_mu2 + C1;
    t2 = 2 * sigma12 + C2;
    // t3 = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))
    t3 = t1.mul(t2);
    t1 = mu1_2 + mu2_2 + C1;
    t2 = sigma1_2 + sigma2_2 + C2;
    // t1 =((mu1_2 + mu2_2 + C1).*(sigma1_2 + sigma2_2 + C2))
    t1 = t1.mul(t2);
    Mat ssim_map;
    // ssim_map =  t3./t1;
    divide(t3, t1, ssim_map);
    // 将平均值作为两图像的结构相似性度量    
    cv::Scalar mssim = mean(ssim_map);
    return mssim;
}

int main()
{
    //cv::Mat srcImage = cv::imread("..\\images\\flower.jpg");
cv::Mat srcImage = cv::imread("2.jpg");
    cv::imshow("srcImage", srcImage);
    cv::Mat pyrDownImage, pyrUpImage;
    // 下采样过程
    pyrDown(srcImage, pyrDownImage,
        cv::Size(srcImage.cols / 2, srcImage.rows / 2));
    cv::imshow("pyrDown", pyrDownImage);
    // 上采样过程
    pyrUp(srcImage, pyrUpImage,
        cv::Size(srcImage.cols * 2, srcImage.rows * 2));
    cv::imshow("pyrUp", pyrUpImage);
    // 对下采样过程重构
    cv::Mat pyrBuildImage;
    pyrUp(pyrDownImage, pyrBuildImage,
        cv::Size(pyrDownImage.cols * 2, pyrDownImage.rows * 2));
    cv::imshow("pyrBuildImage", pyrBuildImage);
    double dPNSR = PSNR(srcImage, pyrBuildImage);
    std::cout << "dPNSR: " << dPNSR << std::endl;

cv::Scalar sMSSIM = MSSIM(srcImage, pyrBuildImage);

std::cout << "sMSSIM: " << sMSSIM.val[0] << " "  << sMSSIM.val[1] << " " <<  sMSSIM.val[2]  << std::endl;
    cv::waitKey(0);
    return 0;

}

转载:http://blog.csdn.net/zhuwei1988

图像质量评价,图片放大和缩小相关推荐

  1. pyQt5图片放大和缩小

    图片放大和缩小 基本实现图片缩小和放大 版本1 基本实现图片缩小和放大 版本2 基本实现图片缩小和放大 版本1 # 版本1 from PyQt5.QtWidgets import * from PyQ ...

  2. 图片浏览器功能的实现(一)——图片放大与缩小功能实现

    图片浏览在应用中是一种比较常用的功能,主要包括图片的放大.缩小.旋转.上下左右移动图片.LZ花了一天时间实现了一下这些功能,希望能够帮到阅读此博客的码农们. 先把前期工作准备一下,创建一个UWP项目. ...

  3. 微信小程序操作图片放大、缩小、旋转、拖拽

    微信小程序操作图片放大.缩小.旋转.拖拽 在开发小程序的时候遇到了上传图片,然后编辑的需求.打算网上找一下相关代码组件的,就不用自己搞这么麻烦.经过一番折腾,还是没有找到如意的,最后自己弄好了,记录一 ...

  4. 图片放大、缩小、恢复操作的实现

    无论怎样实现图片的显示操作,基本上都是将图片显示在类似于Canvas控件中.图片的放大.缩小和恢复操作就是通过计算图片的显示大小比例来实现图片的放大缩小和恢复功能. 在下面提供图片的比例的计算类,其中 ...

  5. HTML中,图片放大与缩小

    最近做了个对页面的图片进行缩放的项目,故记录下 首先,图片是通过上传得到,图片的width和height并不固定,其次,图片的图层上方有拖拽过来的点,图像缩放时,需要同时对点的坐标进行缩放. < ...

  6. VUE3 实现前台图片标注添加矩形框、图片放大、缩小、鼠标滚轮缩放

    VUE3 实现前台图片标注 功能包括: 鼠标左键拖动添加矩形框标记区域,鼠标点击已绘制的矩形: 选中矩形,并绘制不同选中效果: 鼠标在已绘制的矩形中按住左键拖动,选中并移动矩形:选中矩形后鼠标在选中矩 ...

  7. elementUi中的图片预览功能(图片放大、缩小)preview-src-list属性

    一.图片有时候需要放大预览,放大后可支持放大缩小等功能,element中的preview-src-list属性可以实现. 二.主要代码: <el-form ref="verificat ...

  8. C#实现图片放大,缩小,拖拽

    目录 效果: 代码: 放大缩小原理: 效果: 先看效果: 代码: using System; using System.Collections.Generic; using System.Compon ...

  9. android 图片放大于缩小

    2019独角兽企业重金招聘Python工程师标准>>> public class ex04_22 extends Activity{private ImageView mImageV ...

最新文章

  1. 部门工作中的“求同存异”法则
  2. 科大星云诗社动态20210422
  3. OpenCV-信用卡数字识别-03
  4. matlab 基本变量和函数
  5. 【干货】B站品牌营销指南.pdf(附100页pdf下载链接)
  6. 新建pch文件及配置
  7. 在银行做数据是一种什么体验?
  8. java opencv 人脸相似度_java实现OpenCV 4.1.0人脸相似度对比
  9. matlab gui仿真实验,基于Matlab GUI设计的光学实验仿真
  10. BCH的51攻击与防守
  11. 高版本linux安装gamit,Ubuntu14下Gamit安装(示例代码)
  12. 护眼色的RGB值及颜色代码
  13. 柴静《看见》发布会。。。
  14. Linux学习笔记RHEL 7(九)--RHEL7.0 DNS服务配置
  15. android圆环头像,Android实现带圆环的圆形头像
  16. Python——永久存储:腌制一缸美味的泡菜
  17. 人工智能实战2019第八次作业 16721088 焦宇恒
  18. java定义一个eat方法,java基础5实战开发Day2/方法/2020-04-26
  19. 总结了11句话,送给通信新员工
  20. 利用阿里云公共配音接口快速配音

热门文章

  1. 5层模型中数据从源主机到目的主机之旅
  2. 微信小程序-锚点定位+内容滑动控制导航选中
  3. ionic app 开发和生产环境的配置
  4. addTwoNumbers
  5. DIY强大的虚拟化环境-技术可行性部分
  6. NFS共享服务挂载时出现“access denied by server while mounting”的解决方法
  7. windows mobile做一个摄象头预览程序
  8. SpringBoot自动配置的原理及实现
  9. Eclipse link方式安装反编译插件
  10. Python远程连接服务器