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