Одноуровневые неопределенные вейвлеты преобразуются в ошибку трехмерного массива
Я пытался применить одноуровневое преобразование неопределенных вейвлетов к трехмерной схеме с использованием функции swtn из пакета pywavelets в python следующим образом:
import numpy as np
from pywavelts import swtn
img = np.random.rand(4,4,5)
WT = swtn(img, 'coif1', level = 1, start_level = 0)
который вызывает ошибку:
Traceback (most recent call last):
File "<ipython-input-60-1f6f4144a239>", line 1, in <module>
pywt.swtn(img, 'coif1', level=1, start_level =0, axes=None)
File "/usr/local/lib/python2.7/dist-packages/pywt/_swt.py", line 387, in swtn
axis=axis)[0]
File "pywt/_extensions/_swt.pyx", line 100, in pywt._extensions._swt.swt_axis (pywt/_extensions/_swt.c:6203)
File "pywt/_extensions/_swt.pyx", line 116, in pywt._extensions._swt.swt_axis (pywt/_extensions/_swt.c:5035)
ValueError: start_level must be less than 0.
Однако это не имеет смысла для меня, поскольку значение начального уровня меньше 0 не допускается вейвлет-разложением. Может ли кто-нибудь взглянуть и указать мне, что мне не хватает?
3 ответа
У меня была такая же ошибка. Это связано с размером используемого массива: так как он не делится на 2, максимальное количество уровней, заданное функцией:
pywt.swt_max_level
равно 0. Например, это:
img = np.random.rand(4,4,6)
WT = swtn(img, 'coif1', level = 1, start_level = 0)
работает для меня.
Из «Примечаний» на странице документации pywt.swtn
.... требует, чтобы длина сигнала по преобразованным осям была кратна уровню 2**. Если это не так, пользователь должен увеличить до подходящего размера с помощью такой функции, как numpy.pad.
В вашем случае размер вашей третьей оси должен быть кратным 2.
Я что-то реализую с помощью пакета python PyWavelets, но получаю ту же ошибку. Я дополнил массив, чтобы он соответствовал указанному в документации. Я использую swt2 как метод для двумерного массива. Я рассчитываю максимальный уровень с помощью swt2_max_level.
N_max= pywt.swt_max_level(img_array.size)
N_max
В этом случае N_max становится равным 3.
Цикл for, в котором диапазон равен (1, N_max) после того, как уровень достигает 2, процесс вычисления коэффициентов прерывается
for level in range (1, N_max):
print ("Level of decomposition is:" + str(level))
coeffs=pywt.swt2(img_array, 'db4', level, axes=(0,1))
print (coeffs)
и я получаю
ValueError: start_level must be less than 1.
Работает для уровня = 1.
Более того, я пытался вручную выставить уровень от 1 до 3, и каждый раз он без проблем вычислял коэффициенты.
Есть идеи, почему так происходит? Мне нужно рассчитать это автоматически, так как после расчета коэффициентов у меня есть другие действия, которые нужно выполнить, и в моем анализе массив img_array изменяется каждый раз, когда я вводю другое изображение, следовательно, разные длины сигналов и максимальные уровни декомпозиции.