def idwt2(coeffs, wavelet, mode='sym'): """ 2D Inverse Discrete Wavelet Transform. Reconstruct data from coefficients arrays. coeffs - four 2D coefficients arrays arranged as follows: (approximation, (horizontal details, vertical details, diagonal details) ) wavelet - wavelet to use (Wavelet object or name string) mode - signal extension mode, see MODES """ if len(coeffs) != 2 or len(coeffs[1]) != 3: raise ValueError("Invalid coeffs param") # L -low-pass data, H - high-pass data LL, (LH, HL, HH) = coeffs (LL, LH, HL, HH) = (transpose(LL), transpose(LH), transpose(HL), transpose(HH)) for arr in (LL, LH, HL, HH): if len(arr.shape) != 2: raise TypeError("All input coefficients arrays must be 2D") del arr if not isinstance(wavelet, Wavelet): wavelet = Wavelet(wavelet) mode = MODES.from_object(mode) # idwt columns L = [] append_L = L.append for rowL, rowH in izip(LL, LH): append_L(idwt(rowL, rowH, wavelet, mode, 1)) del LL, LH H = [] append_H = H.append for rowL, rowH in izip(HL, HH): append_H(idwt(rowL, rowH, wavelet, mode, 1)) del HL, HH L = transpose(L) H = transpose(H) # idwt rows data = [] append_data = data.append for rowL, rowH in izip(L, H): append_data(idwt(rowL, rowH, wavelet, mode, 1)) return array(data, default_dtype)
def reconstruct(self, update=False): """ Reconstruct node's data value using coefficients from subnodes. If update param is True, then reconstructed data replaces node's data. Returns None if node is marked as ZeroTree. Returns original node data if all subnodes are None or are marked as ZeroTrees. Returns IDWT reconstructed data returned by reconstruct() method of two nodes otherwise. """ if self.isZeroTree: return None elif (self.a is None or self.a.isZeroTree) and (self.d is None or self.d.isZeroTree): return self.data else: data_a = None data_d = None if self.a is not None: data_a = self.a.reconstruct() if self.d is not None: data_d = self.d.reconstruct() if data_a is None and data_d is None: raise ValueError, "Can not reconstruct. Tree is missing data" else: rec = idwt(data_a, data_d, self.wavelet, self.mode, correct_size=True) if update: self.data = rec return rec
def _reconstruct(self, update): data_a, data_d = None, None node_a, node_d = self._get_node(self.A), self._get_node(self.D) if node_a is not None: data_a = node_a.reconstruct() # TODO: (update) ??? if node_d is not None: data_d = node_d.reconstruct() # TODO: (update) ??? if data_a is None and data_d is None: raise ValueError("Node is a leaf node and cannot be reconstructed" " from subnodes.") else: rec = idwt(data_a, data_d, self.wavelet, self.mode, correct_size=True) if update: self.data = rec return rec
def waverec(coeffs, wavelet, mode='sym'): """ Multilevel 1D Inverse Discrete Wavelet Transform. coeffs - coefficients list [cAn, cDn, cDn-1, ..., cD2, cD1] wavelet - wavelet to use (Wavelet object or name string) mode - signal extension mode, see MODES """ if not isinstance(coeffs, (list, tuple)): raise ValueError("Expected sequence of coefficient arrays.") if len(coeffs) < 2: raise ValueError("Coefficient list too short (minimum 2 arrays required).") a, ds = coeffs[0], coeffs[1:] for d in ds: a = idwt(a, d, wavelet, mode, 1) return a
def waverec(coeffs, wavelet, mode='sym'): """ Multilevel 1D Inverse Discrete Wavelet Transform. coeffs - coefficients list [cAn, cDn, cDn-1, ..., cD2, cD1] wavelet - wavelet to use (Wavelet object or name string) mode - signal extension mode, see MODES """ if not isinstance(coeffs, (list, tuple)): raise ValueError("Expected sequence of coefficient arrays.") if len(coeffs) < 2: raise ValueError( "Coefficient list too short (minimum 2 arrays required).") a, ds = coeffs[0], coeffs[1:] for d in ds: a = idwt(a, d, wavelet, mode, 1) return a
def idwt2(coeffs, wavelet, mode='sym'): """ 2D Inverse Discrete Wavelet Transform. Reconstruct data from coefficients arrays. coeffs - four 2D coefficients arrays arranged as follows (in the same way as dwt2 output -- see dwt2 description for details): (approximation, (horizontal details, vertical details, diagonal details) ) wavelet - wavelet to use (Wavelet object or name string) mode - signal extension mode, see MODES """ if len(coeffs) != 2 or len(coeffs[1]) != 3: raise ValueError("Invalid coeffs param") # L -low-pass data, H - high-pass data LL, (LH, HL, HH) = coeffs if not LL is None: LL = transpose(LL) if not LH is None: LH = transpose(LH) if not HL is None: HL = transpose(HL) if not HH is None: HH = transpose(HH) all_none = True for arr in (LL, LH, HL, HH): if arr is not None: all_none = False if len(arr.shape) != 2: raise TypeError("All input coefficients arrays must be 2D.") del arr if all_none: raise ValueError( "At least one input coefficients array must not be None.") if not isinstance(wavelet, Wavelet): wavelet = Wavelet(wavelet) mode = MODES.from_object(mode) # idwt columns L = [] append_L = L.append if LL is None and LH is None: L = None else: if LL is None: LL = cycle([ None ]) # IDWT can handle None input values - equals to zero-array if LH is None: LH = cycle([ None ]) # IDWT can handle None input values - equals to zero-array for rowL, rowH in izip(LL, LH): append_L(idwt(rowL, rowH, wavelet, mode, 1)) del LL, LH H = [] append_H = H.append if HL is None and HH is None: H = None else: if HL is None: HL = cycle([ None ]) # IDWT can handle None input values - equals to zero-array if HH is None: HH = cycle([ None ]) # IDWT can handle None input values - equals to zero-array for rowL, rowH in izip(HL, HH): append_H(idwt(rowL, rowH, wavelet, mode, 1)) del HL, HH if L is not None: L = transpose(L) if H is not None: H = transpose(H) # idwt rows data = [] append_data = data.append if L is None: L = cycle( [None]) # IDWT can handle None input values - equals to zero-array if H is None: H = cycle( [None]) # IDWT can handle None input values - equals to zero-array for rowL, rowH in izip(L, H): append_data(idwt(rowL, rowH, wavelet, mode, 1)) return array(data, default_dtype)
def idwt2(coeffs, wavelet, mode='sym'): """ 2D Inverse Discrete Wavelet Transform. Reconstruct data from coefficients arrays. coeffs - four 2D coefficients arrays arranged as follows (in the same way as dwt2 output -- see dwt2 description for details): (approximation, (horizontal details, vertical details, diagonal details) ) wavelet - wavelet to use (Wavelet object or name string) mode - signal extension mode, see MODES """ if len(coeffs) != 2 or len(coeffs[1]) != 3: raise ValueError("Invalid coeffs param") # L -low-pass data, H - high-pass data LL, (LH, HL, HH) = coeffs if LL is not None: LL = transpose(LL) if LH is not None: LH = transpose(LH) if HL is not None: HL = transpose(HL) if HH is not None: HH = transpose(HH) all_none = True for arr in (LL, LH, HL, HH): if arr is not None: all_none = False if len(arr.shape) != 2: raise TypeError("All input coefficients arrays must be 2D.") del arr if all_none: raise ValueError( "At least one input coefficients array must not be None.") if not isinstance(wavelet, Wavelet): wavelet = Wavelet(wavelet) mode = MODES.from_object(mode) # idwt columns L = [] if LL is None and LH is None: L = None else: if LL is None: # IDWT can handle None input values - equals to zero-array LL = cycle([None]) if LH is None: # IDWT can handle None input values - equals to zero-array LH = cycle([None]) for rowL, rowH in izip(LL, LH): L.append(idwt(rowL, rowH, wavelet, mode, 1)) del LL, LH H = [] if HL is None and HH is None: H = None else: if HL is None: # IDWT can handle None input values - equals to zero-array HL = cycle([None]) if HH is None: # IDWT can handle None input values - equals to zero-array HH = cycle([None]) for rowL, rowH in izip(HL, HH): H.append(idwt(rowL, rowH, wavelet, mode, 1)) del HL, HH if L is not None: L = transpose(L) if H is not None: H = transpose(H) # idwt rows data = [] if L is None: # IDWT can handle None input values - equals to zero-array L = cycle([None]) if H is None: # IDWT can handle None input values - equals to zero-array H = cycle([None]) for rowL, rowH in izip(L, H): data.append(idwt(rowL, rowH, wavelet, mode, 1)) return array(data, default_dtype)