I am new to signal processing and currently doing a school project in wavelet transform using Python. I want to extract all details and approximations (Example: cA2, cA1, cD2, cD1), pywt could return the cA2, cD2, and cD1 except cA1. I noticed that there are the functions named appcoef and detcoef from MATLAB to return all the approximations and details. How can I do the same using pywt?
1 Answer
From the matlab docs https://www.mathworks.com/help/wavelet/ref/appcoef2.html the appcoef function does: "If N = NMAX, then a simple extraction is done; otherwise, appcoef2 computes iteratively the approximation coefficients using the inverse wavelet transform."
import pywt
def appcoef(coeffs, wavelet, level, **kwargs):
max_level = len(coeffs) - 1
if level == max_level:
return coeffs[0]
# this function also calculates the IDWT (kinda confusing API)
approx = pywt.waverec2(coeffs[:-level], wavelet, **kwargs)
# not sure why PyWavelets sometimes gives duplicate final rows/columns
if np.all(approx[-1] == approx[-2]):
approx = approx[:-1]
if np.all(approx[:, -1] == approx[:, -2]):
approx = approx[:, :-1]
return approx
I tested against matlab on a single grayscale image for a couple levels, and the normalized results matched to 1e-15; but of course there could be some issue I am missing for other cases.
Oh also detcoef: detcoef = lambda coeffs, level: coeffs[-level]