H.264中图象怎么样进行DCT编码
发布网友
发布时间:2022-05-12 19:08
我来回答
共1个回答
热心网友
时间:2023-10-19 01:41
H264的变换
H264的变换
h264把一个16*16的亮度宏块分成16个4*4的小块(Ln,n=0,1,…15),对每一个小块(Ln)做一个近似DCT的变换,生成F(Ln),再把每一个F(Ln)的左上角的DC系数抽出来组成一个4*4的块,对这个小块(LDc)在做一次Hadamard变换生成H(LDc)。与亮度块类似,对8*8的色度块,把它分成4个4*4的小块(Cn,n=0,1,2,3),对每一个小块(Ln)做一个近似DCT的变换,生成F(Cn),再把每一个F(Cn)的左上角的DC系数抽出来组成一个2*2的块,对这个小块(CDc)在做一次Hadamard变换生成H(CDc)。
这样,h264的变换一共有3种。一是4*4的近似DCT变换,二是4*4的Hadamard变换,三是2*2的Hadamard变换。
近似DCT变换:
4*4的DCT变换公式为:
Y=AXA’ = [a,a,a,a ] [X] [a,b,a,c]
[b,c,-c,-b] [a,c,-a,-b]
[a,-a,-a,a] [a,-c,-a,b]
[c,-b,b,-c] [a,-b,a,-c]
其中,a=1/2, b=(1/2)0.5cos(PI/8), c=(1/2)0.5cos(3*PI/8)
DCT变换有两个缺点,一是它不是整数变换,在做快速运算时,需要把系数放大成整数,计算完后再缩小。这种方法会产生误差,是编码端计算的结果和解码端计算出的结果不同。二是他的计算复杂,需要乘法运算。
H264改进了DCT变换,克服了上述缺点。方法是:
改变公式:
Y=AXA’=[1,1,1,1]* [a,a,a,a] [X] [1,1,1,d] *[a,b,a,b]
[1,d,-d,-1] [b,b,b,b] [1,d,-1,-1] [a,b,a,b]
[1,-1,-1,1] [a,a,a,a,] [1,-d,-1,1] [a,b,a,b]
[d,-1,1,-d] [b,b,b,b] [1,-1,1,-d] [a,b,a,b]
= [1,1,1,1] [X] [1,1,1,d] *[aa,ab,aa,ab]
[1,d,-d,-1] [1,d,-1,-1] [ab,bb,ab,bb]
[1,-1,-1,1] [1,-d,-1,1] [aa,ab,aa,ab]
[d,-1,1,-d] [1,-1,1,-d] [ab,bb,ab,bb]
= CXC’*E
其中,d=c/b~=0.414
改变系数,简化运算。
为了使矩阵运算没有乘法,把d从0.414改成0.5。当a=0.5不变时,为了保证运算的正交性,(1+d*d+d*d+1)*b*b=1,要把b改成(2/5) 0.5。
改变矩阵C的系数成为只有加减和左移运算,把后处理*E的运算放到量化矩阵里做。
H264的变换(2)
Y=CXC’*E = [1,1,1,1] [X] [1,2,1,1] *[aa,ab/2,aa, ab/2]
[2,1,-1,-2] [1,1,-1,-2] [ab/2,bb/4,ab/2,bb/4]
[1,-1,-1,1] [1,-1,-1,2] [aa,ab/2,aa,ab/2]
[1,-2,2,-1] [1,-2,1,-1] [ab/2,bb/4,ab/2,bb/4]
通过这三步变换,生成了一个改进的近似DCT变换,他的全部系数都是整数,编码端和解码端不会出现不匹配的现象。他的运算只包含加减和移位。最后一部分*E的运算挪到量化里和量化结合一起做。虽然他的性质没有DCT那么好,但经过测试,他的压缩性能与DCT相差无几。
Hadamard变换
对4*4的亮度DC系数矩阵,采用4*4的Hadamard变换。
Y = [1,1,1,1,] D [1,1,1,1] /2
[1,1,-1,-1] [1,1,-1,-1]
[1,-1,-1,1] [1,-1,-1,1]
[1,-1,1,-1] [1,-1,1,-1]
对2*2的色度DC系数矩阵,采用2*2的Hadamard变换。
Y = [1,1] D [1,1]
[1,-1] [1,-1]
Hadamard变换也是正交变换,它可以使能量更加集中。