PSNR(Peak Signal to Noise Ratio,峰值信噪比)是最基础的视频质量评价方法。它的取值一般在20-50之间,值越大代表受损图片越接近原图片。PSNR通过对原始图像和失真图像进行像素的逐点对比,计算两幅图像像素点之间的误差,并由这些误差最终确定失真图像的质量评分。该方法由于计算简便、数学意义明确,在图像处理领域中应用最为广泛。

一幅MxN尺寸的图像的PSNR的计算公式如下所示:

其中xij 和yij 分别表示失真图像和原始图像对应像素点的灰度值;

i,j 分别代表图像的行和列;

L 是图像灰度值可到达的动态范围,8位的灰度图像的L=2^8-1=255。

如果已知SSD,MxN尺寸图像的PSNR公式如下所示。

MSE=SSD*1/(M*N)

PSNR=10*lg(255^2/MSE)

例如下图两张1080图片(左边是原图,右边是编码之后的图片,QP为17)的PSNR对比的结果 Y PSNR is 40.632022, U PSNR is 44.596545,V PSNR is 45.759277。

PSNR对比测试:
1080P视频测试:BasketballDrive_1920x1080_25_250.yuv
dp:17
 Y PSNR is 40.632022, U PSNR is 44.596545,V PSNR is 45.759277
dp:28
 Y PSNR is 38.834869, U PSNR is 42.445172,V PSNR is 42.977148
dp:32
 Y PSNR is 38.144906, U PSNR is 41.265455,V PSNR is 41.705576
dp:36
 Y PSNR is 37.527187, U PSNR is 40.110563,V PSNR is 40.551498
        我们知道量化和反量化过程中,量化步长QP决定量化器的编码压缩率及图像精度。如果QP比较大,则量化值FQ动态范围越小,其相应的编码长度越小,但反量化是损失较多的图像细节,导致PSNR值越小。

代码:

