为什么MATLAB的dualtree3函数不返回虚树的低通子带?

信息处理 matlab 信号分析 傅里叶变换 小波 转换
2022-02-10 11:46:48

MATLAB 有一个名为dualtree3计算 3-D 双树复小波变换的函数。此函数仅保留真实树的最后一个低通系数/子带。并且,它不保存假想树的低通子带。你怎么能证明这一点?

3个回答

TL,DR:低通分量(近似系数,a)的大小比预期的大(倍)。所以我猜测近似子带的8个avatar合二为一。23

首先,我没有花足够的时间检查代码,所以这可能是部分答案。在执行dualtree3分解时:

zr = rand(64,64,64);
[a,d] = dualtree3(zr,2);

及其反转:

xrec = idualtree3(a,d);

范数非常低,通常约为所以,从数字上讲,重建是“完美的”。因此,我不会相信低通近似“非常相似”的想法。这将产生更高的相对差异。对于实际的体积处理可能并不重要1015

现在,让我们看看子带。对于d, th 细节子带,一个得到:

  1×2 cell array
    {32×32×32×28 double}    {16×16×16×28 double}

所以你恢复了方向的细节,没关系。它们的大小分别是原始数据的现在,看看近似值:282343

a         32x32x32            262144  double              

奇怪的是,大小确实符合我们的预期。每个低通近似值(3D 中的 8 个)都应该是 size 16×16×16,类似于第二级细节。相反,看起来 8 个低通近似值被打包成一个更大的数组。23

最后,如果考虑到高通子带是复杂的(因此具有两倍的数组大小),则 3D 双树的全局大小除以原始立方体的大小为

(2*prod(size(d{1}))+2*prod(size(d{2}))+prod(size(a)))/prod(size(zr))

正如预期的那样,产生我通过三层分解获得了相同的结果。对我来说,所有信息都在这里,具有预期的冗余。没有储蓄,不幸的是。收集近似系数并不少见。它在 2D 中很少见(因为有一个形状因子)。这在 3D 中是可能的,因为个近似实例可以很好地适合一个立方体。我在文献中没有提到这一点。88

Nick Kingsbury 教授请回答我的问题!

在一维中,来自对偶树 WT 的两棵树 (a) 和 (b) 的低通基函数(缩放函数)往往看起来非常相似,除了它们之间输出采样周期的一半偏移. 因此,将两组低通样本视为来自单个 2x 过采样实数基函数的交错样本通常是最有意义的。

另一方面,来自 (a) 和 (b) 的高通基函数(小波)看起来近似于 Hilbert 函数对。因此它们最符合逻辑地解释为解析基函数的实部和虚部。

因此,对于多尺度小波变换的带通通道,低通通道中的 2 过采样代替了将吐出到实部 + 虚部通道中。当 4 棵树用于 2-D 双树 WT 或 8 棵树用于 3-D 版本时,类似的情况也适用。

我希望这有帮助。请参阅我们 2005 年在 IEEE 信号处理杂志上发表的论文以了解更多详细信息。

[2020 年 9 月 18 日更新]

既然我在上面引用了 Kingsubury 教授的回答,我还应该注意一件事。他在邮件中提到他对dualtree3MATLAB 中的函数并不熟悉。但是,根据我的问题,他给出了上述一般性答案

@LaurentDuval 是对的。

MATLAB 的dualtree3函数返回执行 3D 双树复小波变换 ( cplxdual3D) 时预期的所有细节和近似子带。但是,dualtree3函数不是返回单独的近似子带,而是将它们全部分组在一个立方体中。

下面,我通过使用 MATLAB 的内置dualtree3函数和cplxdual3DIvan Selesnick 教授的小波工具箱中的函数来解释它。

示例 1:一级分解

我们知道真正的 3D 离散小波变换 (DWT) 返回1近似子带和7详细的子带。

在实践中,cplxdual3D使用8 个真实的 3D 离散小波变换来实现。因此,在执行一个阶段之后cplxdual3D,我们期望有1×8近似子带和7×8详细的子带。

J = 1; % number of decomposition stage
[Faf,Fsf] = FSfarras; % filterbanks used in the first stage
[af,sf] = dualfilt1; % filterbanks used in the remaining stages

zr = rand(64,64,64); % Input volume

w = cplxdual3D(zr,J,Faf,af);

此函数返回一个名为 的元胞数组中的所有子带w,其中近似的子带可以通过 访问w{J+1}{m}{n}{p},其中m,n,p{1,2}.

对于上面的例子:

m = 1; n = 1; p = 1;
size(w{J+1}{m}{n}{p})

ans =
    32    32    32

所以,我们有32×32×32×8条目作为近似系数。

注意:我不知道为什么,但 MATLAB 的dualtree3函数不支持一级分解。

示例 2:两阶段分解

J = 2
w = cplxdual3D(zr,J,Faf,af);

size(w{J+1}{1}{1}{1})

ans =
    16    16    16

如上例所述,这里我们也有8近似子带。所以我们有16×16×16×8条目作为近似系数。

如果我们使用 MATLAB 的函数进行类似的实验dualtree3,我们会看到将dualtree3所有近似系数分组在一个大小的立方体中32×32×32

J = 2;
[a,d] = dualtree3(zr,J);
size(a)

ans =
    32    32    32

附加说明:此时,我不知道dualtree3将近似系数按什么顺序放入立方体中。为了找到它,您应该使用相同的滤波器组执行cplxdual3Ddualtree3比较分解的结果,以获取一个小而简单的示例。