1. 程式人生 > 其它 >HEVC(一)psnr原理以及計算方式

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