首页 > 代码库 > 计算两个YUV420P像素数据的PSNR---高等算法
计算两个YUV420P像素数据的PSNR---高等算法
PSNR是最基本的视频质量评价方法。本程序中的函数可以对比两张YUV图片中亮度分量Y的PSNR。函数的代码如下所示。
[cpp] view plain copy
- /**
- * Calculate PSNR between 2 YUV420P file
- * @param url1 Location of first Input YUV file.
- * @param url2 Location of another Input YUV file.
- * @param w Width of Input YUV file.
- * @param h Height of Input YUV file.
- * @param num Number of frames to process.
- */
- int simplest_yuv420_psnr(char *url1,char *url2,int w,int h,int num){
- FILE *fp1=fopen(url1,"rb+");
- FILE *fp2=fopen(url2,"rb+");
- unsigned char *pic1=(unsigned char *)malloc(w*h);
- unsigned char *pic2=(unsigned char *)malloc(w*h);
- for(int i=0;i<num;i++){
- fread(pic1,1,w*h,fp1);
- fread(pic2,1,w*h,fp2);
- double mse_sum=0,mse=0,psnr=0;
- for(int j=0;j<w*h;j++){
- mse_sum+=pow((double)(pic1[j]-pic2[j]),2);
- }
- mse=mse_sum/(w*h);
- psnr=10*log10(255.0*255.0/mse);
- printf("%5.3f\n",psnr);
- fseek(fp1,w*h/2,SEEK_CUR);
- fseek(fp2,w*h/2,SEEK_CUR);
- }
- free(pic1);
- free(pic2);
- fclose(fp1);
- fclose(fp2);
- return 0;
- }
调用上面函数的方法如下所示。
[cpp] view plain copy
- simplest_yuv420_psnr("lena_256x256_yuv420p.yuv","lena_distort_256x256_yuv420p.yuv",256,256,1);
对于8bit量化的像素数据来说,PSNR的计算公式如下所示。
上述公式中mse的计算公式如下所示。
其中M,N分别为图像的宽高,xij和yij分别为两张图像的每一个像素值。PSNR通常用于质量评价,就是计算受损图像与原始图像之间的差别,以此来评价受损图像的质量。本程序输入的两张图像的对比图如下图所示。其中左边的图像为原始图像,右边的图像为受损图像。
经过程序计算后得到的PSNR取值为26.693。PSNR取值通常情况下都在20-50的范围内,取值越高,代表两张图像越接近,反映出受损图像质量越好。
计算两个YUV420P像素数据的PSNR---高等算法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。