离散余弦变换推导
discrete cosine transform
本文主要参考这篇知乎回答。
1974年,K. R. Rao、N. Ahmed、T. Natarajan三位教授创立了离散余弦变换(Discrete Cosine Transform, DCT)
(1)一维DCT
信号分析的课本上竟只讲了一维DCT,略有点失望呢
给一个序列/向量
s
(
n
)
,
n
=
0
,
1
,
…
,
N
−
1
s(n),n=0,1,\ldots,N-1
s(n),n=0,1,…,N−1,它的一维DCT:
{
S
c
o
s
(
0
)
=
1
N
∑
n
=
0
N
−
1
x
n
S
c
o
s
(
k
)
=
2
N
∑
n
=
0
N
−
1
x
n
cos
[
(
2
n
+
1
)
k
π
2
N
]
,
k
=
1
,
2
,
…
,
N
−
1
\left\{ \begin{array}{c} S_{cos}(0)=\frac{1}{\sqrt{N}}\sum_{n=0}^{N-1}x_n \\ S_{cos}(k)=\frac{2}{\sqrt{N}}\sum_{n=0}^{N-1}x_n\cos[\frac{(2n+1)k\pi}{2N}],k=1,2,\ldots,N-1 \\ \end{array}\right.
{Scos(0)=N1∑n=0N−1xnScos(k)=N2∑n=0N−1xncos[2N(2n+1)kπ],k=1,2,…,N−1
变换核函数为实函数:
φ
c
o
s
(
k
,
n
)
=
2
N
g
k
cos
[
(
2
n
+
1
)
k
π
2
N
]
,
k
,
n
=
0
,
1
,
2
,
…
,
N
−
1
\varphi_{cos}(k,n)=\sqrt{\frac2N}g_k\cos[\frac{(2n+1)k\pi}{2N}],k,n=0,1,2,\ldots,N-1
φcos(k,n)=N2gkcos[2N(2n+1)kπ],k,n=0,1,2,…,N−1
这个常系数是保证变换是正交矩阵的归一化系数。
(2)二维DCT
重要结论:
- 离散余弦变换的效果能够接近理论上的最佳变换——Kahunen-Loeve变换(K-L变换)。
- 在给定区间内满足狄利赫里条件的连续实对称函数,可以展开成仅含有余弦项的傅里叶级数。
- 余弦变换CT来源于傅里叶变换FT,但后者有复数,运算复杂度和存储长度都更大,基于第2条结论,把普通实函数经过偶延拓变成实对称函数再进行二维DFT,就得到了二维DCT。
- DCT是H.26X系列视频编码的基础,虽然各种视频编码方式经过几十年的发展,但以DCT为核心是没有变的
- DCT在计算复杂度上较小波变换更有优势
- DCT常被信号处理和图像处理使用,用于对信号和图像(包括静止图像和运动图像)进行有损压缩。在压缩算法中,将输入图像划分为88或1616的图像块,对每个图像块作DCT变换(分块后,每个块较小,运算时间更短);然后舍弃高频的系数,并对余下的系数进行量化以进一步减少数据量;最后使用无失真编码来完成压缩任务。解压缩时首先对每个图像块作DCT反变换,然后将图像拼接成一副完整的图像。
- 大多数自然信号(包括声音和图像)的能量都集中在余弦变换后的低频部分。由于人眼对于细节信息不是很敏感,因此信息含量更少的高频部分可以直接去掉,从而在后续的压缩操作中获得较高的压缩比。
- 变换后DCT系数能量主要集中在左上角,其余大部分系数接近于零,DCT具有适用于图像压缩的特性。将变换后的DCT系数进行门限操作,将小于一定值得系数归零,这就是图像压缩中的量化过程,然后进行逆DCT运算,可以得到压缩后的图像。
延拓方法:
二维离散函数 f ( x , y ) ( x , y = 0 , 1 , … , N − 1 ) f(x,y)(x,y=0,1,\ldots,N-1) f(x,y)(x,y=0,1,…,N−1)
若序列不包含零点 f ( 0 , 0 ) f(0,0) f(0,0),则 f ( − 1 , 0 ) = f ( 1 , 0 ) , f ( 0 , − 1 ) = f ( 0 , 1 ) , 对 称 中 心 : f ( 0 , 0 ) f(-1,0)=f(1,0),f(0,-1)=f(0,1),对称中心:f(0,0) f(−1,0)=f(1,0),f(0,−1)=f(0,1),对称中心:f(0,0)
若序列包含零点 f ( 0 , 0 ) f(0,0) f(0,0),则 f ( − 1 , 0 ) = f ( 0 , 0 ) , f ( 0 , − 1 ) = f ( 0 , 0 ) , f(-1,0)=f(0,0),f(0,-1)=f(0,0), f(−1,0)=f(0,0),f(0,−1)=f(0,0),对称中心: f ( − 1 2 , − 1 2 ) f(-\frac12,-\frac12) f(−21,−21)
偶延拓后,归一化的二维DCT:
w
h
e
n
(
x
,
y
)
o
r
(
u
,
v
)
=
(
0
,
0
)
when (x,y) or (u,v)=(0,0)
when(x,y)or(u,v)=(0,0)
F ( u , v ) = 1 N ∑ x = 0 N − 1 ∑ y = 0 N − 1 f ( x , y ) cos [ π N u ( x + 1 2 ) ] cos [ π N v ( y + 1 2 ) ] F(u,v)=\frac1N\sum_{x=0}^{N-1}\sum_{y=0}^{N-1}f(x,y)\cos[\frac{\pi}{N}u(x+\frac12)]\cos[\frac{\pi}{N}v(y+\frac12)] F(u,v)=N1x=0∑N−1y=0∑N−1f(x,y)cos[Nπu(x+21)]cos[Nπv(y+21)]
f ( x , y ) = 1 N ∑ u = 0 N − 1 ∑ v = 0 N − 1 F ( u , v ) cos [ π N u ( x + 1 2 ) ] cos [ π N v ( y + 1 2 ) ] f(x,y)=\frac1N\sum_{u=0}^{N-1}\sum_{v=0}^{N-1}F(u,v)\cos[\frac{\pi}{N}u(x+\frac12)]\cos[\frac{\pi}{N}v(y+\frac12)] f(x,y)=N1u=0∑N−1v=0∑N−1F(u,v)cos[Nπu(x+21)]cos[Nπv(y+21)]
w h e n ( x , y ) o r ( u , v ) ̸ = ( 0 , 0 ) when (x,y) or (u,v)\not=(0,0) when(x,y)or(u,v)̸=(0,0)
F ( u , v ) = 1 2 N ∑ x = 0 N − 1 ∑ y = 0 N − 1 f ( x , y ) cos [ π N u ( x + 1 2 ) ] cos [ π N v ( y + 1 2 ) ] F(u,v)=\frac{1}{2N}\sum_{x=0}^{N-1}\sum_{y=0}^{N-1}f(x,y)\cos[\frac{\pi}{N}u(x+\frac12)]\cos[\frac{\pi}{N}v(y+\frac12)] F(u,v)=2N1x=0∑N−1y=0∑N−1f(x,y)cos[Nπu(x+21)]cos[Nπv(y+21)]
f ( x , y ) = 1 2 N ∑ u = 0 N − 1 ∑ v = 0 N − 1 F ( u , v ) cos [ π N u ( x + 1 2 ) ] cos [ π N v ( y + 1 2 ) ] f(x,y)=\frac{1}{2N}\sum_{u=0}^{N-1}\sum_{v=0}^{N-1}F(u,v)\cos[\frac{\pi}{N}u(x+\frac12)]\cos[\frac{\pi}{N}v(y+\frac12)] f(x,y)=2N1u=0∑N−1v=0∑N−1F(u,v)cos[Nπu(x+21)]cos[Nπv(y+21)]
正逆变换的核函数均为 cos [ π N u ( x + 1 2 ) ] cos [ π N v ( y + 1 2 ) ] \cos[\frac{\pi}{N}u(x+\frac12)]\cos[\frac{\pi}{N}v(y+\frac12)] cos[Nπu(x+21)]cos[Nπv(y+21)]
从H.261开始,离散余弦变换就被应用于视频编码中。当技术发展到H.264与H.265,就具体的数学计算而言,H.261创立的分块编码被后续标准沿用,H.264在亮度平面上的基本分块为8x8像素块,于是离散余弦变换是这个样子(代入N=8):
F ( u , v ) = 1 16 ∑ x = 0 15 ∑ y = 0 15 f ( x , y ) cos [ π 8 u ( x + 1 2 ) ] cos [ π 8 v ( y + 1 2 ) ] F(u,v)=\frac{1}{16}\sum_{x=0}^{15}\sum_{y=0}^{15}f(x,y)\cos[\frac{\pi}{8}u(x+\frac12)]\cos[\frac{\pi}{8}v(y+\frac12)] F(u,v)=161x=0∑15y=0∑15f(x,y)cos[8πu(x+21)]cos[8πv(y+21)]
f ( x , y ) = 1 16 ∑ u = 0 15 ∑ v = 0 15 F ( u , v ) cos [ π 8 u ( x + 1 2 ) ] cos [ π 8 v ( y + 1 2 ) ] f(x,y)=\frac{1}{16}\sum_{u=0}^{15}\sum_{v=0}^{15}F(u,v)\cos[\frac{\pi}{8}u(x+\frac12)]\cos[\frac{\pi}{8}v(y+\frac12)] f(x,y)=161u=0∑15v=0∑15F(u,v)cos[8πu(x+21)]cos[8πv(y+21)]