我尝试对图像进行小波分析,我需要一些多尺度分解的方法。我正在试验PyWavelets包。然而,dwt2和idwt2方法只提供单一的标度。我可以迭代这些方法,并将单尺度分解应用于图像的较小区域;如果dwt2的结果由4个数组组成:
---------
| A | B |
---------
| C | D |
---------然后,我可以将dwt2应用于子数组A等等。然而,这里有一个困难,因为许多小波产生的阵列比输入要大。注意,在PyWavelets示例页上使用的小波是db1。但是如果我们尝试db2
>>> import pywt
>>> x = [3, 7, 1, 1, -2, 5, 4, 6]
>>> db2 = pywt.Wavelet('db2')
>>> X = pywt.wavedec(x, db2)
>>> print X[0]
[ 5.65685425 7.39923721 0.22414387 3.33677403 7.77817459]
>>> print X[1][0]
-2.44948974278
>>> print X[1][1]
-1.60368225335
>>> print X[1][2]
-4.44140056379因此,我似乎无法执行多级分解,除非使用db1 (这是Haar小波)。
我知道在其他包中有各种不同的小波实现,但我不知道它们是否提供了多维数据的健壮的多尺度分解。我在这里最好的选择是什么?
发布于 2015-04-04 00:23:23
问题是,相对于小波的支持宽度,您的输入向量非常短。给定输入长度和滤波器长度的最大有用分解级别如下:
max_level = floor(log2(input_len / (filter_len - 1)))max_level是至少一个小波系数仍然正确的最深层。在这种情况下,信号长度为8,小波分解滤波器长度(db2.dec_len)为4,因此:
max_level = floor(log2(8 / 3))
= floor(~1.415)Haar小波的滤波器长度为2,最大深度为3。PyWavelets提供了方便的函数pywt.dwt_max_level()来检验这一点。
通过将level=参数传递给pywt.wavedec(),可以强制任何任意高的分解级别。
X2 = pywt.wavedec(x, db2, level=10)
print(X2)
# [array([ 132.53206536, 133.27955261, 139.11658525]),
# array([-0.3417812 , 1.65856932, -1.31678812]),
# array([-0.24371917, 1.27639144, -1.03267227]),
# array([-0.15012416, 0.98850433, -0.83838017]),
# array([-0.04137053, 0.77800706, -0.73663653]),
# array([ 0.11632636, 0.63709966, -0.75342601]),
# array([ 0.38650452, 0.57015757, -0.95666209]),
# array([ 0.89346983, 0.60133166, -1.49480149]),
# array([ 0.04651697, -5.29123125, 4.49828673]),
# array([-1.0669873 , -3.81458256, 1.97307621, -0.0669873 ]),
# array([-2.44948974, -1.60368225, -4.44140056, -0.41361256, 1.22474487])]
print(pywt.waverec(X2, db2))
# [ 3. 7. 1. 1. -2. 5. 4. 6.]但是,这是毫无意义的:你只会得到虚假的系数,因为在小波滤波器和信号之间不再有足够的重叠。
https://stackoverflow.com/questions/28941775
复制相似问题