2-D Discrete Wavelet Analysis
This section takes you through the features of 2-D discrete wavelet analysis using the Wavelet Toolbox™ software. The toolbox provides these functions for image analysis. For more information, see the function reference pages.
In this section the presentation and examples use 2-D arrays
corresponding to indexed image representations. However, the functions
described are also available when using truecolor images, which are
uint8. For more information on image formats,
see Wavelets: Working with Images.
Decomposition Structure Utilities
Denoising and Compression
Wavelet image denoising
Provide default values for denoising and compression
Penalized threshold for wavelet 1-D or 2-D denoising
Thresholds for wavelet 2-D using Birgé-Massart strategy
Wavelet denoising and compression
Threshold settings manager
In this section, you'll learn
How to load an image
How to analyze an image
How to compress an image
Wavelet Image Analysis and Compression
This example shows how you can use 2-D wavelet analysis to compress an image efficiently without sacrificing its clarity.
Note: Instead of directly using
image(I) to visualize the image
I, we use
image(wcodemat(I)), which displays a rescaled version of
I leading to a clearer presentation of the details and approximations (see
Load an image.
load wbarb whos X map
Name Size Bytes Class Attributes X 256x256 524288 double map 192x3 4608 double
Display the image.
image(X) colormap(map) colorbar
If the colormap is smooth, the wavelet transform can be directly applied to the indexed image; otherwise the indexed image should be converted to grayscale format. For more information, see Wavelets: Working with Images. Since the colormap is smooth in this image, you can now perform the decomposition.
Perform a single-level wavelet decomposition of the image using the
bior3.7 wavelet. The coefficient matrix
cA1 are the approximation coefficients. The horizontal, vertical, and diagonal details are in the matrices
wv = 'bior3.7'; [cA1,cH1,cV1,cD1] = dwt2(X,wv);
idwt1 to construct the approximations and details from the coefficients. (Note: You can also use
sx = size(X); A1 = idwt2(cA1,,,,wv,sx); H1 = idwt2(,cH1,,,wv,sx); V1 = idwt2(,,cV1,,wv,sx); D1 = idwt2(,,,cD1,wv,sx);
Display the approximations and details.
figure subplot(2,2,1) image(wcodemat(A1,192)) title('Approximation A1') subplot(2,2,2) image(wcodemat(H1,192)) title('Horizontal Detail H1') subplot(2,2,3) image(wcodemat(V1,192)) title('Vertical Detail V1') subplot(2,2,4) image(wcodemat(D1,192)) title('Diagonal Detail D1') colormap(map)
Regenerate the image by the single-level inverse discrete wavelet transform. Confirm the difference between the regenerated and original images are small.
Xrec = idwt2(cA1,cH1,cV1,cD1,wv); max(abs(X(:)-Xrec(:)))
ans = 1.4211e-13
Perform a level-2 wavelet decomposition of the image using the same
bior3.7 wavelet. The coefficients of all the components of a second-level decomposition (that is, the second-level approximation and the first two levels of detail) are returned concatenated into one vector,
S is a bookkeeping matrix that keeps track of the sizes of each component.
[c,s] = wavedec2(X,2,wv);
Extract the level 2 approximation coefficients. Extract the first- and second-level detail coefficients.
cA2 = appcoef2(c,s,wv,2); [cH2,cV2,cD2] = detcoef2('all',c,s,2); [cH1,cV1,cD1] = detcoef2('all',c,s,1);
Reconstruct the level 2 approximation and the level 1 and level 2 details.
A2 = wrcoef2('a',c,s,wv,2); H1 = wrcoef2('h',c,s,wv,1); V1 = wrcoef2('v',c,s,wv,1); D1 = wrcoef2('d',c,s,wv,1); H2 = wrcoef2('h',c,s,wv,2); V2 = wrcoef2('v',c,s,wv,2); D2 = wrcoef2('d',c,s,wv,2);
Display the approximation and details.
figure subplot(2,4,1) image(wcodemat(A1,192)) title('Approximation A1') subplot(2,4,2) image(wcodemat(H1,192)) title('Horizontal Detail H1') subplot(2,4,3) image(wcodemat(V1,192)) title('Vertical Detail V1') subplot(2,4,4) image(wcodemat(D1,192)) title('Diagonal Detail D1') subplot(2,4,5) image(wcodemat(A2,192)) title('Approximation A2') subplot(2,4,6) image(wcodemat(H2,192)) title('Horizontal Detail H2') subplot(2,4,7) image(wcodemat(V2,192)) title('Vertical Detail V2') subplot(2,4,8) image(wcodemat(D2,192)) title('Diagonal Detail D2') colormap(map)
[thr,sorh,keepapp] = ddencmp('cmp','wv',X); [Xcomp,CXC,LXC,PERF0,PERFL2] = ... wdencmp('gbl',c,s,wv,2,thr,sorh,keepapp);
Compare the compressed image with the original image.
fprintf('Percentage of wavelet coefficients set to zero: %.4f\nPercentage of energy preserved: %.4f\n',... PERF0,PERFL2);
Percentage of wavelet coefficients set to zero: 49.8011 Percentage of energy preserved: 99.9817
figure subplot(121) image(X) title('Original Image') axis square subplot(122) image(Xcomp) title('Compressed Image') axis square colormap(map)
Note that, even though the compressed image is constructed from only about half as many nonzero wavelet coefficients as the original, there is almost no detectable deterioration in the image quality.