H.264帧内预测及整数DCT变换_第1页
H.264帧内预测及整数DCT变换_第2页
H.264帧内预测及整数DCT变换_第3页
H.264帧内预测及整数DCT变换_第4页
H.264帧内预测及整数DCT变换_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 帧内预测帧内预测可以减少空域和频域的冗余度,获得更高的压缩效率.当块或宏块做帧内编码时,基于4X4的亮点和色度样本有多种预测方式.对于Intra4X4模式下,每个4X4的小块中的像素将通过邻块中已经解码的17个像素进行预测(图3(a)中从A至Q),预测模式分为9种(模式0到模式8),其中模式2为DC(直流)预测.其他8种模式的预测方向如图1及图2所示.QABCDEFGHIabcdJefghKjk1Lmn0PMN0P图12(直流)3(对角线向左下)4(对角线向右下)8(水平向上)1(水平)0(垂直)5(垂直向右)7(垂直向左)6(水平向下)丁丁一klmnqipH.26L4X4帧内预测模式(箭头

2、显示预测开始的方向;大约对应于模式8)图2.1亮度信号9种4X4预测模式1、模式0:DC预测,此种模式有如下4种情形:(1)若A,B,C,D,I,J,K,L均在图像界内,则从a到p均由如下公式计算,(A+B+C+D+I+J+K+L+4)3;(2)若A,B,C,D在图像外,I,J,K,L在图像之内,则a到p所有像素均如下计算,(I+J+K+L+2)2;与(2)相反,若A,B,C,D在图像内而I,J,K,L,在夕卜,则为(A+B+C+D+2)2;A,B,C,D,I,J,K,L均在图像外,a到p均取值128.在代码中,表示为:s0=0;if(block_available_up&block_avai

3、lable_left)s0=(P_A+P_B+P_C+P_D+P_I+P_J+P_K+P_L+4)/(2*BLOCK_SIZE);/如当前块上块和左块存在,则块内亮度值为上块参考点值与左块参考点值的均值。/后面加上4是因为/8是右移(取整)操作,加上4可以转换为四舍五入。elseif(!block_available_up&block_available_left)s0=(P_I+P_J+P_K+P_L+2)/BLOCK_SIZE;/如上块不存在,则取左块参考点值的均值elseif(block_available_up&!block_available_left)s0=(P_A+P_B+P_C

4、+P_D+2)/BLOCK_SIZE;/同上elses0=img-dc_pred_value;/如都不存在,则取128for(j=0;jBLOCK_SIZE;j+)for(i=0;imprrDC_PREDij=sO直流预测,DC_PRED为预测模式。2、模式0、1:垂直/水平预测垂直预测e,i,m由A观测得f,j,n由B预测得g,k,o由C观测得h,l,p由D观测得水平预测a,b,c,d由A观测得f,g,h由B预测得i,j,k,l由C观测得m,n,o,p由D观测得在代码中实现为:for(i=0;imprrVERT_PRED0i=img-mprrVERT_PRED1i=img-mprrVERT_

5、PRED2i=img-mprrVERT_PRED3i=(&P_A)i;/P_A等实际上是数组里的值(在上面有定义)。(&P_A)是得到数组名。/以上为垂直预测方式img-mprrHOR_PREDi0=img-mprrHOR_PREDi1=img-mprrHOR_PREDi2=img-mprrHOR_PREDi3=(&P_I)i;/以上为水平预测方式其他模式和以上的差不多,就不一一列了。3、当9种模式都预测完后,在rdoptc中,会遍历这9种预测模式,找到一种误差最小的方案基本实现代码如下:for(k=j=0;j4;j+)for(i=0;imprripmodeji;计算误差cost=(ipmod

6、e=mostProbableMode)?0:(int)floor(4*lambda);cost+=SATD(diff,input-hadamard);if(cost*min_cost)女口COST最小,则当前ipmode为best_ipmodebest_ipmode=ipmode;*min_cost=cost;二、整数DCT变换为什么要进行变换空间图像数据通常是很难压缩的:相邻的采样点具有很强的相关性(相互关联的),而且能量一般平均分布在一幅图像中,从而要想丢掉某些数据和降低数据精度而不明显影响图像质量,就要选择合适的变换,方法,使图像易于被压缩。适合压缩的变换方法要有这样几个性质:1、可以聚

7、集图像的能量(将能量集中到少数有意义的数值上);如下图:举个例子说明,下图是变换前的数据:kn700=-97L70l=-96L?02=-95L?03=-82m7l0=-95m7ll=-95m7l2=-94m7l3=-71m72J0=-96m72Jl=-96m72J2=-94m72J3=-61in730=-95m73l=-95in732=-95in733=-57以下是变换后的数据:h700=-1414m70l=-228m70J2=106m?03=-104Li710=-64m7ll=113m7l2=-62m7l3=59Li720=-10m72l=14m?22=-6m723=2可以看出,经变换后,数

8、据的能量基本上集中到左上方(低频信号)了,而变换后的数据完全可以通过反变换还原成原来的数据。为了达到压缩文件的目的,我们就可以丢弃掉一些能量低的数据(高频信号),而对图像质量影响很小。2、可以除去数据之间的相关性(以使丢掉不重要的数据对图像的质量影响很少)。3、变换方法应该适合用软硬件实现。图7.1lD和2-DDCT变换H.264中的整数变换H.264与先前的标准相似,对残差采用基于块的变换编码,但变换是整数操作而不是实数运算,其过程和DCT基本相似。这种方法的优点在于:在编码器中和解码器中允许精度相同的变换和反变换,便于使用简单的定点运算方式。也就是说,这里没有反变换误差。变换的单位是4X4

9、块,而不是以往常用的8X8块。由于用于变换块的尺寸缩小,运动物体的划分更精确,这样,不但变换计算量比较小,而且在运动物体边缘处的衔接误差也大为减小。为了使小尺寸块的变换方式对图像中较大面积的平滑区域不产生块之间的灰度差异,可对帧内宏块亮度数据的16个4X4块的DC系数(每个小块一个,共16个)进行第二次4X4块的变换,对色度数据的4个4X4块的DC系数(每个小块一个,共4个)进行2X2块的变换(见图3)。H.264为了提高码率控制的能力,量化步长的变化的幅度控制在12.5%左右,而不是以不变的增幅变化。变换系数幅度的归一化被放在反量化过程中处理以减少计算的复杂性。为了强调彩色的逼真性,对色度系

10、数采用了较小量化步长。4X4整数变换矩阵公式推导为了说明标准中整数变换和反变换,先设d=c/b,LZaaa_a00o-1111bc一c一b0b001d-d-1A=aaaa00a011-11-C_bb一C-000b-d一11-d-abacrl11d_a000aca一b1d110b00AT=a一cab1-d1100a0-C-bac_-11一d-000b.图3齒0巒翅12ii13i10a111415巒22、23:-x-l24魁25y=AXAT=aaaaabacbcc-bXaca一baaaaacab-CbbC-abac-我们可以把DCT变换写成下式:其中,为了保证正交,a,b,c,d的值可分别如下设置

11、(其实也就是余弦变换的设把两边的对称矩阵移到左边可得:(下一步运算没搞清楚是怎么回事。)aY0聶0000000_000a-1000a10_000b_000_盯2(ab)Ta2rl111-111d(ab)-162(ab)Tr21dd-11d-1-1Xa2(ab)-ia-2(ab)T11-111d113)tIT2(ab)TIT2-11-d-_1-11_cL这一步也有点问题:-1111-111dr2aaba2ab1d-d11d11abb2abb2Y=1-1X1-1上a2aba2ab-d11_d_1-11一dabb2abb2_置?):根据假设,上式可化为:p000-oooY00ao_00o-1111-

12、1dd11111d-11-cLX-111d-1d111d11-111d-a00(Tl060ol00a0-000此时,d的值为0.4142。这样的话,还是实数运算。如我们令d=l/2,则b=sqrt(2/5).c=sqrt(l/10),同样,可以保证矩阵的正交,同时,可以把运算变为整数运算。1/2可以提到矩阵外面,并与右边的点乘合并,得y=xcf)其中,在JM编码器中,变换过程只包括了后面的点乘实际上是在量化过程中进行,因为后面的点乘还有实数运算,实数运算将不可避免地产生精度误差,而且运算量巨大。而量化本身就会丢失一些信号,因些,这些实数运算放在量化过程中将大大的降低变换的运算率同时又不明显影响

13、精度?然而,X4的矩阵运算如果按常规算法的话仍要进行64次乘法运算和48次加法,这将耗费较多的时间,于是在H.264中,有一种改进的算法(蝶形算法)可以减少运算的次数。这种矩阵运算算法构造非常巧妙,利用构造的矩阵的整数性质和对称性,可完全将乘法运算转化为加法运算。x(0)x(0)+X1/2禺1)Xr(2)+X2xOX+1/2儿O变换过程在JM中代码实现如下:/Horizontaltransform水平变换,其实就是左乘Cf,for(j=0;jBLOCK_SIZE&!lossless_qpprime;j+)for(i=0;im7ij+img-m7i1j;m5i1=img-m7ij-img-m7i

14、1j;img-m70j=(m50+m51);img-m72j=(m50-m51);img-m71j=m53*2+m52;img-m73j=m53-m52*2;/Verticaltransform垂直变换,其实就是右乘CfTfor(i=0;iBLOCK_SIZE&!lossless_qpprime;i+)for(j=0;jm7ij+img-m7ij1;m5j1=img-m7ij-img-m7ij1;img-m7i0=(m50+m51);img-m7i2=(m50-m51);img-m7i1=m53*2+m52;img-m7i3=m53-m52*2;反变换:aaa00o-1111Ic一b0b001

15、d-d-1-aa00a01-111b一C-000b-d-11_daa一aa11d-a00o-d-1一10b00-d-1100a0-11一d-000b.a=1/2,b=sqrt(2/5),c=sqrt(1/10),d=1/2我们令:则有:可得:因为AAT=I,所以可得:0o-qTp00_CT=CT100a000qT0_000b-.000bl把右边的矩阵乘到左边,得:x=CTb200b2000一八(ab)Ta2(ab)(ab)1b2(ab)Tb2a2(ab)la2Cab)_Cab)lb2(ab)Tbz000_rdl00r100M00J00000bl_000y00000Bc,Ita0ooa000a2

16、00006000Z?0006200cr1=ct=ci00a000a000a20Looo-0006-_000b2_在正变换中,Y=AXAT因000a00on0b000b00A=00a0G,夕=CT00a0J_000b一_000bi得:_a2(必)-】a2(ab)T-.x=cr】Yg(ab)-b2(ab)Ttr2(CT1)7a2Cab)1a2(必)-】3)Tb2(ab)Tb2转化为点阵形式:12ab2b2b2ababab12b2b2ab9221a2a2x=cr(Y(g)E)c其中:a2aba2abE;=abb2abb2公aba2abLabb2abb2式中的除2运算可由右移一位来实现。同样,中间的点

