理解DCT与DST【二】:离散余弦变换

本文主要是将先前的博客 离散傅里叶变换DFT、离散余弦变换DCT、离散正弦变换DST,原理与公式推导 从图片修改为 Markdown 脚本,方便读者浏览,同时增加了部分内容。但由于文章字符过多,无法全部放在一篇博客上,所以将之前的文章拆分为三部分,可通过以下链接查看其它部分。

2 离散余弦变换(Discrete Cosine Transform, DCT)

由 1.5.5 节内容可知,对于有限长对称实序列,其 DFT 序列同样是有限长对称实序列。更重要的是,有限长对称实序列的 DFT 的计算只需要用到序列的一半采样点数据,而且可以转化为只涉及余弦函数的实数运算,简化了 DFT 的计算,这就是离散余弦变换的出发点。

实际上,离散余弦变换对应着非对称有限长实序列的对称延拓序列的离散傅里叶变换的非冗余部分,不同的延拓方式对应着不同的延拓序列长度以及不同的离散傅里叶变换系数,因此也就对应着不同的离散余弦变换系数。根据 1.5.6 节的分析,离散傅里叶变换系数中的非冗余部分即独立分量的个数与原序列中的独立分量个数是一致的,因此离散余弦变换系数的个数也就对应着延拓序列中独立分量的个数。

数学上离散余弦变换总共定义了 8 种形式,对应着 8 种有限长非对称实序列的对称延拓方式,分别用 DCT-I ~ DCT-VIII 来表示。在 H.266 视频编解码标准中,主要用到了 DCT-II 和 DCT-VIII,下面主要对这两种 DCT 进行推导和分析,其他类型的 DCT 只给出相应的延拓方式和对应的公式定义。

作为示例,假设有长度 N = 3 N=3 N=3 的有限长非对称实序列 x [ n ] :   4 ,   1 ,   3 ;   n = 0 , 1 , 2 x[n]:{\text{ }}4,{\text{ }}1,{\text{ }}3;{\text{ }}n = 0,1,2 x[n]: 4, 1, 3; n=0,1,2,如图 2-1 所示,后面的分析都将基于该序列进行展开。

图 2-1 原始有限长实序列

2.1 DCT-II

图 2-1 所示的有限长非对称实序列 x [ n ] x[n] x[n] 的 DCT-II 对称及周期延拓如图 2-2(a) 所示。由于序列右移了 1/2,所有采样点都处于非整数索引位置,而离散序列在计算机内都是以整数索引存储的,因此需要对该序列进行 2 倍的插零上采样,得到离散序列如图 2-2(b) 所示。准确来说,延拓序列的公式化定义如式(2-1)所示,其中波浪线代表相应有限长序列的周期延拓,非整数索引位置默认为 0。

y ~ [ m + 4 k N ] = x ~ [ ∣ m ∣ − 1 2 ] ,   m = − 2 N , − 2 N + 1 , . . . , 2 N − 1. (2-1) \tilde y[m + 4kN] = \tilde x\left[ {\frac{ {|m| - 1}}{2}} \right],{\text{ }}m = - 2N, - 2N + 1,...,2N - 1. \tag{2-1} y~[m+4kN]=x~[2m1], m=2N,2N+1,...,2N1.(2-1)

那么有限长对称实序列 y [ m ] y[m] y[m] 的长度为 4 N 4N 4N,而独立分量只有 N N N 个,可以预见对应 DFT 的独立分量也只有 N N N 个。

图 2-2 DCT-II 延拓(a)及其插零上采样(b)

图 2-3 DCT-II 延拓序列的 DFT 序列

根据前面的内容,可以得到 y [ m ] y[m] y[m] 4 N 4N 4N 点 DFT 为

Y ~ [ l ] = ∑ m = − 2 N 2 N − 1 y ~ [ m ] e − j 2 π l m 4 N = ∑ m = 1 2 N − 1 y [ m ] [ e − j π l m 2 N + e j π l m 2 N ] = 2 ∑ m = 0 2 N − 1 y [ m ] cos ⁡ [ π l m 2 N ] = 2 ∑ n = 0 N − 1 x [ n ] cos ⁡ [ π l ( 2 n + 1 ) 2 N ] (2-2) \begin{aligned} \tilde Y[l] &= \sum\limits_{m = - 2N}^{2N - 1} {\tilde y[m]{e^{ - j\frac{ {2\pi lm}}{ {4N}}}}} = \sum\limits_{m = 1}^{2N - 1} {y[m]\left[ { {e^{ - j\frac{ {\pi lm}}{ {2N}}}} + {e^{j\frac{ {\pi lm}}{ {2N}}}}} \right]} \\ &= 2\sum\limits_{m = 0}^{2N - 1} {y[m]\cos \left[ {\frac{ {\pi lm}}{ {2N}}} \right]} = 2\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left[ {\frac{ {\pi l\left( {2n + 1} \right)}}{ {2N}}} \right]} \\ \end{aligned} \tag{2-2} Y~[l]=m=2N2N1y~[m]ej4N2πlm=m=12N1y[m][ej2Nπlm+ej2Nπlm]=2m=02N1y[m]cos[2Nπlm]=2n=0N1x[n]cos[2Nπl(2n+1)](2-2)

进一步,我们可以得到以下性质,

Y ~ [ l + 2 N ] = 2 ∑ n = 0 N − 1 x [ n ] cos ⁡ [ π ( l + 2 N ) ( 2 n + 1 ) 2 N ] = 2 ∑ n = 0 N − 1 x [ n ] cos ⁡ [ π l ( 2 n + 1 ) 2 N + π ( 2 n + 1 ) ] = − 2 ∑ n = 0 N − 1 x [ n ] cos ⁡ [ π l ( 2 n + 1 ) 2 N ] = − Y ~ [ l ] (2-3) \begin{aligned} \tilde Y[l + 2N] &= 2\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left[ {\frac{ {\pi \left( {l + 2N} \right)\left( {2n + 1} \right)}}{ {2N}}} \right]} \\ &= 2\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left[ {\frac{ {\pi l\left( {2n + 1} \right)}}{ {2N}} + \pi \left( {2n + 1} \right)} \right]} \\ &= - 2\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left[ {\frac{ {\pi l\left( {2n + 1} \right)}}{ {2N}}} \right]} = - \tilde Y[l] \\ \end{aligned} \tag{2-3} Y~[l+2N]=2n=0N1x[n]cos[2Nπ(l+2N)(2n+1)]=2n=0N1x[n]cos[2Nπl(2n+1)+π(2n+1)]=2n=0N1x[n]cos[2Nπl(2n+1)]=Y~[l](2-3)

Y ~ [ l ] = Y ~ [ − l ] Y ~ [ 2 N − l ] = Y ~ [ l − 2 N ] = Y ~ [ l + 2 N ] = − Y ~ [ l ] Y ~ [ N ] = Y ~ [ 2 N − N ] = − Y ~ [ N ] ⇒ Y ~ [ N ] = 0 (2-4) \begin{gathered} \tilde Y[l] = \tilde Y[ - l] \\ \tilde Y[2N - l] = \tilde Y[l - 2N] = \tilde Y[l + 2N] = - \tilde Y[l] \\ \tilde Y[N] = \tilde Y[2N - N] = - \tilde Y[N] \Rightarrow \tilde Y[N] = 0 \\ \end{gathered} \tag{2-4} Y~[l]=Y~[l]Y~[2Nl]=Y~[l2N]=Y~[l+2N]=Y~[l]Y~[N]=Y~[2NN]=Y~[N]Y~[N]=0(2-4)

因此,有限长对称实序列 y [ m ] y[m] y[m] 4 N 4N 4N 点 DFT 中的独立分量确实只有 N N N 个。作为示例,图 2-2(b) 中定义的延拓序列的 DFT 如图 2-3 所示。根据以上性质,可以得到其逆变换为

