版权声明:本文为博主
[email protected](阿King)原创文章,不得以任何理由任何形式进行转载 https://blog.csdn.net/lj501886285/article/details/84346801
用于SATD的计算
Hadamard矩阵
只有1,-1构成的正交矩阵,例如
H2=[111−1]H4=⎣⎢⎢⎡11111−11−111−1−11−1−11⎦⎥⎥⎤
有hadamard矩阵的推导公式
H2k+1=[H2kH2kH2k−H2k]
变换
有矩阵
A4,则其hadamard变换为
A4′=H4⋅A4⋅H4
离散余弦矩阵:
实例:
DCT4=⎣⎢⎢⎡0.50000000.65328150.50000000.27059810.50000000.2705981−0.5000000−0.65328150.5000000−0.2705981−0.50000000.65328150.5000000−0.65328150.5000000−0.2705981⎦⎥⎥⎤
作用
将空域(space)的信号转换到频域(frequency)上,拥有良好的去矩阵相关性,为图像视频压缩后期的量化(Quantification)做前期准备,DCT变换本身是无损(lossless)的,但量化确实有损的。
过程
- FDCT(Forward DCT)
有DCT的n阶矩阵
Mn,矩阵
An的FDCT变化为
An′=Mn⋅An⋅MnT
- IDCT(Inverse DCT)
有DCT的n阶矩阵
Mn,矩阵
An的IDCT变化为
An′=MnT⋅An⋅Mn
效果
矩阵
m经过FDCT(Forward DCT)转换后的矩阵
m′,其左上角(即[0,0]位置)的值成为DC值,其余所有位置的值成为AC值。DC值可被看作该矩阵的均值,因为它与该矩阵的所有值都有关。
- 高频分量:
距离DC越近的值(靠左上角的值)越大
- 低频分量:
距离DC越远的值(靠右下角的值)越小,接近于0
图像的相关性越大,DCT转换后的效果越明显,即左上角大值,右下角趋于0
FDCT(⎣⎢⎢⎡13911934433536205198207210255254254237⎦⎥⎥⎤)=⎣⎢⎢⎡502.5000004.493714−3.0000003.009408−403.842775−4.5533013.444151−4.40685418.5000009.337282−4.0000004.25031289.886112−6.9068548.3149166.053301⎦⎥⎥⎤
将一副图像分别进行
FDCT4和
FDCT16变换后:
能够发现每个块(block)的信息都堆积到了左上角
DCT变换的缺点
由于DCT变换中含有超越函数cos,没有任何机器可以精确的计算出它的值,不同的精确的会产生不同的误差,况且在DCT变换中还有求和操作(矩阵点乘中的行列乘积和),这样会导致误差的积累,进而最后的输出和输入不同,同时大量的浮点数计算使得计算量增大。
改进
DCT变换
An′=Mn∗An∗MnT中DCT矩阵
Mn的实质为
Mn=⎣⎢⎢⎡abacac−a−ba−c−ababa−c⎦⎥⎥⎤a=21,b=21
cos(8π),c=21
cos(83π)
扫描二维码关注公众号,回复:
4588118 查看本文章
改造下
Mn
Mn=⎣⎢⎢⎡abacac−a−ba−c−ababa−c⎦⎥⎥⎤=[abab]⎣⎢⎢⎡111bc1bc−1−11−bc−11111−bc⎦⎥⎥⎤=a⋅Mn′
则有
An′=Mn⋅An⋅MnT=([abab]⎣⎢⎢⎡111bc1bc−1−11−bc−11111−bc⎦⎥⎥⎤)⋅An⋅(⎣⎢⎢⎡11111bc−bc11−1−11bc−11−bc⎦⎥⎥⎤⎣⎢⎢⎡abab⎦⎥⎥⎤)=⎣⎢⎢⎡111bc1bc−1−11−bc−11111−bc⎦⎥⎥⎤)⋅An⋅(⎣⎢⎢⎡11111bc−bc11−1−11bc−11−bc⎦⎥⎥⎤⨂⎣⎢⎢⎡a2aba2ababb2abb2a2aba2ababb2abb2⎦⎥⎥⎤=mn′⋅An⋅mn′T⨂Ef
其中
⨂表示矩阵对应相乘,
bc=21
cos(8π)21
cos(83π)=0.4142136,为了简化计算,令
bc=0.5且为了保持矩阵的正交性修正
b=52
。
同时我们希望转换矩阵为整数,故令
mn′的第2行和第4行×2,同时调整
Cn,则有最终的整数DCT变换:
A′n=mn′⋅An⋅mn′T⨂Ef′
其中
mn′=⎣⎢⎢⎡121111−1−21−1−12121−1⎦⎥⎥⎤Ef′=⎣⎢⎢⎡a22aba22ab2ab4b22ab4b2a22aba22ab2ab4b22ab4b2⎦⎥⎥⎤
测试
FDCT(⎣⎢⎢⎡13911934433536205198207210255254254237⎦⎥⎥⎤)=⎣⎢⎢⎡502.5000004.493714−3.0000003.009408−403.842775−4.5533013.444151−4.40685418.5000009.337282−4.0000004.25031289.886112−6.9068548.3149166.053301⎦⎥⎥⎤FDCTinteger(⎣⎢⎢⎡13911934433536205198207210255254254237⎦⎥⎥⎤)=⎣⎢⎢⎡502.5000004.269075−3.0000003.320392−409.19873−3.700002.84605−5.1000018.5000009.012491−4.0000004.90153061.03196−7.600008.538155.20000⎦⎥⎥⎤FDCT−FDCTinterger=⎣⎢⎢⎡00.22463920−0.31098395.3559543−0.85330090.5981010−0.693145800.3249110−0.651217928.85415330.6931458−0.22323390.8533009⎦⎥⎥⎤
可以发现整数化的DCT与原DCT相差无几
备注
在h264中采用的是整数DCT变换,且将动作
⨂Ef′放置到量化操作中