提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
视频评估方法
全参考客观视频质量评价方法 (PSNR,MSE, SSIM)原理
一、PSNR是什么?
psnr一般是用于最大值信号和背景噪音之间的一个判断。通常在经过影像压缩之后,输出的影像都会在某种程度与原始影像不同。为了衡量经过处理后的影像品质,我们通常会参考PSNR值来衡量某个处理程序能否令人满意。
优缺点:PSNR是最普遍,最广泛使用的评鉴画质的客观量测法,不过许多实验结果都显示,PSNR的分数无法和人眼看到的视觉品质完全一致,有可能PSNR较高者看起来反而比PSNR较低者差。这是因为人眼的视觉对于误差的敏感度并不是绝对的,其感知结果会受到许多因素的影响而产生变化。
二、使用代码
#include <cmath>
#include <string>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#pragma warning(disable:4996)
void yuv420_psnr(char* origin,char* target, int w, int h, int num) {
FILE* fp = fopen(origin, "r");
FILE* ft = fopen(target, "r");
unsigned char buf1[w * h];
unsigned char buf2[w * h];
float psnr = 0.0;
for (int i = 0; i < num; i++) {
fread(buf1, 1, w * h, fp);
fread(buf2, 1, w * h, ft);
int sum = 0;
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
int t = i * w + j;
sum += pow((buf1[t] - buf2[t]), 2);
}
}
float MSE = (float)sum / (float)(w * h);
psnr = 10 * log10(255 * 255 / MSE);
printf("psnr: %f\n", psnr);
fseek(fp, w * h / 2, SEEK_CUR);
fseek(ft, w * h / 2, SEEK_CUR);
}
fclose(fp);
fclose(ft);
}
int main()
{
char* x ="bigbuckbunny_0_480x272.yuv";
char* y ="bigbuckbunny_2_480x272.yuv";
int w = 480;
int h = 272;
int num = 1;
yuv420_psnr(x,y,w,h,num);
return 0;
}
// 运行命令 g++ 项目名称.cpp -o 生成名称
psnr 越大越好
PSNR高于40dB说明图像质量极好(即非常接近原始图像),
在30—40dB通常表示图像质量是好的(即失真可以察觉但可以接受),
在20—30dB说明图像质量差;
最后,PSNR低于20dB图像不可接受
2.结果实例:
对比评估svac转化为yuv
FILE* fp = fopen(“E:\cpp\视频素材\test_svac_change\ds_480x272.yuv”, “r”);
FILE* ft = fopen(“E:\cpp\视频素材\test_svac_change\ds_480x272_test9_ld_el_dec.yuv”, “r”);
psnr: 32.743374
对比评估h265转化为yuv
C:\Users\Administrator\source\repos\cpp_project\cpp_project\ds_480x272.yuv
C:\Users\Administrator\source\repos\cpp_project\cpp_project\ds_480x272_2.yuv
psnr: 35
总结
后期对其他的图像质量评估指标 SSIM / MSE/VMAF/MOS/等标准进行分析。