5.2.3 编程(www.cppentry.com)实现信噪比的计算
在进行图像增强过程中,对一幅含有噪声的图像在进行去噪之后图像质量是否有所提高,需要一个评价标准来衡量,因此,简单地引入图像的客观评价标准对去噪前后的图像质量进行衡量。
图像客观质量评价方法是先计算出被评价图像的某些统计特性和物理参量,最常用的是图像相似度的测量。图像相似度的测量通常是用处理后的图像与原图像之间的统计误差来衡量处理图像的质量,若误差越小,则从统计意义上来说,被评价图像与原图像的差异越小,图像的相似度就越高,获得的图像质量评价也就越高,此种评价方法大多适用于黑白图像及灰度图像的质量评价。常用的图像相似度测量参数有平均绝对误差(MAE)、均方误差(MSE)、归一化均方误差(NMSE)、信噪比(SNR)和峰值信噪比(PSNR)等。本节主要介绍图像的信噪比的计算方法并且编程(www.cppentry.com)实现,其他评价方法在第7章中将会有详细的介绍。
图像的信噪比的计算公式如下:
其中, 和 分别是图像长度和宽度上的像素个数, 和 分别是原始图像和去噪后的图像在点 处的灰度值。
说明 信噪比是用于比较被评价图像与原图像质量的参数,信噪比的数值越大,图像质量越好。
计算信噪比的函数为SNR(),它定义在demo程序的图像增强类CImgSpaceFilter中。
SNR()函数和PSNR()函数的说明及代码实现如下:
/****************************************** **************************** * * 函数名称: * SNR() * * 参数: * unsigned char* m_pSrcImgData-参照图像的数据 * * 返回值: * CString类型,图像的SNR * * 说明:分别传入指向原始图像和去噪后图像的数据的指针, 然后调用图像的信噪比的计算公式 * 对每个像素位置的像素值进行统计计算, 并将最后的计算结果返回 ****************************************** *******************************/ CString CImgEnhance::SNR(unsigned char* m_pSrcImgData) {
int byteCount; //DIB位图的字节数 int i; // LPBITMAPINFOHEADER lpbmi; // lpbmi=(LPBITMAPINFOHEADER)lpSrcDIB; // m_pSrcImgData=(LPBYTE)lpbmi+lpbmi-> biSize+sizeof(RGBQUAD)*lpbmi-> biClrUsed; //计算图像信噪比 double temp1=0.0; double temp2=0.0; //处理8位灰度图像 if (m_nBitCount==8) { //计算整幅DIB位图的字节数 byteCount =m_imgHeight*m_imgWidth*m_nBitCount/8; for( i=0; i<byteCount; i++) { temp1=temp1+(double)m_pImgData[i]*m_pImgData[i]; temp2=temp2+(double)(m_pImgData[i]- m_pSrcImgData[i])*(m_pImg Data[i]-m_pSrcImgData[i]); } } else { AfxMessageBox("只能处理8位灰度图像!"); return "ERROR"; } double SNR=temp1/temp2; SNR=10*log10(SNR);
CString StrSNR; StrSNR.Format("%f",SNR); return StrSNR;
} /**************************************** ****************************** * * 函数名称: * PSNR() * * 参数: * unsigned char* m_pSrcImgData-参照图像的数据 * * 返回值: * CString类型,图像的SNR * * 说明:分别传入指向原始图像和去噪后图像的数据的指针, 然后调用图像的峰值信噪比的计 * 算公式对每个像素位置的像素值进行统计计算, 并将最后的计算结果返回 ****************************************** ********************************/ CString CImgEnhance::PSNR(unsigned char* m_pSrcImgData) { int byteCount; //DIB位图的字节数 int i; //计算图像峰值信噪比 double temp1=0.0; double temp2=0.0; //处理8位灰度图像 if (m_nBitCount==8) { //计算整幅DIB位图的字节数 byteCount =m_imgHeight*m_imgWidth*m_nBitCount/8; for( i=0; i<byteCount; i++) { temp1=temp1+(double)m_pImgData[i]*m_pImgData[i]; temp2=temp2+(double)(m_pImgData[i] -m_pSrcImgData[i])*(m_pImg Data[i]-m_pSrcImgData[i]); } } else { AfxMessageBox("只能处理8位灰度图像!"); return "ERROR"; } double PSNR=m_imgHeight*m_imgWidth/temp2; PSNR=10*log10(255*255*PSNR); //PSNR即为峰值信噪比 CString StrPSNR; StrPSNR.Format("%f",PSNR); return StrPSNR; } |
图像的质量评价标准,如上述SNR等是纯误差测度,即原始图像与处理图像之间的数学统计差别,计算简单,用来评价图像的质量时仅仅考虑与原始图像相似程度的大小,忽视了图像内容对人眼的影响,有时与主观感知有较大差距,不能完整反映出图像的质量,因此该评价方法的使用具有一定局限性。
【责任编辑:
夏书 TEL:(010)68476606】