y [ m ] = 1 4 N ∑ l = 0 4 N − 1 Y [ l ] e j 2 π l m 4 N = 1 4 N ∑ l = 0 2 N − 1 Y [ l ] [ e j 2 π l m 4 N − e j 2 π ( 2 N + l ) m 4 N ] = 1 4 N [ 1 − ( − 1 ) m ] ⋅ ∑ l = 0 2 N − 1 Y [ l ] e j π l m 2 N = 1 4 N [ 1 − ( − 1 ) m ] ⋅ { ∑ l = 1 N − 1 Y [ l ] [ e j π l m 2 N − e j π ( 2 N − l ) m 2 N ] + Y [ 0 ] } = 1 4 N [ 1 − ( − 1 ) m ] ⋅ { ∑ l = 1 N − 1 Y [ l ] [ e j π l m 2 N − ( − 1 ) m e − j π l m 2 N ] + Y [ 0 ] } = 1 4 N [ 1 − ( − 1 ) m ] ⋅ [ ∑ l = 1 N − 1 Y [ l ] ( e j π l m 2 N + e − j π l m 2 N ) + Y [ 0 ] ] = 1 2 N [ 1 − ( − 1 ) m ] ⋅ ∑ l = 0 N − 1 ε l Y [ l ] cos ⁡ ( π l m 2 N ) (2-5) \begin{aligned} y[m] &= \frac{1}{ {4N}}\sum\limits_{l = 0}^{4N - 1} {Y[l]{e^{j\frac{ {2\pi lm}}{ {4N}}}}} = \frac{1}{ {4N}}\sum\limits_{l = 0}^{2N - 1} {Y[l]\left[ { {e^{j\frac{ {2\pi lm}}{ {4N}}}} - {e^{j\frac{ {2\pi \left( {2N + l} \right)m}}{ {4N}}}}} \right]} \\ &= \frac{1}{ {4N}}\left[ {1 - { {\left( { - 1} \right)}^m}} \right] \cdot \sum\limits_{l = 0}^{2N - 1} {Y[l]{e^{j\frac{ {\pi lm}}{ {2N}}}}} \\ &= \frac{1}{ {4N}}\left[ {1 - { {\left( { - 1} \right)}^m}} \right] \cdot \left\{ {\sum\limits_{l = 1}^{N - 1} {Y[l]\left[ { {e^{j\frac{ {\pi lm}}{ {2N}}}} - {e^{j\frac{ {\pi \left( {2N - l} \right)m}}{ {2N}}}}} \right] + Y[0]} } \right\} \\ &= \frac{1}{ {4N}}\left[ {1 - { {\left( { - 1} \right)}^m}} \right] \cdot \left\{ {\sum\limits_{l = 1}^{N - 1} {Y[l]\left[ { {e^{j\frac{ {\pi lm}}{ {2N}}}} - { {\left( { - 1} \right)}^m}{e^{ - j\frac{ {\pi lm}}{ {2N}}}}} \right] + Y[0]} } \right\} \\ &= \frac{1}{ {4N}}\left[ {1 - { {\left( { - 1} \right)}^m}} \right] \cdot \left[ {\sum\limits_{l = 1}^{N - 1} {Y[l]\left( { {e^{j\frac{ {\pi lm}}{ {2N}}}} + {e^{ - j\frac{ {\pi lm}}{ {2N}}}}} \right) + Y[0]} } \right] \\ &= \frac{1}{ {2N}}\left[ {1 - { {\left( { - 1} \right)}^m}} \right] \cdot \sum\limits_{l = 0}^{N - 1} { {\varepsilon _l}Y[l]\cos \left( {\frac{ {\pi lm}}{ {2N}}} \right)} \\ \end{aligned} \tag{2-5} y[m]=4N1l=04N1Y[l]ej4N2πlm=4N1l=02N1Y[l][ej4N2πlmej4N2π(2N+l)m]=4N1[1(1)m]l=02N1Y[l]ej2Nπlm=4N1[1(1)m]{ l=1N1Y[l][ej2Nπlmej2Nπ(2Nl)m]+Y[0]}=4N1[1(1)m]{ l=1N1Y[l][ej2Nπlm(1)mej2Nπlm]+Y[0]}=4N1[1(1)m][l=1N1Y[l](ej2Nπlm+ej2Nπlm)+Y[0]]=2N1[1(1)m]l=0N1εlY[l]cos(2Nπlm)(2-5)

其中

