歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

利用OpenCV計算灰度圖像的峰值信噪比(PSNR)

我用兩種方法實現了灰度圖像的PSNR的計算,如下。代碼雖說是針對灰度圖像的,但能很容易擴展到多通道圖像的PSNR的計算。

代碼之一,完全靠自己的代碼實現PSNR的計算:

  1. #include <cv.h>  
  2. #include <highgui.h>  
  3. #include <math.h>  
  4. #include <stdio.h>  
  5. #pragma comment( lib, "cv.lib" )  
  6. #pragma comment( lib, "cxcore.lib" )  
  7. #pragma comment( lib, "highgui.lib" )   
  8. int main()  
  9. {  
  10.     IplImage* img = cvLoadImage("lena.jpg",0);  
  11.     int height=img->height;  
  12.     int width=img->width;  
  13.     int step=img->widthStep;  
  14.     uchar *data=(uchar *)img->imageData;  
  15.     int i,j;  
  16.     double sum=0;  
  17.     for(i=0;i<height;i++)   
  18.     {  
  19.         for(j=0;j<width;j++)   
  20.         {  
  21.             sum+=data[i*step+j];  
  22.         }  
  23.     }  
  24.     double mean=0;  
  25.     mean=sum/(width*height);  
  26.     double mse=0;  
  27.     for(i=0;i<height;i++)   
  28.     {  
  29.         for(j=0;j<width;j++)   
  30.         {  
  31.             mse+=(data[i*step+j]-mean)*(data[i*step+j]-mean);  
  32.         }  
  33.     }  
  34.     mse=mse/(width*height);  
  35.     double psnr=0;  
  36.     psnr=10*log10(255*255/mse);  
  37.     printf("%lf/n",sum);  
  38.     printf("%lf/n",mean);  
  39.     printf("%lf/n",mse);  
  40.     printf("%lf/n",psnr);  
  41.     cvNamedWindow("Lena", CV_WINDOW_AUTOSIZE);   
  42.     cvShowImage("Lena", img );    
  43.     cvWaitKey(0);  
  44.     cvDestroyWindow("Lena");  
  45.     cvReleaseImage(&img );  
  46.     return 0;  
  47. }  

代碼之二,使用了許多OpenCV庫提供的函數,代碼要精煉一些:

  1. #include <cv.h>  
  2. #include <highgui.h>  
  3. #include <math.h>  
  4. #include <stdio.h>  
  5. #pragma comment( lib, "cv.lib" )  
  6. #pragma comment( lib, "cxcore.lib" )  
  7. #pragma comment( lib, "highgui.lib" )   
  8. int main()  
  9. {  
  10.     IplImage* img = cvLoadImage("lena.jpg",0);  
  11.       
  12.     CvScalar sum=cvSum(img);  
  13.     CvScalar mean=cvAvg(img);  
  14.     CvScalar stddev;  
  15.     cvAvgSdv(img,NULL,&stddev);  
  16.     double psnr=20*log10(255/stddev.val[0]);  
  17.     printf("%lf/n",sum.val[0]);  
  18.     printf("%lf/n",mean.val[0]);  
  19.     printf("%lf/n",stddev.val[0]);  
  20.     printf("%lf/n",psnr);  
  21.     cvNamedWindow("Lena", CV_WINDOW_AUTOSIZE);   
  22.     cvShowImage("Lena", img );    
  23.     cvWaitKey(0);  
  24.     cvDestroyWindow("Lena");  
  25.     cvReleaseImage(&img );  
  26.     return 0;  
  27. }  

經lena圖檢驗,上面兩份代碼計算的結果是一樣的。

說明:上面的PSNR的定義參考了維基百科的相關條目。疏漏之處,歡迎拍磚!

Copyright © Linux教程網 All Rights Reserved