图像质量评估

2023-11-11

图像质量评估

http://jingyan.baidu.com/article/cbf0e500f5505a2eab28936e.html

【客观评价方法】
图像质量的客观评价方法是根据人眼的主观视觉系统建立数学模型,并通过具体的公式计算图像的质量。传统的图像质量客观评价方法主要包括均方误差(MSE,mean squared error)和峰值信噪比(PSNR,peak signal to noise rate)。均方误差法首先计算原始图像和失真像象素差值的均方值,然后通过均方值的大小来确定失真图像的失真程度。计算公式如图。
其中M、N为图像的长和宽,ijf表示原始图像的象素值,‘ijf表示降质后图像的象素值

PSNR作为衡量图像质量的重要指标,基于通信理论而提出,是最大信号量与噪声强度的比值。由于数字图像都是以离散的数字表示图像的像素,因此采用图像的最大象素值来代替最大信号量。具体公式如图。
其中 L 为图像中像素的最大灰度值,一般采用255。

这里写图片描述

这里写图片描述

自己写的图像质量评估软件平台:
截图(测试图片来源网络)

这里写图片描述

//计算
void CImagesQualityEvaluationToolDlg::OnBnClickedButton2()
{
    if((image_in_1.rows != image_in_2.rows)||(image_in_1.cols != image_in_2.cols)
        ||(image_in_1.rows != image_in_2.rows)||(image_in_1.cols != image_in_2.cols))
    {
        CString str_Problem("图片1和2大小不一致");
        GetDlgItem(IDC_EDIT1)->SetWindowText(str_Problem);
        return;
    }

    //unsigned char***imgrow= NULL;
    //imgrow=ZL_allocu_3(image_in_1.rows,image_in_1.cols,3);        //allocate memory

    double MSE_b=0.,MSE_g=0.,MSE_r=0.,MSE=0.,PSNR_b=0.,PSNR_g=0.,PSNR_r=0.,PSNR=0.;
    for (int row = 0; row < image_in_1.rows; row++)
    {
        for (int col = 0; col < image_in_1.cols; col++)
        {
            /*
            //[row, col]像素的第 1 通道地址被 * 解析(b通道)
            imgrow[row][col][2] = *(image_in_1.data + image_in_1.step[0] * row + image_in_1.step[1] * col);

            //[row, col]像素的第 2 通道地址被 * 解析(g通道)
            imgrow[row][col][1] = *(image_in_1.data + image_in_1.step[0] * row + image_in_1.step[1] * col + image_in_1.elemSize1());

            //[row, col]像素的第 3 通道地址被 * 解析(r通道)
            imgrow[row][col][0] = *(image_in_1.data + image_in_1.step[0] * row + image_in_1.step[1] * col + image_in_1.elemSize1() * 2);
            */
            MSE_b += pow((double)(*(image_in_2.data + image_in_2.step[0] * row + image_in_2.step[1] * col) - *(image_in_1.data + image_in_1.step[0] * row + image_in_1.step[1] * col)),2);
            MSE_g += pow((double)(*(image_in_2.data + image_in_2.step[0] * row + image_in_2.step[1] * col + image_in_2.elemSize1()) - *(image_in_1.data + image_in_1.step[0] * row + image_in_1.step[1] * col + image_in_1.elemSize1())),2);
            MSE_r += pow((double)(*(image_in_2.data + image_in_2.step[0] * row + image_in_2.step[1] * col + image_in_2.elemSize1() * 2) - *(image_in_1.data + image_in_1.step[0] * row + image_in_1.step[1] * col + image_in_1.elemSize1() * 2)),2);    
        }
    }
    int WH = image_in_1.rows * image_in_1.cols;

    MSE_b = MSE_b/WH;
    MSE_g = MSE_g/WH;
    MSE_r = MSE_r/WH;

    if(MSE_b != 0.)
    {
        PSNR_b = 10*log(pow(255.,2)/MSE_b);
    }
    if(MSE_g != 0.)
    {
        PSNR_g = 10*log(pow(255.,2)/MSE_g);
    }
    if(MSE_r != 0.)
    {
        PSNR_r = 10*log(pow(255.,2)/MSE_r);
    }

    PSNR = (PSNR_b+PSNR_g+PSNR_r)/3;

    CString str_PSNR;
    str_PSNR.Format("%f",PSNR);
    GetDlgItem(IDC_EDIT1)->SetWindowText(str_PSNR); 
}
//加载图像
void CImagesQualityEvaluationToolDlg::OnBnClickedButton1()
{
    CFileDialog  Dlg(1,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("TXT Files(*.PNG)|*.JPG|All Files(*.*)|*.*"));
     //打开文件
    if(Dlg.DoModal() == IDOK)                   //是否打开成功
    {
        CString FilePathName;                   //文件名参数定义
        //FilePathName(_T(""));                 //初始化
        FilePathName =  Dlg.GetPathName();      //取得文件路径及文件名
        SetDlgItemText(IDC_EDIT3,FilePathName); //在一个地址为IDC_EDIT3的editbox中显示文件名

        char *p =(LPSTR)(LPCSTR)FilePathName;

        image_in_1 = imread(p);

        IplImage *Ipl_image_in;
        Ipl_image_in=&IplImage(image_in_1);
        DrawPicToHDC(Ipl_image_in, IDC_STATIC_P);//IDC_STATIC
    }
    else                                         //打开失败处理
    {
        MessageBox(_T("打开失败"),NULL,MB_OK);
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图像质量评估 的相关文章

  • 基于51单片机实现继电器控制照明设备(Proteus仿真)

    wechat 嵌入式工程师成长日记 具体功能实现 当按下开关时 继电器闭合点亮照明设备 灯泡 使用器件 照明设备 LAMP 按键 AT89C51 若干电阻 PNP晶体管 二极管 继电器 RTE24005F Proteus仿真原理图 仿真 知
  • C++字符串【string】和【char []】操作全攻略

    异想之旅 本人原创博客完全手敲 绝对非搬运 全网不可能有重复 本人无团队 仅为技术爱好者进行分享 所有内容不牵扯广告 本人所有文章仅在CSDN 掘金和个人博客 一定是异想之旅域名 发布 除此之外全部是盗文 一 char 类型 1 定义与输入
  • Linux_18.04 Failed to load module "canberra-gtk-module"

    解决办法 sudo apt install libcanberra gtk module
  • openGL之API学习(二十六)glTexImage2D

    给2维纹理分配显存空间 也可以从内存向显存拷贝数据 void glTexImage2D GLenum target GLint level GLint internalformat GLsizei width GLsizei height
  • 你需要知道的 Selenium4 新特性

    前言 最近又用到了Selneium 发现已经来到了 4 9 版本了 本篇文章来介绍下它较比 Selenium3 的一些新特性 记录下 当是做笔记了 最令人惊喜的是 Selenium4 会自动回收浏览器资源 本文所使用的 Selenium 版
  • linux常用命令及解释大全(一)

    目录 一 系统信息 二 关机 重启及登出 三 文件和目录 3 1 导航命令 3 2 查看命令 3 3 创建和删除命令 3 4 复制和链接命令 3 5 其他命令 四 文件搜索 五 挂载文件系统 六 磁盘空间 七 用户和群组 总结 前言 Lin
  • js 拦截alert对话框

  • 若依框架前后端分离版——导入功能

    引言 主要是记录自己使用若依框架并增加其导入功能的实现过程 前端部分 在相应的index vue中添加以下代码 1 数据导入的按钮 v hasPermi 是权限相关的配置
  • Git版本回退并提交远程

    1 进入远程git 在提交纪录中找到需要回退的版本 复制版本号 2 终端进入项目 并执行git reset hard 23a50a1fXXX41XXXXX0227 3 把修改推送至远程 执行已下指令 git push f u origin
  • thrift开发问题总结

    作为目前最流行的RPC框架 thrift不仅提供了通信协议 同时提供了网络框架 解脱了程序员的生产力 thrift也是阿帕奇Hadoop系列的RPC实现工具 本文主要聚焦在实现的thrift系统中 遇到的各种问题 但是thrift在隐藏一些
  • matlab 矩阵增加行,MATLAB 中 如何在矩阵中插入1行

    点击查看MATLAB 中 如何在矩阵中插入1行具体信息 答 举例来说吧假如你已有矩阵A如下 A 2 3 5 3 4 1 0 9 7 这是一个3 3矩阵 那么当你想插入一行r 1 2 3 时 那么可以这样做 A A r 这样A就变成了4 3的
  • Gin框架(学习笔记)

    目录 学习地址 gin 路由 routes group gin 中间件 Cookie 重定向 同步异步 日志文件 学习地址 https www topgoer com gin E6 A1 86 E6 9E B6 gin 路由 package
  • windows操作系统蓝屏错误对照表

    windows操作系统蓝屏错误对照表
  • 出行行业计价模块的设计模式实践

    业务场景介绍 在出行行业中 价格的配置随随着业务的增加而增加 而刺激出行的促销活动更是频繁 在价格的计算中 通常的流程如下 根据一组价格配置 计算订单基础的价格 根据用户拥有的优惠对象 例如优惠券 积分 会员级别等 计算出优惠以后的价格 计
  • 信号和槽机制

    1 信号和槽机制概念 信号 各种事件 槽 响应信号的动作 当某个事件发生后 如某个按钮被点击了一下 它就会发出一个被点击的信号 signal 某个对象接收到这个信号之后 就会做一些相关的处理动作 称为槽slot 但是Qt对象不会无故收到某个
  • pyqt5 一些界面色彩搭配的建议(RGB值)

    简约现代风格 底色 浅灰色 240 240 240 按钮控件颜色 中蓝色 0 122 255 文字框颜色 白色 255 255 255 字体颜色 深灰色 51 51 51 点击时的颜色 深蓝色 0 80 180 清新自然风格 底色 浅绿色
  • React中styled-components的使用(样式组件库)

    一 官网地址 https www styled components com 二 styled components 1 styled components 样式化组件 主要作用是它可以编写实际的CSS代码来设计组件样式 也不需要组件和样式

随机推荐

  • React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快

    一次性加载太多的路由文件会使首次加载的速度很慢 所以我们需要将路由搞成懒加载的形式 用到哪个组件加载哪个组件 庆幸的是React官方已经给我们准备好了插件 也在React库中 首先 从react这个库中导出lazy Suspense这两个方
  • mysql数据库的内部结构说明

    记住 表才是存放数据的基本单元 结论 Mysql数据底层由多个database组成 每一个database存放多张表
  • 【记录】在NAS上部署git文章汇总(网址)

    1 https blog csdn net mtclz3 article details 87461470 2 https blog csdn net u014213012 article details 65631261 3 https
  • git常用操作命令总结

    本篇文章主要收集记录git常用命令
  • Keil编程中Source Brower : "P17" is undefined!的问题

    博客原文 Keil编程中Source Brower P17 is undefined 的问题 在Keil新建工程中经常会遇到一个问题 去看某一个变量定义 然后跳转不过去 并提示Source Brower 某某 is undefined 在这
  • 嵌入式VSCode+gdbserver图形化调试环境搭建与使用

    目录 一 原理 二 环境搭建 1 VSCode设置 2 gdbserver安装 三 调试过程 一 原理 嵌入式系统中一般在 PC端运行 gdb工具 源码也是在 PC端 源码对应的可执行文件放到开发板中运行 为此我们需要在开发板中运行 gdb
  • 数据库分库分表

    一 为什么要分库分表 如果一个网站业务快速发展 那这个网站流量也会增加 数据的压力也会随之而来 比如电商系统来说双十一大促对订单数据压力很大 Tps十几万并发量 如果传统的架构 一主多从 主库容量肯定无法满足这么高的Tps 业务越来越大 单
  • Linux下Socket编程

    什么是Socket Socket接口是TCP IP网络的API Socket接口定义了许多函数或例程 程式员能够用他们来研发TCP IP网络上的应用程式 要学Internet上的TCP IP网络编程 必须理解Socket接口 Socket接
  • 七. Kubernetes Objects对象,对象状态与yaml

    目录 一 基础概念理解 二 k8s 对象中的spec与status 三 如何编写yaml 一 基础概念理解 Kubernetes Objects 官方地址 在k8s中所有操作资源实体都可以称为对象 先下图中的这些 都可以称为对象 不同对象功
  • 汇编语言随笔(10)-内中断及实验12(返回到dos的中断处理程序)

    不同类型内中断的区分 中断类型码 8086cpu中在下面4种情况下会产生内中断 1 除法错误 如之前提到的除法溢出 2 单步执行 3 执行into指令 4 执行int指令 那么当内中断发生时cpu如何来区分到底是哪种中断源呢 通过中断类型码
  • 代码随想录训练营day9

    题目一 实现strStr 力扣题目链接 题目描述 给你两个字符串 haystack 和 needle 请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标 下标从 0 开始 如果 needle 不是 haysta
  • GLSL的in、out存储限制符使用错误

    在GLSL中用in修饰的变量表示传入的数据 用out修饰的变量表示传出的数据 通过这样可以实现顶点着色器向片段着色器传递数据 但要注意这个变量的命名要相同 不相同的话 片段着色器是获取不到从顶点着色器传入的数据的 1 顶点着色器 versi
  • unity打包技巧

    打包准备 1 android 需要jdk 和android sdk 如果有使用C 的库 还需要NDK 只有将 so文件放在 Assets Plugins Android libs下 Unity才会将 so文件识别为共享库 并在打包时将之拷贝
  • 分布式事务-seata AT模式-强一致性。

    目录 1 seata原理 2 关键组件 3 seate服务端参数 4 微服务配置 5 业务流程 6 依次启动eureka seate服务器 微服务 1 seata原理 Seata 是一款开源的分布式事务解决方案 致力于提供高性能和简单易用的
  • element-ui 表格一行显示多行内容并实现多行内某一行列合并

    这是加上边框的 去掉边框后这个表格看着更明显一点 表格一行放多行内容 并让第二行进行列合并 第一行不合并
  • 详解数据结构之顺序栈的基本操作(C语言描述)

    1 栈是线性表的特例 因此栈的顺序存储其实也就是线性表顺序存储的简化 我们称之为顺序栈 线性表是采用数组来实现的 因此顺序栈也采用数组来实现 2 栈的结构定义 elementype类型根据实际情况而定 这里假设为int类型 栈的结构体定义为
  • 时间序列ARIMA滚动预测

    什么是时间序列 时间序列简单的说就是各时间点上形成的数值序列 时间序列分析就是通过观察历史数据预测未来的值 在这里需要强调一点的是 时间序列分析并不是关于时间的回归 它主要是研究自身的变化规律的 这里不考虑含外生变量的时间序列 为什么用py
  • C语言结构体struct的比较

    两个struct结构体进行比较 首先不能直接比较 struct A a b a和b相比是错误的 其次不能进行内存比较 如下 程序运行的结果会如何 void DiffStructWithMultiVar struct A a 0 struct
  • 远程连接身份验证错误,找不到加密Oracle修正(正解)

    出现问题 使用远程连接弹出一个对话框 提示 发生身份验证错误 要求的函数不受支持 方法一 win r 输入gpedit msc 找到下面路径 策略路径 计算机配置 gt 管理模板 gt 系统 gt 凭据分配 设置名称 加密 Oracle 修
  • 图像质量评估

    图像质量评估 http jingyan baidu com article cbf0e500f5505a2eab28936e html 客观评价方法 图像质量的客观评价方法是根据人眼的主观视觉系统建立数学模型 并通过具体的公式计算图像的质量