视频编码中的几种变换

  • Hadamard变换

用于SATD的计算

Hadamard矩阵

只有1,-1构成的正交矩阵,例如
H 2 = [ 1 1 1 − 1 ] H 4 = [ 1 1 1 1 1 − 1 1 − 1 1 1 − 1 − 1 1 − 1 − 1 1 ] H_2= \begin{bmatrix} 1 & 1 \\ 1 & -1 \\ \end{bmatrix}\\ H_4= \begin{bmatrix} 1 &1 &1 &1\\ 1 &-1 &1 &-1\\ 1 &1 &-1 &-1\\ 1 &-1 &-1 &1 \end{bmatrix}\\ H2=[1111]H4=1111111111111111

有hadamard矩阵的推导公式
H 2 k + 1 = [ H 2 k H 2 k H 2 k − H 2 k ] H_{2^{k+1}}= \begin{bmatrix} H_{2^k} & H_{2^k} \\ H_{2^k} & -H_{2^k} \\ \end{bmatrix} H2k+1=[H2kH2kH2kH2k]

变换

有矩阵 A 4 A_4 A4,则其hadamard变换为
A 4 ′ = H 4 ⋅ A 4 ⋅ H 4 A'_4=H_4·A_4·H_4 A4=H4A4H4


  • DCT离散余弦变换

离散余弦矩阵:

在这里插入图片描述

实例:

D C T 4 = [ 0.5000000 0.5000000 0.5000000 0.5000000 0.6532815 0.2705981 − 0.2705981 − 0.6532815 0.5000000 − 0.5000000 − 0.5000000 0.5000000 0.2705981 − 0.6532815 0.6532815 − 0.2705981 ] DCT_4= \begin{bmatrix} 0.5000000 & 0.5000000 & 0.5000000& 0.5000000\\ 0.6532815& 0.2705981& -0.2705981& -0.6532815\\ 0.5000000 & -0.5000000 & -0.5000000& 0.5000000\\ 0.2705981& -0.6532815& 0.6532815& -0.2705981\\ \end{bmatrix} DCT4=0.50000000.65328150.50000000.27059810.50000000.27059810.50000000.65328150.50000000.27059810.50000000.65328150.50000000.65328150.50000000.2705981

作用

将空域(space)的信号转换到频域(frequency)上,拥有良好的去矩阵相关性,为图像视频压缩后期的量化(Quantification)做前期准备,DCT变换本身是无损(lossless)的,但量化确实有损的。

过程

  • FDCT(Forward DCT)
    有DCT的n阶矩阵 M n M_n Mn,矩阵 A n A_n An的FDCT变化为 A n ′ = M n ⋅ A n ⋅ M n T A'_n=M_n·A_n·M_n^T An=MnAnMnT
  • IDCT(Inverse DCT)
    有DCT的n阶矩阵 M n M_n Mn,矩阵 A n A_n An的IDCT变化为 A n ′ = M n T ⋅ A n ⋅ M n A'_n=M_n^T·A_n·M_n An=MnTAnMn

效果

矩阵 m m m经过FDCT(Forward DCT)转换后的矩阵 m ′ m' m,其左上角(即[0,0]位置)的值成为DC值,其余所有位置的值成为AC值。DC值可被看作该矩阵的均值,因为它与该矩阵的所有值都有关。

  • 高频分量:
    距离DC越近的值(靠左上角的值)越大
  • 低频分量:
    距离DC越远的值(靠右下角的值)越小,接近于0

图像的相关性越大,DCT转换后的效果越明显,即左上角大值,右下角趋于0
F D C T ( [ 13 34 205 255 9 43 198 254 11 35 207 254 9 36 210 237 ] ) = [ 502.500000 − 403.842775 18.500000 89.886112 4.493714 − 4.553301 9.337282 − 6.906854 − 3.000000 3.444151 − 4.000000 8.314916 3.009408 − 4.406854 4.250312 6.053301 ] FDCT( \begin{bmatrix} 13& 34& 205& 255\\ 9& 43& 198& 254\\ 11& 35& 207& 254\\ 9& 36& 210& 237\\ \end{bmatrix} )= \begin{bmatrix} 502.500000& -403.842775& 18.500000& 89.886112\\ 4.493714& -4.553301& 9.337282& -6.906854\\ -3.000000& 3.444151& -4.000000& 8.314916\\ 3.009408& -4.406854& 4.250312& 6.053301\\ \end{bmatrix} FDCT(13911934433536205198207210255254254237)=502.5000004.4937143.0000003.009408403.8427754.5533013.4441514.40685418.5000009.3372824.0000004.25031289.8861126.9068548.3149166.053301
将一副图像分别进行 F D C T 4 FDCT_4 FDCT4 F D C T 16 FDCT_{16} FDCT16变换后:
在这里插入图片描述
能够发现每个块(block)的信息都堆积到了左上角


  • 整数离散余弦变换

DCT变换的缺点