ε l = { 1 2 , l = 0 1 , l ≠ 0 . {\varepsilon _l} = \left\{ {\begin{array}{c} {\frac{1}{2},}&{l = 0} \\ {1,}&{l \ne 0} \end{array}} \right.. εl={ 21,1,l=0l=0.

由此,定义 DCT-II 的计算公式如下,

X [ k ] = D C T 2 [ x [ n ] ] = Y [ k ] = 2 ∑ n = 0 N − 1 x [ n ] cos ⁡ [ π k ( 2 n + 1 ) 2 N ] x [ n ] = I D C T 2 [ X [ k ] ] = y [ 2 n + 1 ] = 1 N ∑ k = 0 N − 1 ε k X [ k ] cos ⁡ [ π k ( 2 n + 1 ) 2 N ] w h e r e   n , k = 0 , 1 , . . . , N − 1 (2-6) \begin{gathered} X[k] = DC{T_2}\left[ {x[n]} \right] = Y[k] = 2\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left[ {\frac{ {\pi k\left( {2n + 1} \right)}}{ {2N}}} \right]} \\ x[n] = IDC{T_2}\left[ {X[k]} \right] = y[2n + 1] = \frac{1}{N}\sum\limits_{k = 0}^{N - 1} { {\varepsilon _k}X[k]\cos \left[ {\frac{ {\pi k\left( {2n + 1} \right)}}{ {2N}}} \right]} \\ where{\text{ }}n,k = 0,1,...,N - 1 \\ \end{gathered} \tag{2-6} X[k]=DCT2[x[n]]=Y[k]=2n=0N1x[n]cos[2Nπk(2n+1)]x[n]=IDCT2[X[k]]=y[2n+1]=N1k=0N1εkX[k]cos[2Nπk(2n+1)]where n,k=0,1,...,N1(2-6)

可以看到,DCT-II 与由式(2-1)所定义延拓序列的 DFT 是对应的,但只包含了部分分量。为了公式的一致性,将式(2-6)的系数平均分配到两边,则有

X [ k ] = D C T 2 [ x [ n ] ] = 2 N ε k ∑ n = 0 N − 1 x [ n ] cos ⁡ [ π k ( 2 n + 1 ) 2 N ] x [ n ] = I D C T 2 [ X [ k ] ] = 2 N ε k ∑ k = 0 N − 1 X [ k ] cos ⁡ [ π k ( 2 n + 1 ) 2 N ] w h e r e   n , k = 0 , 1 , . . . , N − 1 (2-7) \begin{gathered} X[k] = DC{T_2}\left[ {x[n]} \right] = \sqrt {\frac{2}{N}} {\varepsilon _k}\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left[ {\frac{ {\pi k\left( {2n + 1} \right)}}{ {2N}}} \right]} \\ x[n] = IDC{T_2}\left[ {X[k]} \right] = \sqrt {\frac{2}{N}} {\varepsilon _k}\sum\limits_{k = 0}^{N - 1} {X[k]\cos \left[ {\frac{ {\pi k\left( {2n + 1} \right)}}{ {2N}}} \right]} \\ where{\text{ }}n,k = 0,1,...,N - 1 \\ \end{gathered} \tag{2-7} X[k]=DCT2[x[n]]=N2 εkn=0N1x[n]cos[2Nπk(2n+1)]x[n]=IDCT2[X[k]]=N2 εkk=0N1X[k]cos[2Nπk(2n+1)]where n,k=0,1,...,N1(2-7)

逆变换这里 ε k {\varepsilon _k} εk 写在了求和符号前面,主要是为了表达与正变换公式的一致性,严谨的话应该放在求和符号里面。注意此时

ε k = { 1 2 , k = 0 1 , k ≠ 0 . {\varepsilon _k} = \left\{ {\begin{array}{c} {\frac{1}{ {\sqrt 2 }},}&{k = 0} \\ {1,}&{k \ne 0} \end{array}} \right.. εk={ 2 1,1,k=0k=0.

写成矩阵形式,则有

X = A x , x = A T X ⇒ X = A A T X ⇒ A A T = I ⇒ A T = A − 1 A ∈ R N × N ,   A k n = 2 N ε k cos ⁡ [ π k ( 2 n + 1 ) 2 N ] (2-8) \begin{gathered} {\mathbf{X}} = {\mathbf{Ax}},{\mathbf{x}} = { {\mathbf{A}}^T}{\mathbf{X}} \Rightarrow {\mathbf{X}} = {\mathbf{A}}{ {\mathbf{A}}^T}{\mathbf{X}} \Rightarrow {\mathbf{A}}{ {\mathbf{A}}^T} = {\mathbf{I}} \Rightarrow { {\mathbf{A}}^T} = { {\mathbf{A}}^{ - 1}} \\ {\mathbf{A}} \in {\mathbb{R}^{N \times N}},{\text{ }}{A_{kn}} = \sqrt {\frac{2}{N}} {\varepsilon _k}\cos \left[ {\frac{ {\pi k\left( {2n + 1} \right)}}{ {2N}}} \right] \\ \end{gathered} \tag{2-8} X=Ax,x=ATXX=AATXAAT=IAT=A1ARN×N, Akn=N2 εkcos[2Nπk(2n+1)](2-8)

这意味着变换矩阵 A \mathbf{A} A 是正交矩阵,也就是说式(2-7)定义的离散余弦变换与逆变换属于正交变换。那么,矩阵 A \mathbf{A} A 的每一行或者每一列都是线性无关的,时域或空域的离散信号序列 x \mathbf{x} x 可以表示为矩阵 A \mathbf{A} A 行向量的转置 a n \mathbf{a}_n an 关于离线余弦变换系数 X [ k ] X[k] X[k] 的线性组合,如式(2-9)所示,这些向量 a n \mathbf{a}_n an 组成了一个规范正交基,每个基向量代表着信号不同的变化频率,例如 k = 0 k=0 k=0 时代表了直流分量, k k k 越大,信号变化的频率越快,这时称为交流分量,这与傅里叶变换的分析是类似的。

a k = [ A k 0 A k 1 ⋯ A k ( N − 1 ) ] T x = A T X = [ a 0 a 1 ⋯ a N − 1 ] [ X 0 X 0 ⋮ X N − 1 ] = X 0 a 0 + X 1 a 1 + ⋯ + X N − 1 a N − 1 (2-9) \begin{gathered} { {\mathbf{a}}_k} = {\left[ {\begin{array}{c} { {A_{k0}}}&{ {A_{k1}}}& \cdots &{ {A_{k\left( {N - 1} \right)}}} \end{array}} \right]^T} \\ {\mathbf{x}} = { {\mathbf{A}}^T}{\mathbf{X}} = \left[ {\begin{array}{c} { { {\mathbf{a}}_0}}&{ { {\mathbf{a}}_1}}& \cdots &{ { {\mathbf{a}}_{N - 1}}} \end{array}} \right]\left[ {\begin{array}{c} { {X_0}} \\ { {X_0}} \\ \vdots \\ { {X_{N - 1}}} \end{array}} \right] = {X_0}{ {\mathbf{a}}_0} + {X_1}{ {\mathbf{a}}_1} + \cdots + {X_{N - 1}}{ {\mathbf{a}}_{N - 1}} \\ \end{gathered} \tag{2-9} ak=[Ak0Ak1Ak(N1)]Tx=ATX=[a0a1aN1] X0X0XN1 =X0a0+X1a1++XN1aN1(2-9)

拓展到二维信号例如常见的图像信号,在 1.7 节我们证明了二维离散傅里叶变换是可分离的,因此容易证明二维离散余弦变换同样是可分离的,这里不赘述。假设有宽高为 M × N M \times N M×N 的二维信号 x [ m , n ] x[m,n] x[m,n],令 P \mathbf{P} P Q \mathbf{Q} Q 分别为大小为 M × M M \times M M×M N × N N \times N N×N 的变换矩阵,由 1.7 节内容及前面的分析知,

X = ( P ( Q x ) T ) T = Q x P T ⇒ x = Q T Q x P T P = Q T X P x = [ q 0 q 1 ⋯ q N − 1 ] X [ p 0 T p 1 T ⋮ p M − 1 T ] = ∑ m = 0 M − 1 ∑ n = 0 N − 1 X [ m , n ] q n p m T w h e r e   P ∈ R M × M ,   Q ∈ R N × N (2-10) \begin{gathered} {\mathbf{X}} = {\left( { {\mathbf{P}}{ {\left( { {\mathbf{Qx}}} \right)}^T}} \right)^T} = {\mathbf{Qx}}{ {\mathbf{P}}^T} \Rightarrow {\mathbf{x}} = { {\mathbf{Q}}^T}{\mathbf{Qx}}{ {\mathbf{P}}^T}{\mathbf{P}} = { {\mathbf{Q}}^T}{\mathbf{XP}} \\ {\mathbf{x}} = \left[ {\begin{array}{c} { { {\mathbf{q}}_{\mathbf{0}}}}&{ { {\mathbf{q}}_1}}& \cdots &{ { {\mathbf{q}}_{N - 1}}} \end{array}} \right]{\mathbf{X}}\left[ {\begin{array}{c} { {\mathbf{p}}_0^T} \\ { {\mathbf{p}}_1^T} \\ \vdots \\ { {\mathbf{p}}_{M - 1}^T} \end{array}} \right] = \sum\limits_{m = 0}^{M - 1} {\sum\limits_{n = 0}^{N - 1} {X[m,n]{ {\mathbf{q}}_n}{\mathbf{p}}_m^T} } \\ where{\text{ }}{\mathbf{P}} \in {\mathbb{R}^{M \times M}},{\text{ }}{\mathbf{Q}} \in {\mathbb{R}^{N \times N}} \\ \end{gathered} \tag{2-10} X=(P(Qx)T)T=QxPTx=QTQxPTP=QTXPx=[q0q1qN1]X p0Tp1TpM1T =m=0M1n=0N1X[m,n]qnpmTwhere PRM×M, QRN×N(2-10)

这时,我们将每个大小 N × M N \times M N×M q n p m T { {\mathbf{q}}_n}{\mathbf{p}}_m^T qnpmT 矩阵称为二维离散余弦变换的基图像,其中 p m { {\mathbf{p}}_m} pm q n { {\mathbf{q}}_n} qn 分别反映了信号水平和垂直的变化频率。那么二维信号 x \mathbf{x} x 可以表示为这些基图像的线性组合,其权值即为离散余弦变换的系数。而离散余弦变换的各个系数是通过基图像与信号之间的內积求得的,因此刚好又代表了信号与各个基图像之间的相关性或者相似度,即信号与某个基图像越相似,则该基图像对应的离散余弦变换系数就会越大,反之则越小。因此,离散余弦变换是否能把信号的信息尽量压缩到少数几个系数上,关键在于是否能通过少数几个基图像的线性组合来尽可能准确地还原原始的信号。

图 2-4 展示了 8 × 8 8×8 8×8 的二维 DCT-II 的 64 个基图像。可以看到,左上角的基图像代表了信号的直流分量,此时信号在空间上没有任何变化;而在最上边一行(最左边的一列),其反映了信号在水平(垂直)方向上强度周期变化的特点,且越往右(下)边,信号变化的频率越来越高,从而组成了从宽粗到窄细、从稀疏到密集的各种垂直(水平)线条,而这种模式(pattern)刚好与图像中的纹理细节十分的相像;而在右下角,信号变化的频率越来越高,基图像也越来越表现得像马赛克,相邻像素之间的相关性也越来越低,这种模式又十分符合同分布随机噪声(比如高斯白噪声)的分布特性。因为我们一般关注的是图像的整体亮度以及细节纹理,这恰好使得图像的信息能够大致通过图 2-4 中左上角少数几个基图像的线性组合来表示,所以图 2-4 所代表的 DCT-II 也被广泛应用于图像视频压缩以及降噪当中。但要注意,不同类型的 DCT 由于变换公式不一样,它们所产生的基图像也各不相同,并不是所有类型的 DCT 都能产生如图 2-4 中这种比较规则变化的图形,因此也不是所有类型的 DCT 都能与 DCT-II 相提并论。但相比于 DCT-II,在某些应用场景中,某些 DCT 以及后面会讲述的 DST 类型也会产生一些比 DCT-II 更加符合信号分布的基图像组合。比如在 H.266 中,DCT-VIII 和 DST-VII 在某些情况下相比于 DCT-II 可获得更优的残差变换压缩性能。在文章的末尾,我会给出各种 DCT 类型的基图像给大家作为参考。

根据图 2-4 可以知道,对于水平方向缓慢变化的信号,其 DCT 系数将主要集中在左边垂直方向;而对于垂直方向缓慢变化的信号,其 DCT 系数将主要集中在上边水平方向。在基于预测的图像编码中,例如 H.266,不同的角度预测模式会产生不同的残差分布。例如对于水平预测,水平方向的残差通常会呈现从左到右基本相同或者逐渐逐渐增大的特性,而垂直方向由于各行彼此参考的像素各不相关,从而表现出随机变化的特性,因此对残差进行离散余弦变换后,其 DCT 系数通常会集中在左侧的少数几列,这时配合垂直方向的系数扫描,可以使得系数更加集中,利于后续的熵编码操作。同理,对于其他的预测模式,我们也可以相应采用 Zigzag 扫描或者水平扫描,从而获得更好的压缩特性。

图 2-4 8×8 大小的 DCT-II 基图像

2.2 DCT-VIII

图 2-1 所示的有限长非对称实序列 x [ n ] x[n] x[n] 的 DCT-VIII 对称及周期延拓如图 2-5(a) 所示。类似于 DCT-II 延拓,由于序列右移了 1/2,所有采样点都处于非整数索引位置,而离散序列在计算机内都是以整数索引存储的,因此需要对该序列进行 2 倍的插零上采样,得到离散序列如图 2-5(b) 所示。准确来说,延拓序列的公式化定义如式(2-11)所示,其中波浪线代表相应有限长序列的周期延拓,非整数索引位置默认为 0。

y ~ [ m + k ( 8 N + 4 ) ] = { x ~ [ ∣ m ∣ − 1 2 ] , ∣ m ∣ ⩽ 2 N 0 , ∣ m ∣ = 2 N + 1 − x ~ [ 4 N + 1 − ∣ m ∣ 2 ] , ∣ m ∣ ⩾ 2 N + 2 w h e r e   m = − 4 N − 2 , − 4 N − 1 , . . . , 4 N + 1. (2-11) \begin{gathered} \tilde y\left[ {m + k\left( {8N + 4} \right)} \right] = \left\{ {\begin{array}{l} {\tilde x\left[ {\frac{ {\left| m \right| - 1}}{2}} \right],}&{\left| m \right| \leqslant 2N} \\ {0,}&{\left| m \right| = 2N + 1} \\ { - \tilde x\left[ {\frac{ {4N + 1 - \left| m \right|}}{2}} \right],}&{\left| m \right| \geqslant 2N + 2} \end{array}} \right. \\ where{\text{ }}m = - 4N - 2, - 4N - 1,...,4N + 1. \\ \end{gathered} \tag{2-11} y~[m+k(8N+4)]= x~[2m1],0,x~[24N+1m],m2Nm=2N+1m2N+2where m=4N2,4N1,...,4N+1.(2-11)

图 2-5 DCT-VIII 延拓(a)及其插零上采样(b)

图 2-6 DCT-VIII 延拓序列的 DFT 序列

那么,有限长对称实序列 y [ m ] y[m] y[m] 的长度为 8 N + 4 8N+4 8N+4,而独立分量只有 N N N 个,因此可以预见其 DFT 的独立分量也只有 N N N 个。根据前面的内容可得,

Y ~ [ l ] = ∑ m = − 4 N − 2 4 N + 1 y ~ [ m ] e − j 2 π l m 8 N + 4 = ∑ m = 1 4 N + 1 y [ m ] ( e − j π l m 4 N + 2 + e j π l m 4 N + 2 ) = 2 ∑ m = 1 4 N + 1 y [ m ] cos ⁡ ( π l m 4 N + 2 ) = 2 ∑ n = 0 N − 1 x [ n ] cos ⁡ [ π l ( 2 n + 1 ) 4 N + 2 ] − 2 ∑ n = 0 N − 1 x [ n ] cos ⁡ [ π l ( 4 N + 2 − 2 n − 1 ) 4 N + 2 ] = 2 ∑ n = 0 N − 1 x [ n ] cos ⁡ [ π l ( 2 n + 1 ) 4 N + 2 ] − 2 ∑ n = 0 N − 1 x [ n ] cos ⁡ [ π l − π l ( 2 n + 1 ) 4 N + 2 ] = 2 [ 1 − ( − 1 ) l ] ⋅ ∑ n = 0 N − 1 x [ n ] cos ⁡ [ π l ( 2 n + 1 ) 4 N + 2 ] (2-12) \begin{aligned} \tilde Y[l] &= \sum\limits_{m = - 4N - 2}^{4N + 1} {\tilde y[m]{e^{ - j\frac{ {2\pi lm}}{ {8N + 4}}}}} \\ &= \sum\limits_{m = 1}^{4N + 1} {y[m]\left( { {e^{ - j\frac{ {\pi lm}}{ {4N + 2}}}} + {e^{j\frac{ {\pi lm}}{ {4N + 2}}}}} \right)} \\ &= 2\sum\limits_{m = 1}^{4N + 1} {y[m]\cos \left( {\frac{ {\pi lm}}{ {4N + 2}}} \right)} \\ &= 2\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left[ {\frac{ {\pi l\left( {2n + 1} \right)}}{ {4N + 2}}} \right]} - 2\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left[ {\frac{ {\pi l\left( {4N + 2 - 2n - 1} \right)}}{ {4N + 2}}} \right]} \\ &= 2\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left[ {\frac{ {\pi l\left( {2n + 1} \right)}}{ {4N + 2}}} \right]} - 2\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left[ {\pi l - \frac{ {\pi l\left( {2n + 1} \right)}}{ {4N + 2}}} \right]} \\ &= 2\left[ {1 - { {\left( { - 1} \right)}^l}} \right] \cdot \sum\limits_{n = 0}^{N - 1} {x[n]\cos \left[ {\frac{ {\pi l\left( {2n + 1} \right)}}{ {4N + 2}}} \right]} \\ \end{aligned} \tag{2-12} Y~[l]=m=4N24N+1y~[m]ej8N+42πlm=m=14N+1y[m](ej4N+2πlm+ej4N+2πlm)=2m=14N+1y[m]cos(4N+2πlm)=2n=0N1x[n]cos[4N+2πl(2n+1)]2n=0N1x[n]cos[4N+2πl(4N+22n1)]=2n=0N1x[n]cos[4N+2πl(2n+1)]2n=0N1x[n]cos[πl4N+2πl(2n+1)]=2[1(1)l]n=0N1x[n]cos[4N+2πl(2n+1)](2-12)

因此,我们可以得到以下性质,

Y ~ [ 2 l ] = 0 ,   Y ~ [ l ] = Y ~ [ − l ] Y ~ [ l + 4 N + 2 ] = − Y ~ [ l ] Y ~ [ 4 N + 2 − l ] = Y ~ [ l − 4 N − 2 + 8 N + 4 ] = Y ~ [ l + 4 N + 2 ] = − Y [ l ] Y ~ [ 2 N + 1 ] = − Y ~ [ 4 N + 2 − 2 N − 1 ] = − Y ~ [ 2 N + 1 ] = 0 (2-13) \begin{gathered} \tilde Y[2l] = 0,{\text{ }}\tilde Y[l] = \tilde Y[ - l] \\ \tilde Y[l + 4N + 2] = - \tilde Y[l] \\ \tilde Y[4N + 2 - l] = \tilde Y[l - 4N - 2 + 8N + 4] = \tilde Y[l + 4N + 2] = - Y[l] \\ \tilde Y[2N + 1] = - \tilde Y[4N + 2 - 2N - 1] = - \tilde Y[2N + 1] = 0 \\ \end{gathered} \tag{2-13} Y~[2l]=0, Y~[l]=Y~[l]Y~[l+4N+2]=Y~[l]Y~[4N+2l]=Y~[l4N2+8N+4]=Y~[l+4N+2]=Y[l]Y~[2N+1]=Y~[4N+22N1]=Y~[2N+1]=0(2-13)

所以,有限长对称实序列 y [ m ] y[m] y[m] 8 N + 4 8N+4 8N+4 点 DFT 中的独立分量确实只有 N N N 个。作为示例,图 2-5(b) 中定义的延拓序列的 DFT 如图 2-6 所示。根据以上性质,可以得到其逆变换为

y [ m ] = 1 8 N + 4 ∑ l = 0 8 N + 3 Y [ l ] e j 2 π l m 8 N + 4 = 1 8 N + 4 ∑ l = 0 4 N + 1 Y [ l ] [ e j 2 π l m 8 N + 4 − e j 2 π ( 4 N + 2 + l ) m 8 N + 4 ] = 1 8 N + 4 [ 1 − ( − 1 ) m ] ⋅ ∑ l = 0 4 N + 1 Y [ l ] e j π l m 4 N + 2 = 1 8 N + 4 [ 1 − ( − 1 ) m ] ⋅ ∑ l = 0 N − 1 Y [ 2 l + 1 ] [ e j π ( 2 l + 1 ) m 4 N + 2 − e j π ( 4 N + 2 − 2 l − 1 ) m 4 N + 2 ] = 1 8 N + 4 [ 1 − ( − 1 ) m ] ⋅ ∑ l = 0 N − 1 Y [ 2 l + 1 ] [ e j π ( 2 l + 1 ) m 4 N + 2 + e − j π ( 2 l + 1 ) m 4 N + 2 ] = 1 4 N + 2 [ 1 − ( − 1 ) m ] ⋅ ∑ l = 0 N − 1 Y [ 2 l + 1 ] cos ⁡ [ π ( 2 l + 1 ) m 4 N + 2 ] (2-14) \begin{aligned} y[m] &= \frac{1}{ {8N + 4}}\sum\limits_{l = 0}^{8N + 3} {Y[l]{e^{j\frac{ {2\pi lm}}{ {8N + 4}}}}} \\ &= \frac{1}{ {8N + 4}}\sum\limits_{l = 0}^{4N + 1} {Y[l]\left[ { {e^{j\frac{ {2\pi lm}}{ {8N + 4}}}} - {e^{j\frac{ {2\pi \left( {4N + 2 + l} \right)m}}{ {8N + 4}}}}} \right]} \\ &= \frac{1}{ {8N + 4}}\left[ {1 - { {\left( { - 1} \right)}^m}} \right] \cdot \sum\limits_{l = 0}^{4N + 1} {Y[l]{e^{j\frac{ {\pi lm}}{ {4N + 2}}}}} \\ &= \frac{1}{ {8N + 4}}\left[ {1 - { {\left( { - 1} \right)}^m}} \right] \cdot \sum\limits_{l = 0}^{N - 1} {Y[2l + 1]\left[ { {e^{j\frac{ {\pi \left( {2l + 1} \right)m}}{ {4N + 2}}}} - {e^{j\frac{ {\pi \left( {4N + 2 - 2l - 1} \right)m}}{ {4N + 2}}}}} \right]} \\ &= \frac{1}{ {8N + 4}}\left[ {1 - { {\left( { - 1} \right)}^m}} \right] \cdot \sum\limits_{l = 0}^{N - 1} {Y[2l + 1]\left[ { {e^{j\frac{ {\pi \left( {2l + 1} \right)m}}{ {4N + 2}}}} + {e^{ - j\frac{ {\pi \left( {2l + 1} \right)m}}{ {4N + 2}}}}} \right]} \\ &= \frac{1}{ {4N + 2}}\left[ {1 - { {\left( { - 1} \right)}^m}} \right] \cdot \sum\limits_{l = 0}^{N - 1} {Y[2l + 1]\cos \left[ {\frac{ {\pi \left( {2l + 1} \right)m}}{ {4N + 2}}} \right]} \\ \end{aligned} \tag{2-14} y[m]=8N+41l=08N+3Y[l]ej8N+42πlm=8N+41l=04N+1Y[l][ej8N+42πlmej8N+42π(4N+2+l)m]=8N+41[1(1)m]l=04N+1Y[l]ej4N+2πlm=8N+41[1(1)m]l=0N1Y[2l+1][ej4N+2π(2l+1)mej4N+2π(4N+22l1)m]=8N+41[1(1)m]l=0N1Y[2l+1][ej4N+2π(2l+1)m+ej4N+2π(2l+1)m]=4N+21[1(1)m]l=0N1Y[2l+1]cos[4N+2π(2l+1)m](2-14)

由此,定义 DCT-VIII 的计算公式如下,

X [ k ] = D C T 8 [ x [ n ] ] = 4 ∑ n = 0 N − 1 x [ n ] cos ⁡ [ π ( 2 k + 1 ) ( 2 n + 1 ) 4 N + 2 ] x [ n ] = I D C T 8 [ X [ k ] ] = 1 2 N + 1 ∑ k = 0 N − 1 X [ k ] cos ⁡ [ π ( 2 k + 1 ) ( 2 n + 1 ) 4 N + 2 ] w h e r e   n , k = 0 , 1 , . . . , N − 1. (2-15) \begin{gathered} X[k] = DC{T_8}\left[ {x[n]} \right] = 4\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left[ {\frac{ {\pi \left( {2k + 1} \right)\left( {2n + 1} \right)}}{ {4N + 2}}} \right]} \\ x[n] = IDC{T_8}\left[ {X[k]} \right] = \frac{1}{ {2N + 1}}\sum\limits_{k = 0}^{N - 1} {X[k]\cos \left[ {\frac{ {\pi \left( {2k + 1} \right)\left( {2n + 1} \right)}}{ {4N + 2}}} \right]} \\ where{\text{ }}n,k = 0,1,...,N - 1. \\ \end{gathered} \tag{2-15} X[k]=DCT8[x[n]]=4n=0N1x[n]cos[4N+2π(2k+1)(2n+1)]x[n]=IDCT8[X[k]]=2N+11k=0N1X[k]cos[4N+2π(2k+1)(2n+1)]where n,k=0,1,...,N1.(2-15)

为了公式的一致性,将式(2-15)的系数平均分配到两边,则有

X [ k ] = D C T 8 [ x [ n ] ] = 2 2 N + 1 ∑ n = 0 N − 1 x [ n ] cos ⁡ [ π ( 2 k + 1 ) ( 2 n + 1 ) 4 N + 2 ] x [ n ] = I D C T 8 [ X [ k ] ] = 2 2 N + 1 ∑ k = 0 N − 1 X [ k ] cos ⁡ [ π ( 2 k + 1 ) ( 2 n + 1 ) 4 N + 2 ] w h e r e   n , k = 0 , 1 , . . . , N − 1. (2-16) \begin{gathered} X[k] = DC{T_8}\left[ {x[n]} \right] = \frac{2}{ {\sqrt {2N + 1} }}\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left[ {\frac{ {\pi \left( {2k + 1} \right)\left( {2n + 1} \right)}}{ {4N + 2}}} \right]} \\ x[n] = IDC{T_8}\left[ {X[k]} \right] = \frac{2}{ {\sqrt {2N + 1} }}\sum\limits_{k = 0}^{N - 1} {X[k]\cos \left[ {\frac{ {\pi \left( {2k + 1} \right)\left( {2n + 1} \right)}}{ {4N + 2}}} \right]} \\ where{\text{ }}n,k = 0,1,...,N - 1. \\ \end{gathered} \tag{2-16} X[k]=DCT8[x[n]]=2N+1 2n=0N1x[n]cos[4N+2π(2k+1)(2n+1)]x[n]=IDCT8[X[k]]=2N+1 2k=0N1X[k]cos[4N+2π(2k+1)(2n+1)]where n,k=0,1,...,N1.(2-16)

