图像的信噪比是衡量一幅图片质量好坏的重要指标。图像的信噪比应该等于信号与噪声的功率谱之比,但功率谱不好计算,可以用信号与噪声的方差之比来估算。首先计算所有像素的局部方差,将局部方差的最大值认为是信号的方差,最小值是噪声的方差,求出比值,再转换成dB数,最后用经验公式修正。
均方差定义为:
峰值信噪比定义为:
其中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 ",sum); 41 printf("mean is: %lf ",mean); 42 printf("mse is: %lf ",mse); 43 printf("psnr is: %lf ",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 }