版权声明:原创文章转载需注明出处。 https://blog.csdn.net/qq_36607894/article/details/90044660
离散余弦变换推导
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,它的一维DCT:
{Scos(0)=N
1∑n=0N−1xnScos(k)=N
2∑n=0N−1xncos[2N(2n+1)kπ],k=1,2,…,N−1
变换核函数为实函数:
φcos(k,n)=N2
gkcos[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(0,0),则
f(−1,0)=f(1,0),f(0,−1)=f(0,1),对称中心:f(0,0)
若序列包含零点
f(0,0),则
f(−1,0)=f(0,0),f(0,−1)=f(0,0),对称中心:
f(−21,−21)
偶延拓后,归一化的二维DCT:
when(x,y)or(u,v)=(0,0)
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)=N1u=0∑N−1v=0∑N−1F(u,v)cos[Nπu(x+21)]cos[Nπv(y+21)]
when(x,y)or(u,v)̸=(0,0)
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)=2N1u=0∑N−1v=0∑N−1F(u,v)cos[Nπu(x+21)]cos[Nπv(y+21)]
正逆变换的核函数均为
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)=161x=0∑15y=0∑15f(x,y)cos[8πu(x+21)]cos[8πv(y+21)]
f(x,y)=161u=0∑15v=0∑15F(u,v)cos[8πu(x+21)]cos[8πv(y+21)]
(3)蝶形算法butterfly algorithm