Одноуровневые неопределенные вейвлеты преобразуются в ошибку трехмерного массива

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

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