容易证明,类似于 DCT-II,式(2-16)所定义的离散余弦变换同样属于正交变换,在此不再赘述。

2.3 DCT-I

DCT-I 延拓的公式化表示如下,

y ~ [ m + k ( 2 N − 2 ) ] = x ~ [ ∣ m ∣ ] ,   m = − N + 1 , − N + 1 , . . . , N − 2. (2-17) \tilde y\left[ {m + k\left( {2N - 2} \right)} \right] = \tilde x\left[ {\left| m \right|} \right],{\text{ }}m = - N + 1, - N + 1,...,N - 2. \tag{2-17} y~[m+k(2N2)]=x~[m], m=N+1,N+1,...,N2.(2-17)

作为示例,图 2-1 所定义的有限长非对称实序列的 DCT-I 对称及周期延拓如图 2-7 所示,其对应的离散傅里叶变换序列如图 2-8 所示。

图 2-7 DCT-I 延拓
图 2-8 DCT-I 延拓序列的 DFT 序列

容易得到 DCT-I 对应的离散余弦变换公式如下,

X [ k ] = D C T 1 [ x [ n ] ] = 2 N − 1 γ k γ n ∑ n = 0 N − 1 x [ n ] cos ⁡ ( π k n N − 1 ) x [ n ] = I D C T 1 [ X [ k ] ] = 2 N − 1 γ k γ n ∑ k = 0 N − 1 X [ k ] cos ⁡ ( π k n N − 1 ) w h e r e   n , k = 0 , 1 , . . . , N − 1. (2-18) \begin{gathered} X[k] = DC{T_1}\left[ {x[n]} \right] = \sqrt {\frac{2}{ {N - 1}}} {\gamma _k}{\gamma _n}\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left( {\frac{ {\pi kn}}{ {N - 1}}} \right)} \\ x[n] = IDC{T_1}\left[ {X[k]} \right] = \sqrt {\frac{2}{ {N - 1}}} {\gamma _k}{\gamma _n}\sum\limits_{k = 0}^{N - 1} {X[k]\cos \left( {\frac{ {\pi kn}}{ {N - 1}}} \right)} \\ where{\text{ }}n,k = 0,1,...,N - 1. \\ \end{gathered} \tag{2-18} X[k]=DCT1[x[n]]=N12 γkγnn=0N1x[n]cos(N1πkn)x[n]=IDCT1[X[k]]=N12 γkγnk=0N1X[k]cos(N1πkn)where n,k=0,1,...,N1.(2-18)

