HEVC(一)psnr原理以及计算方式
峰值信噪比经常用作图像压缩等领域中信号重建质量的测量方法,它常简单地通过均方差(MSE)进行定义。两个m×n单色图像I和K,如果一个为另外一个的噪声近似,那么它们的的均方差定义为:
其中,MAXI是表示图像点颜色的最大数值,如果每个采样点用 8 位表示,那么就是 255。
Int iSize = iWidth*iHeight;//m*nd
UInt64 uiSSDtemp=0;
for(Int y = 0; y < iHeight; y++ )
{
for(Int x = 0; x < iWidth; x++ )
{
Intermediate_Int iDiff = (Intermediate_Int)( pOrg[x] - pRec[x] );//遍历获取diff
uiSSDtemp += iDiff * iDiff;//diff的平方
}
pOrg += iOrgStride;//算上图像的stride边界 边界没有内容,但是会在图像中
pRec += iRecStride;
}
const Int maxval = 255 << (pcPic->getPicSym()->getSPS().getBitDepth(toChannelType(ch)) - 8);//MAXI是表示图像点颜色的最大数值,如果每个采样点用 8 位表示,那么就是 255。现在获取当前ch的采样点比特位数,并进行位移
const Double fRefValue = (Double) maxval * maxval * iSize;//MAXi的平方除以MSE,MSE=diff*diff/size,因此psnr等价于 (MAXi的平方*size)/(diff*diff)
dPSNR[ch] = ( uiSSDtemp ? 10.0 * log10( fRefValue / (Double)uiSSDtemp ) : 999.99 );//这块没看懂为什么有个999.99,大概是设个INF,防止读取时为空吧
MSEyuvframe[ch] = (Double)uiSSDtemp/(iSize);//每个像素块的均值
参考博客:
https://blog.csdn.net/xrinosvip/article/details/88569111