1. 什么是DCT字典
参考《离散余弦变换(DCT)的来龙去脉》,所谓 DCT 字典就是对图像 F 进行 DCT 余弦变换时所采用的变换矩阵 A 。但是有一点需要注意,这个矩阵是一个方阵,也就是说不是一个过完备字典(过完备字典要求矩阵的行数远远小于矩阵的列数)。
2. 构成过完备字典的要求
过完备原子库通常要求具有广泛的时频特性以达到能够灵活反映图像特征的目的,对于字典中的单个原子 g(t)∈L2(R) 进行平移、伸缩、旋转、调制就可以生成过完备原子库,对 g(t) 有以下要求:
(1) 连续可微的实函数
(2) O(1/(t2+1))
(3) 范数为 1,即 ||g||=1
(4) ∫g(t)dt≠0,g(0)≠0
3. 如何从字典构成过完备字典
对于 DCT 变换后所获得的完备字典,采用上采样和调制的方法将其扩展成为过完备字典,具体的做法是将得到的完备字典对其频率上做更加精细的遍历和抽样,再乘以各种余弦进行调制,从而获得一个新的过完备字典。
3.1 网络上的参考程序
对于产生针对 8*8大小图片的, 64*256 大小的 DCT 字典,在网上有如下 Matlab 代码,但是这个代码是有问题的!
DCT=zeros(8,16);
Pn = 16; bb = 8;
for k=0:1:Pn-1,
V=cos([0:1:bb-1]'*k*pi/16);
if k>0, V=V-mean(V); end;
DCT(:,k+1)=V/norm(V);
end;
DCT=kron(DCT,DCT);
上面的代码中,V=cos([0:1:bb-1]'*k*pi/16);
相当于对 DCT 字典进行采样,但是这里需要注意的是,根据 DCT 变换的公式可知,本来值应该针对奇数点进行计算,但是在这里对里面的偶数也进行了计算,所以相当于一个分频采样;之后的kron(A,B)
相当于用A中的每一个元素乘以B矩阵,在重新构成的一个矩阵,实际上就是两个余弦函数相乘,所以可以理解为对于原始字典的一种调制。其中计算减去均值并处以方差的原因在于,在使用K-SVD训练字典的过程中,需要首先将字典按列归一化,而这一步可以理解为按列归一化。总的来说,上面构成过完备字典的过程就是首先对DCT字典进行分频采样,在进行调制,最终获得了 DCT 过完备字典。
但是!说过的,上面的代码是有问题的!问题在于以下两点,还有一点是可以进行改进的:
(1) 公式错误,在计算DCT字典的过程中忘了要在前面乘以系数 1N−−√ 和系数 2N−−√
(2) 归一化做早了。如果DCT过完备字典只是用来作为 K-SVD 的初始化字典,那么要对初始化的字典按列归一化,但是上面的程序在构建DCT字典的时候进行归一化,之后用归一化的字典再进行 kron 积运算,这样运算之后的字典的每一列显然不是均值为 0 方差为 1 的。下面举例说明,假设矩阵 A 和矩阵 B 的每一列均已经归一化完成,且矩阵 A 和矩阵 B 表示为如下形式