图像质量评估

图像质量评估

http://jingyan.baidu.com/article/cbf0e500f5505a2eab28936e.html

【客观评价方法】
图像质量的客观评价方法是根据人眼的主观视觉系统建立数学模型,并通过具体的公式计算图像的质量。传统的图像质量客观评价方法主要包括均方误差(MSE,mean squared error)和峰值信噪比(PSNR,peak signal to noise rate)。均方误差法首先计算原始图像和失真像象素差值的均方值,然后通过均方值的大小来确定失真图像的失真程度。计算公式如图。
其中M、N为图像的长和宽,ijf表示原始图像的象素值,‘ijf表示降质后图像的象素值

PSNR作为衡量图像质量的重要指标,基于通信理论而提出,是最大信号量与噪声强度的比值。由于数字图像都是以离散的数字表示图像的像素,因此采用图像的最大象素值来代替最大信号量。具体公式如图。
其中 L 为图像中像素的最大灰度值,一般采用255。

图像质量评估_第1张图片

图像质量评估_第2张图片

自己写的图像质量评估软件平台:
截图(测试图片来源网络)

图像质量评估_第3张图片

//计算
void CImagesQualityEvaluationToolDlg::OnBnClickedButton2()
{
    if((image_in_1.rows != image_in_2.rows)||(image_in_1.cols != image_in_2.cols)
        ||(image_in_1.rows != image_in_2.rows)||(image_in_1.cols != image_in_2.cols))
    {
        CString str_Problem("图片1和2大小不一致");
        GetDlgItem(IDC_EDIT1)->SetWindowText(str_Problem);
        return;
    }

    //unsigned char***imgrow= NULL;
    //imgrow=ZL_allocu_3(image_in_1.rows,image_in_1.cols,3);        //allocate memory

    double MSE_b=0.,MSE_g=0.,MSE_r=0.,MSE=0.,PSNR_b=0.,PSNR_g=0.,PSNR_r=0.,PSNR=0.;
    for (int row = 0; row < image_in_1.rows; row++)
    {
        for (int col = 0; col < image_in_1.cols; col++)
        {
            /*
            //[row, col]像素的第 1 通道地址被 * 解析(b通道)
            imgrow[row][col][2] = *(image_in_1.data + image_in_1.step[0] * row + image_in_1.step[1] * col);

            //[row, col]像素的第 2 通道地址被 * 解析(g通道)
            imgrow[row][col][1] = *(image_in_1.data + image_in_1.step[0] * row + image_in_1.step[1] * col + image_in_1.elemSize1());

            //[row, col]像素的第 3 通道地址被 * 解析(r通道)
            imgrow[row][col][0] = *(image_in_1.data + image_in_1.step[0] * row + image_in_1.step[1] * col + image_in_1.elemSize1() * 2);
            */
            MSE_b += pow((double)(*(image_in_2.data + image_in_2.step[0] * row + image_in_2.step[1] * col) - *(image_in_1.data + image_in_1.step[0] * row + image_in_1.step[1] * col)),2);
            MSE_g += pow((double)(*(image_in_2.data + image_in_2.step[0] * row + image_in_2.step[1] * col + image_in_2.elemSize1()) - *(image_in_1.data + image_in_1.step[0] * row + image_in_1.step[1] * col + image_in_1.elemSize1())),2);
            MSE_r += pow((double)(*(image_in_2.data + image_in_2.step[0] * row + image_in_2.step[1] * col + image_in_2.elemSize1() * 2) - *(image_in_1.data + image_in_1.step[0] * row + image_in_1.step[1] * col + image_in_1.elemSize1() * 2)),2);    
        }
    }
    int WH = image_in_1.rows * image_in_1.cols;

    MSE_b = MSE_b/WH;
    MSE_g = MSE_g/WH;
    MSE_r = MSE_r/WH;

    if(MSE_b != 0.)
    {
        PSNR_b = 10*log(pow(255.,2)/MSE_b);
    }
    if(MSE_g != 0.)
    {
        PSNR_g = 10*log(pow(255.,2)/MSE_g);
    }
    if(MSE_r != 0.)
    {
        PSNR_r = 10*log(pow(255.,2)/MSE_r);
    }

    PSNR = (PSNR_b+PSNR_g+PSNR_r)/3;

    CString str_PSNR;
    str_PSNR.Format("%f",PSNR);
    GetDlgItem(IDC_EDIT1)->SetWindowText(str_PSNR); 
}
//加载图像
void CImagesQualityEvaluationToolDlg::OnBnClickedButton1()
{
    CFileDialog  Dlg(1,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("TXT Files(*.PNG)|*.JPG|All Files(*.*)|*.*"));
     //打开文件
    if(Dlg.DoModal() == IDOK)                   //是否打开成功
    {
        CString FilePathName;                   //文件名参数定义
        //FilePathName(_T(""));                 //初始化
        FilePathName =  Dlg.GetPathName();      //取得文件路径及文件名
        SetDlgItemText(IDC_EDIT3,FilePathName); //在一个地址为IDC_EDIT3的editbox中显示文件名

        char *p =(LPSTR)(LPCSTR)FilePathName;

        image_in_1 = imread(p);

        IplImage *Ipl_image_in;
        Ipl_image_in=&IplImage(image_in_1);
        DrawPicToHDC(Ipl_image_in, IDC_STATIC_P);//IDC_STATIC
    }
    else                                         //打开失败处理
    {
        MessageBox(_T("打开失败"),NULL,MB_OK);
    }

}

你可能感兴趣的:(Image,Algorithm)