由于DCT变换中含有超越函数cos,没有任何机器可以精确的计算出它的值,不同的精确的会产生不同的误差,况且在DCT变换中还有求和操作(矩阵点乘中的行列乘积和),这样会导致误差的积累,进而最后的输出和输入不同,同时大量的浮点数计算使得计算量增大。

改进

DCT变换 A n ′ = M n ∗ A n ∗ M n T A'_n=M_n*A_n*M_n^T An=MnAnMnT中DCT矩阵 M n M_n Mn的实质为
M n = [ a a a a b c − c b a − a − a a c − b b − c ] a = 1 2 , b = 1 2 c o s ( π 8 ) , c = 1 2 c o s ( 3 π 8 ) M_n= \begin{bmatrix} a& a& a& a\\ b& c& -c& b\\ a& -a& -a& a\\ c& -b& b& -c\\ \end{bmatrix}\\ a=\frac{1}{2},b=\sqrt{\frac{1}{2}}cos(\frac{\pi}{8}),c=\sqrt{\frac{1}{2}}cos(\frac{3\pi}{8}) Mn=abacacabacababaca=21,b=21 cos(8π),c=21 cos(83π)

改造下 M n M_n Mn
M n = [ a a a a b c − c b a − a − a a c − b b − c ] = [ a b a b ] [ 1 1 1 1 1 c b − c b 1 1 − 1 − 1 1 c b − 1 1 − c b ] = a ⋅ M n ′ M_n= \begin{bmatrix} a& a& a& a\\ b& c& -c& b\\ a& -a& -a& a\\ c& -b& b& -c\\ \end{bmatrix}= \begin{bmatrix} a&b&a&b\\ \end{bmatrix} \begin{bmatrix} 1& 1& 1& 1\\ 1& \frac{c}{b}& -\frac{c}{b}& 1\\ 1& -1& -1& 1\\ \frac{c}{b}& -1& 1& -\frac{c}{b}\\ \end{bmatrix}=\mathbf{a}·M'_n Mn=abacacabacababac=[abab]111bc1bc111bc11111bc=aMn
则有
A n ′ = M n ⋅ A n ⋅ M n T = ( [ a b a b ] [ 1 1 1 1 1 c b − c b 1 1 − 1 − 1 1 c b − 1 1 − c b ] ) ⋅ A n ⋅ ( [ 1 1 1 c b 1 c b − 1 − 1 1 − c b − 1 1 1 1 1 − c b ] [ a b a b ] ) = [ 1 1 1 1 1 c b − c b 1 1 − 1 − 1 1 c b − 1 1 − c b ] ) ⋅ A n ⋅ ( [ 1 1 1 c b 1 c b − 1 − 1 1 − c b − 1 1 1 1 1 − c b ] ⨂ [ a 2 a b a 2 a b a b b 2 a b b 2 a 2 a b a 2 a b a b b 2 a b b 2 ] = m n ′ ⋅ A n ⋅ m n ′ T ⨂ E f A'_n=M_n·A_n·M_n^T= ( \begin{bmatrix} a&b&a&b\\ \end{bmatrix} \begin{bmatrix} 1& 1& 1& 1\\ 1& \frac{c}{b}& -\frac{c}{b}& 1\\ 1& -1& -1& 1\\ \frac{c}{b}& -1& 1& -\frac{c}{b}\\ \end{bmatrix} )·A_n·( \begin{bmatrix} 1& 1& 1& \frac{c}{b}\\ 1& \frac{c}{b}& -1& -1\\ 1& -\frac{c}{b}& -1& 1\\ 1& 1& 1& -\frac{c}{b}\\ \end{bmatrix} \begin{bmatrix} a\\ b\\ a\\ b\\ \end{bmatrix} )\\= \begin{bmatrix} 1& 1& 1& 1\\ 1& \frac{c}{b}& -\frac{c}{b}& 1\\ 1& -1& -1& 1\\ \frac{c}{b}& -1& 1& -\frac{c}{b}\\ \end{bmatrix} )·A_n·( \begin{bmatrix} 1& 1& 1& \frac{c}{b}\\ 1& \frac{c}{b}& -1& -1\\ 1& -\frac{c}{b}& -1& 1\\ 1& 1& 1& -\frac{c}{b}\\ \end{bmatrix} \bigotimes \begin{bmatrix} a^2& ab& a^2& ab\\ ab& b^2& ab& b^2\\ a^2& ab& a^2& ab\\ ab& b^2& ab& b^2\\ \end{bmatrix} \\=m'_n·A_n·m'^T_n\bigotimes Ef An=MnAnMnT=([abab]111bc1bc111bc11111bc)An(11111bcbc11111bc11bcabab)=111bc1bc111bc11111bc)An(11111bcbc11111bc11bca2aba2ababb2abb2a2aba2ababb2abb2=mnAnmnTEf
其中 ⨂ \bigotimes 表示矩阵对应相乘, c b = 1 2 c o s ( 3 π 8 ) 1 2 c o s ( π 8 ) = 0.4142136 \frac{c}{b}=\frac{\sqrt{\frac{1}{2}}cos(\frac{3\pi}{8})}{\sqrt{\frac{1}{2}}cos(\frac{\pi}{8})}=0.4142136 bc=21 cos(8π)21 cos(83π)=0.4142136,为了简化计算,令 c b = 0.5 \frac{c}{b}=0.5 bc=0.5且为了保持矩阵的正交性修正
b = 2 5 b=\sqrt{\frac{2}{5}} b=52
同时我们希望转换矩阵为整数,故令 m n ′ m'_n mn的第2行和第4行×2,同时调整 C n C_n Cn,则有最终的整数DCT变换:
A ′ n = m n ′ ⋅ A n ⋅ m n ′ T ⨂ E f ′ A'n=m'_n·A_n·m'^T_n\bigotimes Ef' An=mnAnmnTEf
其中
m n ′ = [ 1 1 1 1 2 1 − 1 2 1 − 1 − 1 1 1 − 2 2 − 1 ] E f ′ = [ a 2 a b 2 a 2 a b 2 a b 2 b 2 4 a b 2 b 2 4 a 2 a b 2 a 2 a b 2 a b 2 b 2 4 a b 2 b 2 4 ] m'_n= \begin{bmatrix} 1& 1& 1& 1\\ 2& 1& -1& 2\\ 1& -1& -1& 1\\ 1& -2& 2& -1\\ \end{bmatrix}\\ Ef'= \begin{bmatrix} a^2& \frac{ab}{2}& a^2& \frac{ab}{2}\\ \frac{ab}{2}& \frac{b^2}{4}& \frac{ab}{2}& \frac{b^2}{4}\\ a^2& \frac{ab}{2}& a^2& \frac{ab}{2}\\ \frac{ab}{2}& \frac{b^2}{4}& \frac{ab}{2}& \frac{b^2}{4}\\ \end{bmatrix} mn=1211111211121211Ef=a22aba22ab2ab4b22ab4b2a22aba22ab2ab4b22ab4b2

测试

F D C T ( [ 13 34 205 255 9 43 198 254 11 35 207 254 9 36 210 237 ] ) = [ 502.500000 − 403.842775 18.500000 89.886112 4.493714 − 4.553301 9.337282 − 6.906854 − 3.000000 3.444151 − 4.000000 8.314916 3.009408 − 4.406854 4.250312 6.053301 ] F D C T i n t e g e r ( [ 13 34 205 255 9 43 198 254 11 35 207 254 9 36 210 237 ] ) = [ 502.500000 − 409.19873 18.500000 61.03196 4.269075 − 3.70000 9.012491 − 7.60000 − 3.000000 2.84605 − 4.000000 8.53815 3.320392 − 5.10000 4.901530 5.20000 ] F D C T − F D C T i n t e r g e r = [ 0 5.3559543 0 28.8541533 0.2246392 − 0.8533009 0.324911 0.6931458 0 0.5981010 0 − 0.2232339 − 0.3109839 − 0.6931458 − 0.6512179 0.8533009 ] FDCT( \begin{bmatrix} 13& 34& 205& 255\\ 9& 43& 198& 254\\ 11& 35& 207& 254\\ 9& 36& 210& 237\\ \end{bmatrix} )= \begin{bmatrix} 502.500000& -403.842775& 18.500000& 89.886112\\ 4.493714& -4.553301& 9.337282& -6.906854\\ -3.000000& 3.444151& -4.000000& 8.314916\\ 3.009408& -4.406854& 4.250312& 6.053301\\ \end{bmatrix}\\ FDCT_{integer}( \begin{bmatrix} 13& 34& 205& 255\\ 9& 43& 198& 254\\ 11& 35& 207& 254\\ 9& 36& 210& 237\\ \end{bmatrix} )= \begin{bmatrix} 502.500000& -409.19873& 18.500000& 61.03196\\ 4.269075& -3.70000& 9.012491& -7.60000\\ -3.000000& 2.84605& -4.000000& 8.53815\\ 3.320392& -5.10000& 4.901530& 5.20000\\ \end{bmatrix}\\ FDCT-FDCT_{interger}= \begin{bmatrix} 0& 5.3559543& 0& 28.8541533\\ 0.2246392& -0.8533009& 0.324911& 0.6931458\\ 0& 0.5981010& 0& -0.2232339\\ -0.3109839& -0.6931458& -0.6512179& 0.8533009\\ \end{bmatrix} FDCT(13911934433536205198207210255254254237)=502.5000004.4937143.0000003.009408403.8427754.5533013.4441514.40685418.5000009.3372824.0000004.25031289.8861126.9068548.3149166.053301FDCTinteger(13911934433536205198207210255254254237)=502.5000004.2690753.0000003.320392409.198733.700002.846055.1000018.5000009.0124914.0000004.90153061.031967.600008.538155.20000FDCTFDCTinterger=00.224639200.31098395.35595430.85330090.59810100.693145800.32491100.651217928.85415330.69314580.22323390.8533009
可以发现整数化的DCT与原DCT相差无几

备注

在h264中采用的是整数DCT变换,且将动作 ⨂ E f ′ \bigotimes Ef' Ef放置到量化操作中


在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值