您的位置:首页 > 其它

图像质量评估

2016-04-28 11:52 323 查看
图像质量评估

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

【客观评价方法】

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

其中M、N为图像的长和宽,ijf表示原始图像的象素值,‘ijf表示降质后图像的象素值

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

其中 L 为图像中像素的最大灰度值,一般采用255。





自己写的图像质量评估软件平台:

截图(测试图片来源网络)



//计算
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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: