PSNR是最基本的視頻質量評價方法。本程序中的函數能夠對比兩張YUV圖片中亮度份量Y的PSNR。函數的代碼以下所示。
- 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;
- }
調用上面函數的方法以下所示。函數
- simplest_yuv420_psnr("lena_256x256_yuv420p.yuv","lena_distort_256x256_yuv420p.yuv",256,256,1);
對於8bit量化的像素數據來講,PSNR的計算公式以下所示。url
上述公式中mse的計算公式以下所示。spa
其中M,N分別爲圖像的寬高,xij和yij分別爲兩張圖像的每個像素值。PSNR一般用於質量評價,就是計算受損圖像與原始圖像之間的差異,以此來評價受損圖像的質量。本程序輸入的兩張圖像的對比圖以下圖所示。其中左邊的圖像爲原始圖像,右邊的圖像爲受損圖像。.net
通過程序計算後獲得的PSNR取值爲26.693。PSNR取值一般狀況下都在20-50的範圍內,取值越高,表明兩張圖像越接近,反映出受損圖像質量越好。code