用于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=[111−1]H4=⎣⎢⎢⎡11111−11−111−1−11−1−11⎦⎥⎥⎤
有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=[H2kH2kH2k−H2k]
变换
有矩阵
A
4
A_4
A4,则其hadamard变换为
A
4
′
=
H
4
⋅
A
4
⋅
H
4
A'_4=H_4·A_4·H_4
A4′=H4⋅A4⋅H4
离散余弦矩阵:
实例:
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.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阶矩阵 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′=Mn⋅An⋅MnT - 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′=MnT⋅An⋅Mn
效果
矩阵 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.493714−3.0000003.009408−403.842775−4.5533013.444151−4.40685418.5000009.337282−4.0000004.25031289.886112−6.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′=Mn∗An∗MnT中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=⎣⎢⎢⎡abacac−a−ba−c−ababa−c⎦⎥⎥⎤a=21,b=21cos(8π),c=21cos(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=⎣⎢⎢⎡abacac−a−ba−c−ababa−c⎦⎥⎥⎤=[abab]⎣⎢⎢⎡111bc1bc−1−11−bc−11111−bc⎦⎥⎥⎤=a⋅Mn′
则有
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′=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
其中
⨂
\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=21cos(8π)21cos(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'
A′n=mn′⋅An⋅mn′T⨂Ef′
其中
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′=⎣⎢⎢⎡121111−1−21−1−12121−1⎦⎥⎥⎤Ef′=⎣⎢⎢⎡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.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变换,且将动作 ⨂ E f ′ \bigotimes Ef' ⨂Ef′放置到量化操作中