歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 利用OpenCV計算灰度圖像的峰值信噪比(PSNR)

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

日期:2017/3/1 10:10:35   编辑:Linux編程

我用兩種方法實現了灰度圖像的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. CvScalar sum=cvSum(img);
  12. CvScalar mean=cvAvg(img);
  13. CvScalar stddev;
  14. cvAvgSdv(img,NULL,&stddev);
  15. double psnr=20*log10(255/stddev.val[0]);
  16. printf("%lf/n",sum.val[0]);
  17. printf("%lf/n",mean.val[0]);
  18. printf("%lf/n",stddev.val[0]);
  19. printf("%lf/n",psnr);
  20. cvNamedWindow("Lena", CV_WINDOW_AUTOSIZE);
  21. cvShowImage("Lena", img );
  22. cvWaitKey(0);
  23. cvDestroyWindow("Lena");
  24. cvReleaseImage(&img );
  25. return 0;
  26. }

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

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

Copyright © Linux教程網 All Rights Reserved