DCT 离散余弦变换及蝶形算法

版权声明:原创文章转载需注明出处。 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 s(n),n=0,1,\ldots,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.

变换核函数为实函数:
φ 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
这个常系数是保证变换是正交矩阵的归一化系数。

(2)二维DCT

重要结论

  1. 离散余弦变换的效果能够接近理论上的最佳变换——Kahunen-Loeve变换(K-L变换)。
  2. 在给定区间内满足狄利赫里条件的连续实对称函数,可以展开成仅含有余弦项的傅里叶级数。
  3. 余弦变换CT来源于傅里叶变换FT,但后者有复数,运算复杂度和存储长度都更大,基于第2条结论,把普通实函数经过偶延拓变成实对称函数再进行二维DFT,就得到了二维DCT。
  4. DCT是H.26X系列视频编码的基础,虽然各种视频编码方式经过几十年的发展,但以DCT为核心是没有变的
  5. DCT在计算复杂度上较小波变换更有优势
  6. DCT常被信号处理和图像处理使用,用于对信号和图像(包括静止图像和运动图像)进行有损压缩。在压缩算法中,将输入图像划分为88或1616的图像块,对每个图像块作DCT变换(分块后,每个块较小,运算时间更短);然后舍弃高频的系数,并对余下的系数进行量化以进一步减少数据量;最后使用无失真编码来完成压缩任务。解压缩时首先对每个图像块作DCT反变换,然后将图像拼接成一副完整的图像。
  7. 大多数自然信号(包括声音和图像)的能量都集中在余弦变换后的低频部分。由于人眼对于细节信息不是很敏感,因此信息含量更少的高频部分可以直接去掉,从而在后续的压缩操作中获得较高的压缩比。
  8. 变换后DCT系数能量主要集中在左上角,其余大部分系数接近于零,DCT具有适用于图像压缩的特性。将变换后的DCT系数进行门限操作,将小于一定值得系数归零,这就是图像压缩中的量化过程,然后进行逆DCT运算,可以得到压缩后的图像。

延拓方法:

二维离散函数 f ( x , y ) ( x , y = 0 , 1 , , N 1 ) f(x,y)(x,y=0,1,\ldots,N-1)

若序列不包含零点 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 ( 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 2 , 1 2 ) f(-\frac12,-\frac12)

偶延拓后,归一化的二维DCT:
w h e n ( x , y ) o r ( 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 ( 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)]

w h e n ( x , y ) o r ( u , v ) ̸ = ( 0 , 0 ) when (x,y) or (u,v)\not=(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 ( 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)]

正逆变换的核函数均为 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)]

从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 ( 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)]

(3)蝶形算法butterfly algorithm

猜你喜欢

转载自blog.csdn.net/qq_36607894/article/details/90044660