zl程序教程

您现在的位置是:首页 >  大数据

当前栏目

HEVC学习之琐事(四):如何计算PSNR

计算学习 如何 HEVC
2023-09-14 08:57:58 时间
p 在HEVC官方参考软件HM中,计算PSNR的代码如下,当然还有很多工具计算PSNR。 /p p 现在提供一种很方便的工具,只需给出原始YUV文件和解码或重构后的YUV文件就可以计算出其PSNR。软件下载地址为: a target= _blank href= http://download.csdn.net/detail/frd2009041510/8240547 点击打开链

在HEVC官方参考软件HM中,计算PSNR的代码如下,当然还有很多工具计算PSNR。

现在提供一种很方便的工具,只需给出原始YUV文件和解码或重构后的YUV文件就可以计算出其PSNR。软件下载地址为:点击打开链接

为了验证其正确性,本人测试了一下,结果如下图所示。

下图是HM得出的结果:


下图是该软件测出的结果:


结果一致。


Void TEncGOP::xCalculateAddPSNR( TComPic* pcPic, TComPicYuv* pcPicD, const AccessUnit accessUnit, Double dEncTime )

 Int x, y;

 UInt64 uiSSDY = 0;

 UInt64 uiSSDU = 0;

 UInt64 uiSSDV = 0;

 Double dYPSNR = 0.0;

 Double dUPSNR = 0.0;

 Double dVPSNR = 0.0;

 //===== calculate PSNR =====

 Pel* pOrg = pcPic - getPicYuvOrg()- getLumaAddr();

 Pel* pRec = pcPicD- getLumaAddr();

 Int iStride = pcPicD- getStride();

 Int iWidth;

 Int iHeight;

 iWidth = pcPicD- getWidth () - m_pcEncTop- getPad(0);

 iHeight = pcPicD- getHeight() - m_pcEncTop- getPad(1);

 Int iSize = iWidth*iHeight;

 for( y = 0; y iHeight; y++ )

 for( x = 0; x iWidth; x++ )

 Int iDiff = (Int)( pOrg[x] - pRec[x] );

 uiSSDY += iDiff * iDiff;

 pOrg += iStride;

 pRec += iStride;

 iHeight = 1;

 iWidth = 1;

 iStride = 1;

 pOrg = pcPic - getPicYuvOrg()- getCbAddr();

 pRec = pcPicD- getCbAddr();

 for( y = 0; y iHeight; y++ )

 for( x = 0; x iWidth; x++ )

 Int iDiff = (Int)( pOrg[x] - pRec[x] );

 uiSSDU += iDiff * iDiff;

 pOrg += iStride;

 pRec += iStride;

 pOrg = pcPic - getPicYuvOrg()- getCrAddr();

 pRec = pcPicD- getCrAddr();

 for( y = 0; y iHeight; y++ )

 for( x = 0; x iWidth; x++ )

 Int iDiff = (Int)( pOrg[x] - pRec[x] );

 uiSSDV += iDiff * iDiff;

 pOrg += iStride;

 pRec += iStride;

 Int maxvalY = 255 (g_bitDepthY-8);

 Int maxvalC = 255 (g_bitDepthC-8);

 Double fRefValueY = (Double) maxvalY * maxvalY * iSize;

 Double fRefValueC = (Double) maxvalC * maxvalC * iSize / 4.0;

 dYPSNR = ( uiSSDY ? 10.0 * log10( fRefValueY / (Double)uiSSDY ) : 99.99 );

 dUPSNR = ( uiSSDU ? 10.0 * log10( fRefValueC / (Double)uiSSDU ) : 99.99 );

 dVPSNR = ( uiSSDV ? 10.0 * log10( fRefValueC / (Double)uiSSDV ) : 99.99 );

 /* calculate the size of the access unit, excluding:

 * - any AnnexB contributions (start_code_prefix, zero_byte, etc.,)

 * - SEI NAL units

 UInt numRBSPBytes = 0;

 for (AccessUnit::const_iterator it = accessUnit.begin(); it != accessUnit.end(); it++)

 UInt numRBSPBytes_nal = UInt((*it)- m_nalUnitData.str().size());

#if VERBOSE_RATE

 printf("*** %6s numBytesInNALunit: %u\n", nalUnitTypeToString((*it)- m_nalUnitType), numRBSPBytes_nal);

#endif

 if ((*it)- m_nalUnitType != NAL_UNIT_PREFIX_SEI (*it)- m_nalUnitType != NAL_UNIT_SUFFIX_SEI)

 numRBSPBytes += numRBSPBytes_nal;

 UInt uibits = numRBSPBytes * 8;

 m_vRVM_RP.push_back( uibits );

 //===== add PSNR =====

 m_gcAnalyzeAll.addResult (dYPSNR, dUPSNR, dVPSNR, (Double)uibits);

 TComSlice* pcSlice = pcPic- getSlice(0);

 if (pcSlice- isIntra())

 m_gcAnalyzeI.addResult (dYPSNR, dUPSNR, dVPSNR, (Double)uibits);

 if (pcSlice- isInterP())

 m_gcAnalyzeP.addResult (dYPSNR, dUPSNR, dVPSNR, (Double)uibits);

 if (pcSlice- isInterB())

 m_gcAnalyzeB.addResult (dYPSNR, dUPSNR, dVPSNR, (Double)uibits);

 Char c = (pcSlice- isIntra() ? I : pcSlice- isInterP() ? P : B);

 if (!pcSlice- isReferenced()) c += 32;

#if ADAPTIVE_QP_SELECTION

 printf("POC %4d TId: %1d ( %c-SLICE, nQP %d QP %d ) %10d bits",

 pcSlice- getPOC(),

 pcSlice- getTLayer(),

 pcSlice- getSliceQpBase(),

 pcSlice- getSliceQp(),

 uibits );

#else

 printf("POC %4d TId: %1d ( %c-SLICE, QP %d ) %10d bits",

 pcSlice- getPOC()-pcSlice- getLastIDR(),

 pcSlice- getTLayer(),

 pcSlice- getSliceQp(),

 uibits );

#endif

 printf(" [Y %6.4lf dB U %6.4lf dB V %6.4lf dB]", dYPSNR, dUPSNR, dVPSNR );

 printf(" [ET %5.0f ]", dEncTime );

 for (Int iRefList = 0; iRefList iRefList++)

 printf(" [L%d ", iRefList);

 for (Int iRefIndex = 0; iRefIndex pcSlice- getNumRefIdx(RefPicList(iRefList)); iRefIndex++)

 printf ("%d ", pcSlice- getRefPOC(RefPicList(iRefList), iRefIndex)-pcSlice- getLastIDR());

 printf("]");







超越最新视频压缩标准H.266,字节跳动编码新技术让视频缩小13% 联合视频专家组 JVET 官网显示,字节跳动设立在美国的研发团队于今年初发起了一项视频压缩技术提案,并命名为 DAM(Deep-filtering with Adaptive Model-selection)。相比 H.266/VVC 最新标准,DAM 能够为视频编码性能带来显著提升,亮度信号 Y 可实现 10.28% 的性能增益。两个色度信号 U 和 V 的性能增益也分别达到 28.22% 和 27.97%。这是业界公开的单个智能编码工具的最佳性能增益。
如何将图像压缩10倍?阿里工程师有个大胆的想法! 小叽导读:如何将单张图片由120k 压缩到了平均13k?阿里工程师做到了!并且将欧式距离计算平均耗时做到9微秒。今天,阿里巴巴技术专家萧冷将公开从初步尝试到优化的过程,希望对你有所帮助。
Netflix的视频算法主管Anne Aaron撰文对视频编解码的未来发展方向,基于块的混合编码,画质评定新方法,以及创新思维。
《数字视频和高清:算法和接口》一1.4.1量化 本节书摘来华章计算机《数字视频和高清:算法和接口》一书中的第1章 ,第1.4.1节, [加]查尔斯·波因顿(Charles Poynton)著 刘开华 褚晶辉 马永涛 吕卫 宫霄霖 等译 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。
《数字视频和高清:算法和接口》一3.4“编码100”难题和非线性图像编码 本文讲的是数字视频和高清:算法和接口一3.4“编码100”难题和非线性图像编码,本节书摘来华章计算机《数字视频和高清:算法和接口》一书中的第3章,第3.4节, George T.Heineman Gary Pollice StanleySelkow 著杨晨 曹如进 译 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。
用更少的钱看更清晰的视频——详谈阿里云窄带高清 在云栖社区在线技术培训上,阿里云高级视频专家江文斐为大家详细讲述了阿里窄带高产品的工作原理和使用用场景。通过使用窄带高清,能够让客户在成本和视觉体验上达到最佳平衡。