其中

γ p = { 1 2 , p = 0   o r   p = N − 1 1 , o t h e r s . {\gamma _p} = \left\{ {\begin{array}{l} {\frac{1}{ {\sqrt 2 }},}&{p = 0{\text{ }}or{\text{ }}p = N - 1} \\ {1,}&{others} \end{array}} \right.. γp={ 2 1,1,p=0 or p=N1others.

2.4 DCT-III

DCT-III 延拓的公式化表示如下,

y ~ [ m + 4 k N ] = { x ~ [ ∣ m ∣ ] , ∣ m ∣ ⩽ N − 1 0 , ∣ m ∣ = N − x ~ [ 2 N − ∣ m ∣ ] , ∣ m ∣ ⩾ N + 1 w h e r e   m = − 2 N , − 2 N + 1 , . . . , 2 N − 1. (2-19) \begin{gathered} \tilde y[m + 4kN] = \left\{ {\begin{array}{l} {\tilde x\left[ {\left| m \right|} \right],}&{\left| m \right| \leqslant N - 1} \\ {0,}&{\left| m \right| = N} \\ { - \tilde x\left[ {2N - \left| m \right|} \right],}&{\left| m \right| \geqslant N + 1} \end{array}} \right. \\ where{\text{ }}m = - 2N, - 2N + 1,...,2N - 1. \\ \end{gathered} \tag{2-19} y~[m+4kN]= x~[m],0,x~[2Nm],mN1m=NmN+1where m=2N,2N+1,...,2N1.(2-19)

作为示例,图 2-1 所定义的有限长非对称实序列的 DCT-III 对称及周期延拓如图 2-9 所示,其对应的离散傅里叶变换序列如图 2-10 所示。

图 2-9 DCT-III 延拓
图 2-10 DCT-III 延拓序列的 DFT 序列

容易得到 DCT-III 对应的离散余弦变换公式如下,

X [ k ] = D C T 3 [ x [ n ] ] = 2 N ε n ∑ n = 0 N − 1 x [ n ] cos ⁡ [ π ( 2 k + 1 ) n 2 N ] x [ n ] = I D C T 3 [ X [ k ] ] = 2 N ε n ∑ k = 0 N − 1 X [ k ] cos ⁡ [ π ( 2 k + 1 ) n 2 N ] w h e r e   n , k = 0 , 1 , . . . , N − 1. (2-20) \begin{gathered} X[k] = DC{T_3}\left[ {x[n]} \right] = \sqrt {\frac{2}{N}} {\varepsilon _n}\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left[ {\frac{ {\pi \left( {2k + 1} \right)n}}{ {2N}}} \right]} \\ x[n] = IDC{T_3}\left[ {X[k]} \right] = \sqrt {\frac{2}{N}} {\varepsilon _n}\sum\limits_{k = 0}^{N - 1} {X[k]\cos \left[ {\frac{ {\pi \left( {2k + 1} \right)n}}{ {2N}}} \right]} \\ where{\text{ }}n,k = 0,1,...,N - 1. \\ \end{gathered} \tag{2-20} X[k]=DCT3[x[n]]=N2 εnn=0N1x[n]cos[2Nπ(2k+1)n]x[n]=IDCT3[X[k]]=N2 εnk=0N1X[k]cos[2Nπ(2k+1)n]where n,k=0,1,...,N1.(2-20)

其中

ε n = { 1 2 , n = 0 1 , n ≠ 0 {\varepsilon _n} = \left\{ {\begin{array}{l} {\frac{1}{ {\sqrt 2 }},}&{n = 0} \\ {1,}&{n \ne 0} \end{array}} \right. εn={ 2 1,1,n=0n=0

2.5 DCT-IV

图 2-1 所示有限长非对称实序列 x [ n ] x[n] x[n] 的 DCT-IV 对称及周期延拓如图 2-11(a) 所示。由于序列右移了 1/2,所有采样点都处于非整数索引位置,因此需要对该序列进行 2 倍的插零上采样,得到离散序列如图 2-12(b) 所示。准确来说,延拓序列的公式化定义如式(2-21)所示,其中波浪线代表相应有限长序列的周期延拓,非整数索引位置默认为 0。

y ~ [ m + 8 k N ] = { x ~ [ ∣ m ∣ − 1 2 ] , ∣ m ∣ ⩽ 2 N − 1 − x ~ [ 4 N − 1 − ∣ m ∣ 2 ] , ∣ m ∣ ⩾ 2 N w h e r e   m = − 4 N , − 4 N + 1 , . . . , 4 N − 1. (2-21) \begin{gathered} \tilde y\left[ {m + 8kN} \right] = \left\{ {\begin{array}{l} {\tilde x\left[ {\frac{ {\left| m \right| - 1}}{2}} \right],}&{\left| m \right| \leqslant 2N - 1} \\ { - \tilde x\left[ {\frac{ {4N - 1 - \left| m \right|}}{2}} \right],}&{\left| m \right| \geqslant 2N} \end{array}} \right. \\ where{\text{ }}m = - 4N, - 4N + 1,...,4N - 1. \\ \end{gathered} \tag{2-21} y~[m+8kN]= x~[2m1],x~[24N1m],m2N1m2Nwhere m=4N,4N+1,...,4N1.(2-21)

图 2-11(b) 所示延拓序列的 DFT 序列如图 2-12 所示。

图 2-11 DCT-IV 延拓(a)及其插零上采样(b)
图 2-12 DCT-IV 延拓序列的 DFT 序列

容易可得 DCT-IV 对应的离散余弦变换公式如下,

X [ k ] = D C T 4 [ x [ n ] ] = 2 N ∑ n = 0 N − 1 x [ n ] cos ⁡ [ π ( 2 k + 1 ) ( 2 n + 1 ) 4 N ] x [ n ] = I D C T 4 [ X [ k ] ] = 2 N ∑ k = 0 N − 1 X [ k ] cos ⁡ [ π ( 2 k + 1 ) ( 2 n + 1 ) 4 N ] w h e r e   n , k = 0 , 1 , . . . , N − 1 (2-22) \begin{gathered} X[k] = DC{T_4}\left[ {x[n]} \right] = \sqrt {\frac{2}{N}} \sum\limits_{n = 0}^{N - 1} {x[n]\cos \left[ {\frac{ {\pi \left( {2k + 1} \right)\left( {2n + 1} \right)}}{ {4N}}} \right]} \\ x[n] = IDC{T_4}\left[ {X[k]} \right] = \sqrt {\frac{2}{N}} \sum\limits_{k = 0}^{N - 1} {X[k]\cos \left[ {\frac{ {\pi \left( {2k + 1} \right)\left( {2n + 1} \right)}}{ {4N}}} \right]} \\ where{\text{ }}n,k = 0,1,...,N - 1 \\ \end{gathered} \tag{2-22} X[k]=DCT4[x[n]]=N2 n=0N1x[n]cos[4Nπ(2k+1)(2n+1)]x[n]=IDCT4[X[k]]=N2 k=0N1X[k]cos[4Nπ(2k+1)(2n+1)]where n,k=0,1,...,N1(2-22)

2.6 DCT-V

DCT-V 延拓的公式化表示如下,

y ~ [ m + k ( 2 N − 1 ) ] = x ~ [ ∣ m ∣ ] ,   m = − N + 1 , − N + 2 , . . . , N − 1. (2-23) \tilde y\left[ {m + k\left( {2N - 1} \right)} \right] = \tilde x\left[ {\left| m \right|} \right],{\text{ }}m = - N + 1, - N + 2,...,N - 1. \tag{2-23} y~[m+k(2N1)]=x~[m], m=N+1,N+2,...,N1.(2-23)

作为示例,图 2-1 所定义的有限长非对称实序列的 DCT-V 对称及周期延拓如图 2-13 所示,其对应的离散傅里叶变换序列如图 2-14 所示。

图 2-13 DCT-V 延拓
图 2-14 DCT-V 延拓序列的 DFT 序列

容易得到DCT-V对应的离散余弦变换公式如下,

X [ k ] = D C T 5 [ x [ n ] ] = 2 2 N − 1 ε k ε n ∑ n = 0 N − 1 x [ n ] cos ⁡ ( 2 π k n 2 N − 1 ) x [ n ] = I D C T 5 [ X [ k ] ] = 2 2 N − 1 ε k ε n ∑ k = 0 N − 1 X [ k ] cos ⁡ ( 2 π k n 2 N − 1 ) w h e r e   n , k = 0 , 1 , . . . , N − 1. (2-24) \begin{gathered} X[k] = DC{T_5}\left[ {x[n]} \right] = \frac{2}{ {\sqrt {2N - 1} }}{\varepsilon _k}{\varepsilon _n}\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left( {\frac{ {2\pi kn}}{ {2N - 1}}} \right)} \\ x[n] = IDC{T_5}\left[ {X[k]} \right] = \frac{2}{ {\sqrt {2N - 1} }}{\varepsilon _k}{\varepsilon _n}\sum\limits_{k = 0}^{N - 1} {X[k]\cos \left( {\frac{ {2\pi kn}}{ {2N - 1}}} \right)} \\ where{\text{ }}n,k = 0,1,...,N - 1. \\ \end{gathered} \tag{2-24} X[k]=DCT5[x[n]]=2N1 2εkεnn=0N1x[n]cos(2N12πkn)x[n]=IDCT5[X[k]]=2N1 2εkεnk=0N1X[k]cos(2N12πkn)where n,k=0,1,...,N1.(2-24)

其中

ε p = { 1 2 , p = 0 1 , p ≠ 0 . {\varepsilon _p} = \left\{ {\begin{array}{l} {\frac{1}{ {\sqrt 2 }},}&{p = 0} \\ {1,}&{p \ne 0} \end{array}} \right.. εp={ 2 1,1,p=0p=0.

2.7 DCT-VI

图 2-1 所示有限长非对称实序列 x [ n ] x[n] x[n] 的 DCT-VI 对称及周期延拓如图 2-15(a) 所示。由于序列右移了 1/2,所有采样点都处于非整数索引位置,因此需要对该序列进行 2 倍的插零上采样,得到离散序列如图 2-15(b) 所示。准确来说,延拓序列的公式化定义如式(2-25)所示,其中波浪线代表相应有限长序列的周期延拓,非整数索引位置默认为 0。

y ~ [ m + k ( 4 N − 2 ) ] = x ~ [ ∣ m ∣ − 1 2 ] ,   m = − 2 N + 1 , − 2 N + 2 , . . . , 2 N − 2. (2-25) \tilde y\left[ {m + k\left( {4N - 2} \right)} \right] = \tilde x\left[ {\frac{ {\left| m \right| - 1}}{2}} \right],{\text{ }}m = - 2N + 1, - 2N + 2,...,2N - 2.\tag{2-25} y~[m+k(4N2)]=x~[2m1], m=2N+1,2N+2,...,2N2.(2-25)

图 2-15(b) 所示延拓序列的 DFT 序列如图 2-16 所示。

图 2-15 DCT-VI 延拓(a)及其插零上采样(b)
图 2-16 DCT-VI 延拓序列的 DFT 序列

容易可得 DCT-VI 对应的离散余弦变换公式如下,

X [ k ] = D C T 6 [ x [ n ] ] = 2 2 N − 1 ε k η n ∑ n = 0 N − 1 x [ n ] cos ⁡ [ π k ( 2 n + 1 ) 2 N − 1 ] x [ n ] = I D C T 6 [ X [ k ] ] = 2 2 N − 1 ε k η n ∑ k = 0 N − 1 X [ k ] cos ⁡ [ π k ( 2 n + 1 ) 2 N − 1 ] w h e r e   n , k = 0 , 1 , . . . , N − 1. (2-26) \begin{gathered} X[k] = DC{T_6}\left[ {x[n]} \right] = \frac{2}{ {\sqrt {2N - 1} }}{\varepsilon _k}{\eta _n}\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left[ {\frac{ {\pi k\left( {2n + 1} \right)}}{ {2N - 1}}} \right]} \\ x[n] = IDC{T_6}\left[ {X[k]} \right] = \frac{2}{ {\sqrt {2N - 1} }}{\varepsilon _k}{\eta _n}\sum\limits_{k = 0}^{N - 1} {X[k]\cos \left[ {\frac{ {\pi k\left( {2n + 1} \right)}}{ {2N - 1}}} \right]} \\ where{\text{ }}n,k = 0,1,...,N - 1. \\ \end{gathered} \tag{2-26} X[k]=DCT6[x[n]]=2N1 2εkηnn=0N1x[n]cos[2N1πk(2n+1)]x[n]=IDCT6[X[k]]=2N1 2εkηnk=0N1X[k]cos[2N1πk(2n+1)]where n,k=0,1,...,N1.(2-26)

其中,

ε k = { 1 2 , k = 0 1 , k ≠ 0 ,   η n = { 1 2 , n = N − 1 1 , n ≠ N − 1 . {\varepsilon _k} = \left\{ {\begin{array}{l} {\frac{1}{ {\sqrt 2 }},}&{k = 0} \\ {1,}&{k \ne 0} \end{array}} \right.,{\text{ }}{\eta _n} = \left\{ {\begin{array}{l} {\frac{1}{ {\sqrt 2 }},}&{n = N - 1} \\ {1,}&{n \ne N - 1} \end{array}} \right.. εk={ 2 1,1,k=0k=0, ηn={ 2 1,1,n=N1n=N1.

2.8 DCT-VII

DCT-VII 延拓的公式化表示如下,

y ~ [ m + k ( 4 N − 2 ) ] = { x ~ [ ∣ m ∣ ] , ∣ m ∣ ⩽ N − 1 − x ~ [ 2 N − 1 − ∣ m ∣ ] , ∣ m ∣ ⩾ N m = − 2 N + 1 , − 2 N + 2 , . . . , 2 N − 2. (2-27) \begin{gathered} \tilde y\left[ {m + k\left( {4N - 2} \right)} \right] = \left\{ {\begin{array}{l} {\tilde x\left[ {\left| m \right|} \right],}&{\left| m \right| \leqslant N - 1} \\ { - \tilde x\left[ {2N - 1 - \left| m \right|} \right],}&{\left| m \right| \geqslant N} \end{array}} \right. \\ m = - 2N + 1, - 2N + 2,...,2N - 2. \\ \end{gathered} \tag{2-27} y~[m+k(4N2)]={ x~[m],x~[2N1m],mN1mNm=2N+1,2N+2,...,2N2.(2-27)

作为示例,图 2-1 所定义的有限长非对称实序列的 DCT-VII 对称及周期延拓如图 2-17 所示,其对应的离散傅里叶变换序列如图 2-18 所示。

图 2-17 DCT-VII 延拓
图 2-18 DCT-VII 延拓序列的 DFT 序列

容易可得 DCT-VII 对应的离散余弦变换公式如下,

X [ k ] = D C T 7 [ x [ n ] ] = 2 2 N − 1 η k ε n ∑ n = 0 N − 1 x [ n ] cos ⁡ [ π ( 2 k + 1 ) n 2 N − 1 ] x [ n ] = I D C T 7 [ X [ k ] ] = 2 2 N − 1 η k ε n ∑ k = 0 N − 1 X [ k ] cos ⁡ [ π ( 2 k + 1 ) n 2 N − 1 ] w h e r e   n , k = 0 , 1 , . . . , N − 1. (2-28) \begin{gathered} X[k] = DC{T_7}\left[ {x[n]} \right] = \frac{2}{ {\sqrt {2N - 1} }}{\eta _k}{\varepsilon _n}\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left[ {\frac{ {\pi \left( {2k + 1} \right)n}}{ {2N - 1}}} \right]} \\ x[n] = IDC{T_7}\left[ {X[k]} \right] = \frac{2}{ {\sqrt {2N - 1} }}{\eta _k}{\varepsilon _n}\sum\limits_{k = 0}^{N - 1} {X[k]\cos \left[ {\frac{ {\pi \left( {2k + 1} \right)n}}{ {2N - 1}}} \right]} \\ where{\text{ }}n,k = 0,1,...,N - 1. \\ \end{gathered} \tag{2-28} X[k]=DCT7[x[n]]=2N1 2ηkεnn=0N1x[n]cos[2N1π(2k+1)n]x[n]=IDCT7[X[k]]=2N1 2ηkεnk=0N1X[k]cos[2N1π(2k+1)n]where n,k=0,1,...,N1.(2-28)

其中,

η k = { 1 2 , k = N − 1 1 , k ≠ N − 1 ,   ε n = { 1 2 , n = 0 1 , n ≠ 0 . {\eta _k} = \left\{ {\begin{array}{l} {\frac{1}{ {\sqrt 2 }},}&{k = N - 1} \\ {1,}&{k \ne N - 1} \end{array}} \right.,{\text{ }}{\varepsilon _n} = \left\{ {\begin{array}{l} {\frac{1}{ {\sqrt 2 }},}&{n = 0} \\ {1,}&{n \ne 0} \end{array}} \right.. ηk={ 2 1,1,k=N1k=N1, εn={ 2 1,1,n=0n=0.

附录

附录 A DCT 的 8 种延拓方式

附录 B DCT 的 8 种变换公式

DCT-I

X [ k ] = D C T 1 [ x [ n ] ] = 2 N − 1 γ k γ n ∑ n = 0 N − 1 x [ n ] cos ⁡ ( π k n N − 1 ) . X[k] = DC{T_1}\left[ {x[n]} \right] = \sqrt {\frac{2}{ {N - 1}}} {\gamma _k}{\gamma _n}\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left( {\frac{ {\pi kn}}{ {N - 1}}} \right)} . X[k]=DCT1[x[n]]=N12 γkγnn=0N1x[n]cos(N1πkn).

DCT-II

X [ k ] = D C T 2 [ x [ n ] ] = 2 N ε k ∑ n = 0 N − 1 x [ n ] cos ⁡ [ π k ( 2 n + 1 ) 2 N ] . X[k] = DC{T_2}\left[ {x[n]} \right] = \sqrt {\frac{2}{N}} {\varepsilon _k}\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left[ {\frac{ {\pi k\left( {2n + 1} \right)}}{ {2N}}} \right]} . X[k]=DCT2[x[n]]=N2 εkn=0N1x[n]cos[2Nπk(2n+1)].

DCT-III

X [ k ] = D C T 3 [ x [ n ] ] = 2 N ε n ∑ n = 0 N − 1 x [ n ] cos ⁡ [ π ( 2 k + 1 ) n 2 N ] . X[k] = DC{T_3}\left[ {x[n]} \right] = \sqrt {\frac{2}{N}} {\varepsilon _n}\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left[ {\frac{ {\pi \left( {2k + 1} \right)n}}{ {2N}}} \right]} . X[k]=DCT3[x[n]]=N2 εnn=0N1x[n]cos[2Nπ(2k+1)n].

DCT-IV

X [ k ] = D C T 4 [ x [ n ] ] = 2 N ∑ n = 0 N − 1 x [ n ] cos ⁡ [ π ( 2 k + 1 ) ( 2 n + 1 ) 4 N ] . X[k] = DC{T_4}\left[ {x[n]} \right] = \sqrt {\frac{2}{N}} \sum\limits_{n = 0}^{N - 1} {x[n]\cos \left[ {\frac{ {\pi \left( {2k + 1} \right)\left( {2n + 1} \right)}}{ {4N}}} \right]} . X[k]=DCT4[x[n]]=N2 n=0N1x[n]cos[4Nπ(2k+1)(2n+1)].

DCT-V

X [ k ] = D C T 5 [ x [ n ] ] = 2 2 N − 1 ε k ε n ∑ n = 0 N − 1 x [ n ] cos ⁡ ( 2 π k n 2 N − 1 ) . X[k] = DC{T_5}\left[ {x[n]} \right] = \frac{2}{ {\sqrt {2N - 1} }}{\varepsilon _k}{\varepsilon _n}\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left( {\frac{ {2\pi kn}}{ {2N - 1}}} \right)} . X[k]=DCT5[x[n]]=2N1 2εkεnn=0N1x[n]cos(2N12πkn).

DCT-VI

X [ k ] = D C T 6 [ x [ n ] ] = 2 2 N − 1 ε k η n ∑ n = 0 N − 1 x [ n ] cos ⁡ [ π k ( 2 n + 1 ) 2 N − 1 ] . X[k] = DC{T_6}\left[ {x[n]} \right] = \frac{2}{ {\sqrt {2N - 1} }}{\varepsilon _k}{\eta _n}\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left[ {\frac{ {\pi k\left( {2n + 1} \right)}}{ {2N - 1}}} \right]} . X[k]=DCT6[x[n]]=2N1 2εkηnn=0N1x[n]cos[2N1πk(2n+1)].

DCT-VII

X [ k ] = D C T 7 [ x [ n ] ] = 2 2 N − 1 η k ε n ∑ n = 0 N − 1 x [ n ] cos ⁡ [ π ( 2 k + 1 ) n 2 N − 1 ] . X[k] = DC{T_7}\left[ {x[n]} \right] = \frac{2}{ {\sqrt {2N - 1} }}{\eta _k}{\varepsilon _n}\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left[ {\frac{ {\pi \left( {2k + 1} \right)n}}{ {2N - 1}}} \right]} . X[k]=DCT7[x[n]]=2N1 2ηkεnn=0N1x[n]cos[2N1π(2k+1)n].

DCT-VIII

X [ k ] = D C T 8 [ x [ n ] ] = 2 2 N + 1 ∑ n = 0 N − 1 x [ n ] cos ⁡ [ π ( 2 k + 1 ) ( 2 n + 1 ) 4 N + 2 ] . X[k] = DC{T_8}\left[ {x[n]} \right] = \frac{2}{ {\sqrt {2N + 1} }}\sum\limits_{n = 0}^{N - 1} {x[n]\cos \left[ {\frac{ {\pi \left( {2k + 1} \right)\left( {2n + 1} \right)}}{ {4N + 2}}} \right]} . X[k]=DCT8[x[n]]=2N+1 2n=0N1x[n]cos[4N+2π(2k+1)(2n+1)].

ε p = { 1 2 , p = 0 1 , p ≠ 0 ,   η p = { 1 2 , p = N − 1 1 , p ≠ N − 1 ,   γ p = { 1 2 , p = 0   o r   p = N − 1 1 , o t h e r s ,   k , n , p = 0 , 1 , . . . , N − 1. \begin{aligned} {\varepsilon _p} &= \left\{ {\begin{array}{c} {\frac{1}{ {\sqrt 2 }},}&{p = 0} \\ {1,}&{p \ne 0} \end{array}} \right., \\ {\text{ }}{\eta _p} &= \left\{ {\begin{array}{c} {\frac{1}{ {\sqrt 2 }},}&{p = N - 1} \\ {1,}&{p \ne N - 1} \end{array}} \right.,{\text{ }} \\ {\gamma _p} &= \left\{ {\begin{array}{c} {\frac{1}{ {\sqrt 2 }},}&{p = 0{\text{ }}or{\text{ }}p = N - 1} \\ {1,}&{others} \end{array}} \right.,\\ {\text{ }}k,n,p &= 0,1,...,N - 1. \\ \end{aligned} εp ηpγp k,n,p={ 2 1,1,p=0p=0,={ 2 1,1,p=N1p=N1, ={ 2 1,1,p=0 or p=N1others,=0,1,...,N1.

附录 C DCT 的 8 种变换对应的基图像

DCT 基图像生成脚本

# -*- coding: utf-8 -*-
from __future__ import division
import numpy as np
import matplotlib.pyplot as plt

def dct1_kern(N):
    x = np.zeros([N, N])
    for k in range(N):
        x[k, :] = np.cos(np.pi * k * np.arange(N) / (N - 1))
    x[:,  0] /= np.sqrt(2)
    x[:, -1] /= np.sqrt(2)
    x[0,  :] /= np.sqrt(2)
    x[-1, :] /= np.sqrt(2)
    
    x *= np.sqrt(2. / (N - 1))
    return x

def dct2_kern(N):
    x = np.zeros([N, N])
    for k in range(N):
        x[k, :] = np.cos(np.pi * k * (2 * np.arange(N) + 1) / (2 * N))
    x[0, :] /= np.sqrt(2)
    x *= np.sqrt(2. / N)
    return x
    
def dct3_kern(N):
    x = np.zeros([N, N])
    for k in range(N):
        x[k] = np.cos(np.pi * (2 * k + 1) * np.arange(N) / (2 * N))
    x[:, 0] /= np.sqrt(2)
    x *= np.sqrt(2. / N)
    return x

def dct4_kern(N):
    x = np.zeros([N, N])
    for k in range(N):
        x[k] = np.cos(np.pi * (2 * k + 1) * (2 * np.arange(N) + 1) / (4 * N))
    x *= np.sqrt(2. / N)
    return x

def dct5_kern(N):
    x = np.zeros([N, N])
    for k in range(N):
        x[k] = np.cos(2 * np.pi * k * np.arange(N) / (2 * N - 1))
    x[:, 0] /= np.sqrt(2)
    x[0, :] /= np.sqrt(2)
    x *= np.sqrt(4. / (2 * N - 1))
    return x

def dct6_kern(N):
    x = np.zeros([N, N])
    for k in range(N):
        x[k] = np.cos(np.pi * k * (2 * np.arange(N) + 1) / (2 * N - 1))
    x[:, -1] /= np.sqrt(2)
    x[0,  :] /= np.sqrt(2)
    x *= np.sqrt(4. / (2 * N - 1))
    return x

def dct7_kern(N):
    x = np.zeros([N, N])
    for k in range(N):
        x[k] = np.cos(np.pi * (2 * k + 1) * np.arange(N) / (2 * N - 1))
    x[:,  0] /= np.sqrt(2)
    x[-1, :] /= np.sqrt(2)
    x *= np.sqrt(4. / (2 * N - 1))
    return x

def dct8_kern(N):
    x = np.zeros([N, N])
    for k in range(N):
        x[k] = np.cos(np.pi * (2 * k + 1) * (2 * np.arange(N) + 1) / (4 * N + 2))
    x *= np.sqrt(4. / (2 * N + 1))
    return x

if __name__ == '__main__':
    path = 'dct_img/basis/'
    num = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII']
    
    for n in range(1, 9):
        kern = globals().get('dct{}_kern'.format(n))(8)
        '''
        把变换矩阵按行分块,记第k行的转置为ak,那么 h=[a1.T, a2.T, ..., a8.T],
        用矩阵分块的知识得到 v.dot(h) 的每一个子块是 ai.dot(aj.T),
        这样一次性就可以得到64个基图像拼起来的64x64的总图像了。
        '''
        h = kern.reshape([1, -1])
        v = h.T
        img = v.dot(h)
        
        plt.figure(figsize=(8, 8))
        plt.imshow(img, 'gray')
        plt.savefig(path+'/dct8x8_{}_all.png'.format(n), dpi='figure')
        
        imgs = []
        for i in range(8):
            for j in range(8):
                imgs.append(img[8*i:8*i+8, 8*j:8*j+8])
                #imgs.append(kern[[i], :].T.dot(kern[[j], :])) # 这种方法就是基图像一个一个地求

        imgs = np.stack(imgs)
        vmin, vmax = np.min(imgs), np.max(imgs)
        
        plt.figure(figsize=(32, 33))
        for i in range(8):
            for j in range(8):
                plt.subplot(8, 8, i*8+j+1)
                plt.imshow(imgs[i*8+j], 'gray', vmin=vmin, vmax=vmax)
                plt.axis('off')
                plt.tight_layout()
        plt.subplots_adjust(0.02, 0.02, 0.98, 0.95, 0.1, 0.1)
        plt.suptitle('DCT-'+num[n-1]+' basis', fontsize=48)
        plt.savefig(path+'/dct8x8_{}.png'.format(n), dpi=32)

猜你喜欢

转载自blog.csdn.net/qq_33552519/article/details/124917473