// PSNR_CAL.cpp : 定义控制台应用程序的入口点。
//PSNR (Peak Signal to Noise Ratio)
//峰值信噪比PSNR衡量图像失真或是噪声水平的客观标准。2个图像之间PSNR值越大,则越相似。普遍基准为30dB,30dB以下的图像劣化较为明显。
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>#define VIDEO_WIDTH          1280
#define VIDEO_HEIGHT        720
#define VIDEO_FRAME_NUM         10 //frame number
//编码解码YUV
#define DEC_YUV_PATH            "E:\\yuv\\\\bs3.yuv"
//原YUV
#define REF_YUV_PATH            "E:\\yuv\\BasketballDrive_1920x1080_25_250.yuv"
#define REF_YUV_422         0 //1:reference yuv is 422 format, 0:reference yuv is 420 format
#define VIDEO_SIZE_Y        VIDEO_HEIGHT*VIDEO_WIDTH
#define VIDEO_SIZE_UV       (VIDEO_HEIGHT*VIDEO_WIDTH)>>1
#define VIDEO_SIZE_YUV      (VIDEO_SIZE_Y + VIDEO_SIZE_UV)
#define CONV422 0
#define CAL_PSNR 1int main()
{FILE *fp_dec;FILE *fp_ref;int i, j, k, comp;#if CAL_PSNRunsigned char line_dec[5000];unsigned char line_ref[5000];int  idiff;unsigned long diff_sum;int width, height;double psnr_frame;double psnr_sum[VIDEO_FRAME_NUM][3];double psnr_total[3];fp_dec = fopen(DEC_YUV_PATH, "rb");fp_ref = fopen(REF_YUV_PATH, "rb");if (fp_dec == NULL){printf("\n DEC YUV file not found\n");return 0;}if (fp_ref == NULL){printf("\n REF YUV file not found\n");return 0;}for (i = 0; i < VIDEO_FRAME_NUM; i++){  //Yfor (comp = 0; comp < 3; comp++){diff_sum = 0;if(comp ==0){width = VIDEO_WIDTH;height = VIDEO_HEIGHT;}else{width = VIDEO_WIDTH /2;height = VIDEO_HEIGHT /2;}for (j = 0; j < height; j++){fread(line_dec, 1, width, fp_dec);fread(line_ref, 1, width, fp_ref);//fwrite(line_ref, 1, width, fp_ref_422);//if(comp != 0)                            //UV//  fwrite(line_ref, 1, width, fp_ref_422);for (k = 0; k < width; k++){idiff = (int)(line_dec[k] - line_ref[k]);diff_sum += idiff*idiff;//if (k == 0 && j == 5 )// printf("stop at %d", k);}//if (comp != 0 && REF_YUV_422 == 1) // if 422 format, skip one chroma line// fread(line_dec, 1, width, fp_dec);}psnr_frame = (double)255 * 255 * width* height;psnr_sum[i][comp] = 10.0 * log10(psnr_frame / (double)diff_sum);}printf("frame %d, Y PSNR is %f, Cb PSNR is %f,Cr PSNR is %f \n", i, psnr_sum[i][0], psnr_sum[i][1], psnr_sum[i][2]);}psnr_total[0] = 0;psnr_total[1] = 0;psnr_total[2] = 0;for (i = 0; i<VIDEO_FRAME_NUM; i++){psnr_total[0] += psnr_sum[i][0];psnr_total[1] += psnr_sum[i][1];psnr_total[2] += psnr_sum[i][2];}psnr_total[0] = psnr_total[0] / (VIDEO_FRAME_NUM);psnr_total[1] = psnr_total[1] / (VIDEO_FRAME_NUM);psnr_total[2] = psnr_total[2] / (VIDEO_FRAME_NUM); printf("average PSNR of sequence is:\n Y PSNR is %f, U PSNR is %f,V PSNR is %f\n", psnr_total[0], psnr_total[1], psnr_total[2]);fclose(fp_dec);fclose(fp_ref);system("pause");
#endif#if CONV422//convert ref 4:2:0 yuv to interleave 4:2:2 yuvunsigned char Y_plane[VIDEO_SIZE_YUV];unsigned char U_plane[VIDEO_SIZE_Y / 4];unsigned char V_plane[VIDEO_SIZE_Y / 4];unsigned char YUV_plane[2 * VIDEO_SIZE_Y];unsigned char *pt0;unsigned char *pt1;unsigned char *pt2;unsigned char *pt3;fp_ref = fopen(REF_YUV_PATH, "rb");fp_ref_422 = fopen(REF_YUV422_ITLV_PATH, "wb");if (fp_ref == NULL){printf("\n REF YUV file not found\n");return 0;}if (fp_ref_422 == NULL){printf("\n REF 422 YUV file not found\n");return 0;}for (i = 0; i < VIDEO_FRAME_NUM_CONV; i++){fread(Y_plane, 1, VIDEO_SIZE_Y, fp_ref);fread(U_plane, 1, VIDEO_SIZE_Y / 4, fp_ref);fread(V_plane, 1, VIDEO_SIZE_Y / 4, fp_ref);pt0 = Y_plane;pt1 = U_plane;pt2 = V_plane;pt3 = YUV_plane;for (j = 0; j < VIDEO_HEIGHT / 2; j++){for (k = 0; k < VIDEO_WIDTH / 2; k++) //the row size of YUV_plane is 2*VIDEO_WIDTH{*pt3++ = *pt0++;  //Y0*pt3++ = *pt1++;   //U0*pt3++ = *pt0++;   //Y1*pt3++ = *pt2++;   //V0}pt1 = pt1 - VIDEO_WIDTH / 2;pt2 = pt2 - VIDEO_WIDTH / 2;for (k = 0; k < VIDEO_WIDTH / 2; k++)  //the row size of YUV_plane is 2*VIDEO_WIDTH{*pt3++ = *pt0++;  //Y(WIDTH+0)*pt3++ = *pt1++;  //U0*pt3++ = *pt0++;   //Y(WIDTH+1)*pt3++ = *pt2++;  //V0}}fwrite(YUV_plane, 1, 2* VIDEO_SIZE_Y, fp_ref_422);}
#endif  }

但是PSNR仅仅计算了图像像素点间的绝对误差,没有考虑像素点间的视觉相关性,更没顾及人类视觉系统的感知特性,所以其评价结果与主观感受往往相差较大(SSIM就是一种典型的与人类视觉系统特性结合的质量评价方法)。

视频质量评价PSNR相关推荐

  1. 全参考客观视频质量评价方法 (MSE, PSNR,SSIM)原理

    全参考客观视频质量评价方法是指把原始参考视频与失真视频在每一个对应帧中的每一个对应像素之问进行比较.准确的讲,这种方法得到的并不是真正的视频质量,而是失真视频相对于原始视频的相似程度或保真程度.最简单 ...

  2. 全参考视频质量评价方法(PSNR,SSIM)以及相关数据库

    最常用的全参考视频质量评价方法有以下2种: PSNR(峰值信噪比):用得最多,但是其值不能很好地反映人眼主观感受.一般取值范围:20-40.值越大,视频质量越好. SSIM(结构相似性):计算稍复杂, ...

  3. 音视频技术:视频质量评价方法简介

    视频质量评估(VQA)一直是个很活跃的研究领域,原因其一是业内一直缺少一种统一且准确的评估标准,其二是影响视频质量的因素过多,且包含很多主观因素,难以客观.定量地评价.经过这么多年的研究,已经诞生了非 ...

  4. 音视频技术:视频质量评价方法简介 1

    视频质量评估(VQA)一直是个很活跃的研究领域,原因其一是业内一直缺少一种统一且准确的评估标准,其二是影响视频质量的因素过多,且包含很多主观因素,难以客观.定量地评价.经过这么多年的研究,已经诞生了非 ...

  5. 视频质量评价方法简介

    周鑫 2017年毕业于浙江大学,读研期间主要进行视频编码相关研究,目前在通信与视频部门进行转码引擎相关研发. 作者简介 ●●● 引言 视频质量评估(VQA)一直是个很活跃的研究领域,原因其一是业内一直 ...

  6. 机器学习帮助WebRTC视频质量评价

    本文来自CosMos Software创始人Alex. Gouaillard的博客,他同时为WebRTC.QUIC等标准组织工作.LiveVideoStack对原文进行了摘译. 文 / Alex. G ...

  7. H.264 无参考视频质量评价方法 (使用了基于遗传编程方法的符号回归)

    Nicolas Staelens 等人在<Constructing a No-Reference H.264/AVC Bitstream-based Video Quality Metric u ...

  8. 开源视频质量评价工具: Evalvid

    Evalvid是一个对在真实或模拟的网络里传输的视频进行质量评价的框架和工具集.除了底层网络的QoS参数的测量,如丢包率,延迟,抖动,Evalvid还提供标准的视频质量评价算法如PSNR和SSIM.它 ...

  9. 基于编码应用的主观全景视频质量评价数据库(译)

    subjective panoramic video quality assessment database for coding applications IEEE TRANSACTIONS ON ...

最新文章

  1. FAQ系列 | 监控平均SQL响应时长
  2. Cassandra架构、设计(集群表)和性能报告
  3. Linux如何找到所有elf文件,linux – ELF文件中的导入表在哪里?
  4. Java中集合 练习 计算疯狂值
  5. word2vec应用场景_word2vec的使用参数解释和应用场景
  6. 微服务探索与实践—总述
  7. 9、play中缓存的使用
  8. autowired注解_Spring系列之Spring常用注解总结
  9. python第二课知识点总结
  10. linux基本命令整理——鸟哥linux私房菜第九章
  11. 天翼网关 ddns设置_为什么说网关在任何工业物联网解决方案中都很重要?
  12. UI——day3.IOS设计规范
  13. 金蝶K3后台SQL修改数据-科目余额表、科目表核算项目
  14. 动词ing形式的5种用法_动词 ing 形式用法归纳
  15. 真的存在“对事不对人”吗?
  16. ios app 通过扫码下载ipa自动安装应用
  17. r语言软件GDINA_认知诊断分析系统(flexCDMs)设计及其实现
  18. MP FILTRI FMP0394BAA6M25NP01
  19. JAVA interrupt、interrupted和isInterrupted的区别
  20. TypeScript中any、unknown、void、never类型讲解

热门文章

  1. won10 mysql 5.7.22主从同步
  2. OpenCV基本图形绘制之绘制直线
  3. C中文件的输入输出与C++的文件流
  4. Hibernate SQL 查询
  5. 基于c语言中调试工具的用法汇总(不包含gdb)【转】
  6. Druid、C3P0、Tomcat Pool的性能测试与选型
  7. 怎么在InfoPath Web浏览器表单中弹出对话框?
  8. 开源软件贡献自己的力量
  9. Word2Vec算法详解(相关背景介绍)
  10. 在IntelliJ IDEA配置Tomcat