求图像的信噪比PSNR

  图像的信噪比是衡量一幅图片质量好坏的重要指标。图像的信噪比应该等于信号与噪声的功率谱之比,但功率谱不好计算,可以用信号与噪声的方差之比来估算。首先计算所有像素的局部方差,将局部方差的最大值认为是信号的方差,最小值是噪声的方差,求出比值,再转换成dB数,最后用经验公式修正。

  均方差定义为:

  \mathit{MSE} = \frac{1}{mn}\sum_{i=0}^{m-1}\sum_{j=0}^{n-1} ||I(i,j) - K(i,j)||^2

  峰值信噪比定义为:

  \mathit{PSNR} = 10 \cdot \log_{10} \left( \frac{\mathit{MAX}_I^2}{\mathit{MSE}} \right) 
= 20 \cdot \log_{10} \left( \frac{\mathit{MAX}_I}{\sqrt{\mathit{MSE}}} \right)

 

  其中MAXI是表示图像点颜色的最大数值,如果每个采样点用8位表示,那么就是255。更为通用的表示是,如果每个采样点用B位线性脉冲编码调制表示,那么MAXI就是

          2^B-1

  对于每点有RGB三个值的彩色图像来说,峰值信噪比的定义类似,只是均方差所有方差之和除以图像尺寸再除以3。

  图像压缩中典型的信噪比在20~40dB之间,越高越好。

  

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

 

 

 

posted @ 2013-12-02 21:30  永久指针  阅读(3279)  评论(0编辑  收藏  举报