zoukankan      html  css  js  c++  java
  • 求图像的信噪比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}} 
ight) 
= 20 cdot log_{10} left( frac{mathit{MAX}_I}{sqrt{mathit{MSE}}} 
ight)

      其中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 }
  • 相关阅读:
    MySQL中的字符串函数
    用google map实现周边搜索功能
    用 wait-notify 写一段代码来解决生产者-消费者问题
    equals和hashcode为什么要一起重写
    Java知多少(107)几个重要的java数据库访问类和接口
    Java知多少(106)程序与数据库连接
    Java知多少(105)套接字(Socket)
    Java知多少(104)网络编程之统一资源定位符URL
    Java知多少(103)网络编程之IP地址和InetAddress类
    Java知多少(102)多媒体基础
  • 原文地址:https://www.cnblogs.com/yongjiuzhizhen/p/3454626.html
Copyright © 2011-2022 走看看