Как создавать 3D-вейвлеты с использованием 1D и / или 2D-вейвлетов?

У меня есть код MATLAB для 1D Wavelets а также 2D Waveletsразложения. Как я могу создать 3D Wavelets используя 1D и 2D Wavelets? Я не хочу использовать встроенную функцию MATLAB wavedec3,

1 ответ

Вейвлет-преобразования могут быть представлены как отдельные фильтры. Комбинирование одномерных и двумерных вейвлет-преобразований может быть осуществлено напрямую, используя преимущества их разделяемости.

В частности: предположим, что у вас есть "данные" набора данных 3D NX x NY x NZ вокселей. Возможное трехмерное вейвлет-преобразование в псевдокоде будет:

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 вейвлет-преобразований, то есть оно должно позволить прямое повторное использование ваших ядер без каких-либо модификаций кода. Замечание: я предположил, что в ваших ядрах реализованы полные вейвлет-преобразования, а не только одношаговое.

Если вам не нравится транспонирование, достаточно справедливо:-), вам следует изменить свое 1D-преобразование, чтобы позволить доступ к данным без единого шага для перехода по z-направлению.

Аналогичные алгоритмы могут быть получены, если вам нужно применить 2D-ядро для работы в направлениях XZ или YZ.

Последнее замечание: поскольку вейвлет-преобразования преобразуются в разделяемые фильтры, теоретически вы можете комбинировать разные вейвлеты в разных направлениях.

Другие вопросы по тегам