1 """ Wrap pywt transform into LinearOperators """
2 import numpy as np
3 import pywt
4 from ..interface import LinearOperator
5 from ..ndoperators import NDOperator
6 from copy import copy
7
8 -def wavedec(shapein, wavelet, mode='sym', level=None, dtype=np.float64):
9 a = np.zeros(shapein)
10 b = pywt.wavedec(a, wavelet, mode=mode, level=level)
11 def matvec(x):
12 dec_list = pywt.wavedec(x, wavelet, mode=mode, level=level)
13 return np.concatenate(dec_list)
14 def rmatvec(x):
15 x_list = []
16 count = 0
17 for el in b:
18 n_el = np.asarray(el).size
19 x_list.append(np.array(x[count:count+n_el]))
20 count += n_el
21 return pywt.waverec(x_list, wavelet, mode=mode)
22 shapeout = matvec(a).size
23 return lo.LinearOperator((shapeout, shapein), matvec=matvec, rmatvec=rmatvec,
24 dtype=dtype)
25
26 -def wavelet2(shapein, wavelet, mode='zpd', level=None, dtype=np.float64):
27 """
28 2d wavelet decomposition / reconstruction as a NDOperator
29 """
30 a = np.zeros(shapein)
31 b = pywt.wavedec2(a, wavelet, mode=mode, level=level)
32 shapeout = coefs2array(b).shape
33 def matvec(x):
34 coefs = pywt.wavedec2(x, wavelet, mode=mode, level=level)
35 return coefs2array(coefs)
36 def rmatvec(x):
37 coefs = array2coefs(x, b)
38 return pywt.waverec2(coefs, wavelet, mode=mode)[:shapein[0], :shapein[1]]
39 return lo.NDOperator(shapein, shapeout, matvec, rmatvec, dtype=dtype)
40
42 out = coefs[0]
43 for scale in coefs[1:]:
44 if out.shape[0] == scale[0].shape[0] + 1:
45 out = out[:-1]
46 if out.shape[1] == scale[0].shape[1] + 1:
47 out = out[:, :-1]
48 out = np.vstack((np.hstack((out, scale[0])), np.hstack((scale[1], scale[2]))))
49 return out
50
52 ilim = [0, l[0].shape[0]]
53 jlim = [0, l[0].shape[1]]
54 coefs = [a[ilim[0]:ilim[1], jlim[0]:jlim[1]], ]
55 for i in xrange(1, len(l)):
56 ilim.append(ilim[-1] + l[i][0].shape[0])
57 jlim.append(jlim[-1] + l[i][0].shape[1])
58 scale = (a[0:ilim[-2], jlim[-2]:jlim[-1]],
59 a[ilim[-2]:ilim[-1], 0:jlim[-2]],
60 a[ilim[-2]:ilim[-1], jlim[-2]:jlim[-1]])
61 coefs.append(scale)
62 return coefs
63