一、RSNR的理解
你可以吧RSNR理解为评判图片受损的标准,PSNR取值通常情况下都在20-50的范围内,取值越高,代表两张图像越接近,反映出受损图像质量越好。
类似于我们的FPS,越高越好。
对于8bit量化的像素数据来说,PSNR的计算公式如下所示:
上述公式中mse的计算公式如下所示:
二、如何评判
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int testYuv420Grey(char* fileName1, char* fileName2, int width, int height)
{
FILE* fp = fopen(fileName1, "rb+");
FILE* fp1 = fopen(fileName2, "rb+");
unsigned char* readBuf1 = (unsigned char*)malloc(width * height);
unsigned char* readBuf2 = (unsigned char*)malloc(width * height);
fread(fileName1, 1, width * height, fp);
fread(fileName2, 1, width * height, fp1);
double mse_sum = 0, mse = 0, psnr = 0;
for (int j = 0; j < width * height; j++) {
mse_sum += pow((double)(readBuf1[j] - readBuf2[j]), 2);
}
mse = mse_sum / (width * height);
psnr = 10*log10(255.0 * 255.0 / mse);
printf("%5.3f\n", psnr);
fseek(fp, width * height / 2, SEEK_CUR);
fseek(fp1, width * height / 2, SEEK_CUR);
free(readBuf1);
free(readBuf2);
fclose(fp);
fclose(fp1);
}
int main()
{
testYuv420Grey("girl_1.yuv","girl_5.yuv",1280,720);
return 0;
}
这里编译需要家 -lm,因为运用了一些函数,所以需要一些数学知识。
inf是因为我这里的值超出了范围(无穷大,无穷小),所以会显示inf,因为这两张图片girl_1.yuv和girl_5.yuv和是一样的。