17、乘是在反量化过程中进行,在反变换过程中,也使用了蝶形算法来简化运算。/IDCT.反变换for(j=0;jBLOCK_SIZE&!lossless_qpprime;j+)for(i=0;im7ij;m60=(m50+m52);m61=(m50-m52);m62=(m511)-m53;m63=m51+(m531);for(i=0;im7ij=m6i+m6i1;img-m7i1j=m6i-m6i1;/verticalfor(i=0;iBLOCK_SIZE&!lossless_qpprime;i+)for(j=0;jm7ij;m60=(m50+m52);m61=(m50-m52);m62=(m511)

18、-m53;m63=m51+(m531);for(j=0;jresidue_transform_flag)这一部分可能跟量化过程或DC变量有关,img-m7ij=min(img-max_imgpel_value,max(0,(m6j+m6j1+(long)img-mpri+block_xj+block_yDQ_BITS);img-m7ij1=min(img-max_imgpel_value,max(0,(m6j-m6j1+(long)img-mpri+block_xj1+block_yDQ_BITS);elseif(lossless_qpprime)img-m7ij=m6j+m6j1;img-m

19、7ij1=m6j-m6j1;elseimg-m7ij=(m6j+m6j1+DQ_ROUND)DQ_BITS;img-m7ij1=(m6j-m6j1+DQ_ROUND)DQ_BITS;问题:1、我从运行时得到的初始矩阵全为负值,是否有问题?是否是运算后除去了DC变量的残差值,或者是编码器之前就因某种原因已经经过了转换?kn700=-97Li701=-96L?02=-95L?03=-82m7l0=-95m7ll=-95m7l2=-94m7l3=-71m720=-96m72l=-96m722=-94m723=-61m730=-95m73l=-95m732=-95m733=-57为运算方便。这是转置后

20、的结果)2、反变换的结果确是正值,相差好大?(是否是加上了一个DC信号128,如减去128则结果与输入值误差就很小了)?m?00=32m70l=36m?l0=33m7ll=35m?20=35m72l=33m?30=37m73l=32m7021=35m7l21=36m7221=38m7321=39ni7031=46m7l3J=52m723J=62m733J=67减去128的结果:h700=-96710=-957210=-93m70l=-92m7ll=-93m721l=-95m702=-93m7l2=-92m722=-90n?32=-89m703=-82m7l3=-76m723=-66但有的矩阵则

21、比较精确如:m700=2m7l0=10m?20=13m730=4m70l=lm7ll=12m?2l=37m731=27为运算方便。m702=-8m?l2=-18m?22=-23m?32=-17m703=-5m?23=-34m?33=-25这是转置后的结果)反变换的结果n700=5m70l=6m702=-llm703=-6n7l0=26m?ll=24m7l2=-16m7l3=-19n720=30m7213=41m722=-15m723=-24n730=14m7313=42m732=-5m?33=-ll三、量化H.264使用标量量化器,需要满足下述条件:1)避免除法等浮点运算,采用只有加、减、移位

22、等算术运算;(2)合并正向变换矩阵Ef和反向变换矩阵Ei的比例因子运算。量化过程如下:Zij=round(Yij/Qstep)其中Y.是正向变换后系数,Qst:p是量化步长,Zij是量化后的系数。round是四舍五入运算。在H.264中有52个量化步长,用量化参数索引来表示,量化步长与量化参数索引之间的关系如下表:索引QP表7.3在H.264中的.化步长与化参数索引对照傲化步长Qstep凰化参数索引QP址化步长QstepW:化参数索引QPIft化步长!Qstep谊化参数索引QP牝步长Qstepo0.625132.75261339560.6875143.2527144064一20.8125153

23、.528164177一30.875164291814280174.53020I43!881.12518531224410461.25195.53226|4511271.375206.53328|4612881.62521734324714491.752283536翻160102239364049176112.2524103744208122.525H385251224在这个表中我们可以看出,当QP大于6时,量化参数索引QP每增加6,量化步长就加一倍。在QP小于6时,QP每加1,则步长加12.5%。(至于QP值的选定,编码器根据图像值实际的动态范围自动改变QP值,在编码长度和图像精度之间折中,以

24、达到整体最佳效果。在码流控制模块中设定)。接下来处理量化因子,a2,ab/2,b2/4可以按下列步骤合并在量化器中。首先,对输入块X进行变换得到变换系数矩阵,W=CXCT。其次,对对矩阵中每个系数按下式进行量化:Z=round(W*PF/Qstep)ijij其中PF是Wij对应的比例因子矩阵中的值。为了避免除法操作,PF/Qstep可以用乘法因子MF和右移来实现,即Zij=round(Wij*MF/2qbits)其中,在下面我们会举个例子说明这个转换:MF/2qbits=PF/Qstepqbits=15+floor(QP/6)因此,原公式可化为|Zij|=(|Wij|*MF+f)qbitssi

25、gn(Zij)=sign(Wij),(如W.=0则返回IZ,否则返回-ZijI,即结果与W.同号,问题1、由于W.*MF/2qbits的计算结果是整数,所以round函数已无用,而右移操作是去尾操作,f的值可能是代替了round函数,使得原去尾取整变换为四舍五入。但f的值本应该是2qbits/2,在这里,f的取值却是帧内2qbits/3,帧间2qbits/6,不知是何原因,有待进一步学习。问题2、还有为何要在原值和结果上加上绝对值,是否是为了防止溢出?)。f的在代码中定义为qp_const:if(img-type=I_SLICE)qp_const=(1q_bits)/3;/intraelse

26、l6qp_const=(1q_bits)/6;/inter例,当量化参数QP=4时,对应的实际量化步长为Qstep=l。(i,j)位置为(0,0)时对应的PF=a2=0.25。qbits=15+floor(QP/6)=15,2qbits=215=32768。根据MF/2qbits=PF/Qstep,得到在(0,0)处的乘法因子MF为MF=(32768*0.25)/l=8l92同理可得在其他位置的乘法因子MF,见下表。这些MF值在程序中定义为一个三维数组:constintquant_coef644=/quant_coef量化系数quantitycoefficientl3l07,8066,l3l0

27、7,8066,8066,5243,8066,5243,l3l07,8066,l3l07,8066,8066,5243,8066,5243,ll9l6,7490,ll9l6,7490,7490,4660,7490,4660,ll9l6,7490,ll9l6,7490,7490,4660,7490,4660,l0082,6554,l0082,6554,6554,4l94,6554,4l94,l0082,6554,l0082,6554,6554,4l94,6554,4l94,9362,5825,9362,5825,5825,3647,5825,3647,9362,5825,9362,5825,582

28、5,3647,5825,3647,8l92,5243,8l92,5243,5243,3355,5243,3355,8l92,5243,8l92,5243,5243,3355,5243,3355,7282,4559,7282,4559,4559,2893,4559,2893,7282,4559,7282,4559,4559,2893,4559,2893;以上量化过程在代码中实现为:for(coeff_ctr=0;coeff_ctrfield_picture|(img-MbaffFrameFlag&currMB-mb_field)/选择扫描方式/Alternatescanforfieldcodingi=FIELD_SCANcoeff_ctr0;j=FIELD_SCANcoeff_ctrl;elsei=SNGL_SCANcoeff_ctr0;j=SNGL_SCANcoeff_ctrl;run+;ilev=0;level=(abs(img-m7ij)*quant_coefqp_remij+qp_const)q_bits

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论