关于2D-DCT字典和克罗内克积以及二维字典的separable特性的个人理解

最近看了关于图像字典训练的部分,但是照着书中的讲解,却得不到书中的图像。

关于2D-DCT字典和克罗内克积以及二维字典的separable特性的个人理解

书中的2D-DCT字典是利用8*11的冗余1D-DCT字典的克罗内克积张成的,但是直接使用matlab的kron函数张成的图像是如下图所示:

关于2D-DCT字典和克罗内克积以及二维字典的separable特性的个人理解

而书中展示出来的字典是下图的形式:

关于2D-DCT字典和克罗内克积以及二维字典的separable特性的个人理解

那到底克罗内克积产生的字典应该是什么样的呢?其实,应该是第一张图片所示的字典,那书中到底是怎么回事呢?

实验后发现,原来书中为了能看明白每一列是什么内容,将由克罗内克积产生的64*121的字典reshape,每一列reshape为8*8的图像块,最终组合成展示字典。该展示字典的第i,j个块可以由下式生成:

DCTMTX(:,i)*DCTMTX(j,:)

也即是DCT冗余字典的第i列和第j行的张成矩阵。该字典的列向量是l2归一化的。

下面是直接生成展示字典的代码:

关于2D-DCT字典和克罗内克积以及二维字典的separable特性的个人理解

其生成的字典图像为:

关于2D-DCT字典和克罗内克积以及二维字典的separable特性的个人理解

该图像基本与书中类似。

另外,关于什么是separable的理解,个人认为,这个概念是相对于非结构化字典而言的。对于结构化的字典,进行二维计算时,不必显式存储,例如8*11的冗余字典DCTMTX,不必存储为64*121的克罗内克积张成字典,而仅需要通过对8*8的image patch左乘DCTMTX',右乘DCTMTX即可得到系数矩阵。而非结构化字典,比如K-SVD生成的字典,由于不存在克罗内克积等张成关系,因此必须显式存储,且只能通过将图像块变成一列,然后右乘字典转置。同时,将2D-DCT分离,使用左乘、右乘的方法,是存在快速算法的,而非结构化字典,只能硬乘,因此没有快速算法。当然为了解决这个问题,也会向非结构化字典内注入结构化因素,从而提高运算速度。