1

我有 MATLAB 代码1D Wavelets2D Wavelets分解。如何3D Wavelets使用 1D 和 2D 小波创建?我不想使用 MATLAB 的内置函数wavedec3

4

1 回答 1

2

小波变换可以表示为可分离的滤波器。结合 1D 和 2D 小波变换可以通过利用它们的可分离性直接完成。

具体来说:假设您有一个 NX x NY x NZ 体素的 3D 数据集“数据”。伪代码中可能的 3D 小波变换将是:

for iz = 0 .. NZ - 1:
   FWT2D(data[:, :, iz]) //apply 2D transform to the slices

tmp = 0 * [NZ][NY][NX] //initialize 

//x-z transposition to have unit-stride in z
for ix = 0 .. NX - 1:
   for iz = 0 .. NZ - 1:
       tmp[iz, :, ix] = data[ix, :, iz]

for ix = 0 .. NX - 1:
   for iy = 0 .. NY - 1:
       FWT1D(tmp[:, iy, ix]) //apply 1D transform to z-streams

//transpose back
for ix = 0 .. NX - 1:
   for iz = 0 .. NZ - 1:
       data[ix, :, iz] = tmp[iz, :, ix]

建议的解决方案是“围绕”您的 1D 和 2D 小波变换编写的,即它应该允许直接重用您的内核而无需修改代码。备注:我假设您的内核实现了完整的小波变换,而不仅仅是一步变换。

如果您不喜欢转置,很公平:-),您应该修改一维变换以允许数据的非单位步长访问沿 z 方向跳跃。

如果您需要应用 2D 内核在 XZ 或 YZ 方向上操作,则可以推导出类似的算法。

最后一点:由于小波变换转换为可分离滤波器,理论上您可以沿不同方向组合不同的小波。

于 2016-02-11T13:34:47.733 回答