我正在使用MATLAB实现HEVC帧内预测的项目。
我读了很多文章以在MATLAB中编写代码,最后我做到了。
(最有用的文章之一是这篇文章:
Intra Coding of the HEVC Standard)
该项目的主要目的是比较HEVC和AVC帧内预测,以显示HEVC将为重建图像提供比AVC更好的质量,因此,HEVC给出的最终SAE(绝对误差之和)应小于AVC。与AVC。
根据我的主管的说法,与HEVC解码器/编码器相对于图像每个区域中的细节量具有动态块划分的方法不同,对于图像上的每个帧内预测实现,我每次都必须具有特定的块大小,即一次使用64x64,一次使用32x32,依此类推,直到4x4。
现在我的工作中遇到了一个大问题,那就是HEVC的SAE远远大于AVC。我不知道为什么会这样?
如果需要,请告诉我以后再发布代码。
在实现HEVC帧内预测时,我也有一些疑问和疑问:
1-下面的线性插值函数及其相关参数(根据引用的文章)是否随块大小而变化,或者对于不同的块大小始终相同?
Px,y = ((32 − wy )· Ri,0 + wy · Ri+1,0 + 16 ) >> 5
cy = (y · d) >> 5
wy = (y · d) &31
2-(>>)移位运算符,就像普通的除法运算(例如>> 5等于有符号数除以32)还是带符号数的二进制移位?
(我说带符号的数字是由于与某些角度模式相关的负位移而引起的。同样值得注意的是,无符号数字的按位移位与带符号的数字产生的结果完全不同)
3-为了计算每种模式的成本,我使用SAE(绝对误差之和)代替了简化的全部成本函数。
C = DHad + λ · Rmode (HEVC cost function)
您是否认为使用SAE而不是HEVC成本函数会影响为每个模块选择最佳模式的过程?如果是这样,您是否可以使用SAE以外的任何其他更准确的方法来代替HEVC成本函数,以便为每个像素选择最佳的预测模式?
4-为了在h.265(HEVC)和h.264(AVC)帧内预测之间进行比较,HEVC重建的图片的总SAE应小于AVC。但是,我的结果并非如此,AVC的SAE小于HEVC。
我找不到导致此问题的原因。有人可以帮我吗?
最佳答案
1-实际上,此出版物中提到的线性插值公式不太正确。根据H.265标准的第8.4.4.2.3节“相邻样本的过滤过程”,应为:
Px,y = ((63 − wy )· Ri,0 + wy · Ri+1,0 + 32 ) >> 6
有关更多信息,请参见standard。关于您要根据块大小调整一些数字的问题:所谓的“强滤波”应仅应用于32x32内块的引用像素。对于较小的块,只能使用文章中的“引用样本平滑”。再次,如果您想了解详细信息,请检查standard中的同一部分。
2-在这些情况下,移位运算符表示绝对值的位移。要知道在matlab中将带符号的数字移位,有些函数会移位绝对值,有些函数会考虑符号而移位K2补码。
3-由于您的“项目是HEVC与AVC帧内预测之间的比较,以显示HEVC将提供更好的质量”,我想仅使用SAE或平方误差总和(SSE)就是有道理的。我认为,如果您像在HEVC成本函数中那样进行某种质量/比特率评估,则您需要向项目中添加不仅仅是帧内预测的内容,以便充分比较这两种标准。
4-是的,结果应该相反。检查您对SAE的计算。还要检查标准中规定的部分,以确保您正确地进行了引用 sample 过滤。
其他的东西:
1-虽然在HEVC中可以有64x64帧间预测块,但最多只能有32x32帧内块。
2-在matlab中使用整数时要小心,这也会搞砸我所有的计算。考虑一下您使用的整数位数是否足够,还是切换为 double 。加载图像时,默认情况下,值是8位无符号整数,您必须对它们进行类型转换以进行某些计算。