利用OpenCV计算灰度图像的峰值信噪比(PSNR)
利用OpenCV计算灰度图像的峰值信噪比(PSNR)
我用两种方法实现了灰度图像的PSNR的计算,如下。代码虽说是针对灰度图像的,但能很容易扩展到多通道图像的PSNR的计算。
代码之一,完全靠自己的代码实现PSNR的计算:
- #include <cv.h>
- #include <highgui.h>
- #include <math.h>
- #include <stdio.h>
- #pragma comment( lib, "cv.lib" )
- #pragma comment( lib, "cxcore.lib" )
- #pragma comment( lib, "highgui.lib" )
- int main()
- {
- IplImage* img = cvLoadImage("lena.jpg",0);
- int height=img->height;
- int width=img->width;
- int step=img->widthStep;
- uchar *data=(uchar *)img->imageData;
- int i,j;
- double sum=0;
- for(i=0;i<height;i++)
- {
- for(j=0;j<width;j++)
- {
- sum+=data[i*step+j];
- }
- }
- double mean=0;
- mean=sum/(width*height);
- double mse=0;
- for(i=0;i<height;i++)
- {
- for(j=0;j<width;j++)
- {
- mse+=(data[i*step+j]-mean)*(data[i*step+j]-mean);
- }
- }
- mse=mse/(width*height);
- double psnr=0;
- psnr=10*log10(255*255/mse);
- printf("%lf/n",sum);
- printf("%lf/n",mean);
- printf("%lf/n",mse);
- printf("%lf/n",psnr);
- cvNamedWindow("Lena", CV_WINDOW_AUTOSIZE);
- cvShowImage("Lena", img );
- cvWaitKey(0);
- cvDestroyWindow("Lena");
- cvReleaseImage(&img );
- return 0;
- }
代码之二,使用了许多OpenCV库提供的函数,代码要精炼一些:
- #include <cv.h>
- #include <highgui.h>
- #include <math.h>
- #include <stdio.h>
- #pragma comment( lib, "cv.lib" )
- #pragma comment( lib, "cxcore.lib" )
- #pragma comment( lib, "highgui.lib" )
- int main()
- {
- IplImage* img = cvLoadImage("lena.jpg",0);
- CvScalar sum=cvSum(img);
- CvScalar mean=cvAvg(img);
- CvScalar stddev;
- cvAvgSdv(img,NULL,&stddev);
- double psnr=20*log10(255/stddev.val[0]);
- printf("%lf/n",sum.val[0]);
- printf("%lf/n",mean.val[0]);
- printf("%lf/n",stddev.val[0]);
- printf("%lf/n",psnr);
- cvNamedWindow("Lena", CV_WINDOW_AUTOSIZE);
- cvShowImage("Lena", img );
- cvWaitKey(0);
- cvDestroyWindow("Lena");
- cvReleaseImage(&img );
- return 0;
- }
经lena图检验,上面两份代码计算的结果是一样的。
说明:上面的PSNR的定义参考了维基百科的相关条目。疏漏之处,欢迎拍砖!
评论暂时关闭