2D DWT detailed "compression" example #1

Load gray-scale image

img = ReadImage["cat256x256.ppm"] ; scale = 1 ;

Display image

ShowImage[img, scale] ;

[Graphics:../HTMLFiles/index_27.gif]

Define wavelet filter

db4 = DaubechiesFilter[4] ;

Compression example (Daubechies-4, 5-level)

DWT output size

imgsize = 500 ;

Define filter, levels,  output options

filter = db4 ; level = 5 ; func = Abs ; plotstyle = PlotRangeAutomatic ;

DWT

dwt = WaveletTransform2D[img, filter, level] ; ShowWaveletTransform2D[dwt, level, func, plotstyle, ImageSizeimgsize] ;

[Graphics:../HTMLFiles/index_32.gif]

Eliminate progressively more small wavelet coefficients

CompressImage[dwt_, thresh_] := Map[If[Abs[#] < thresh, 0, #] &, dwt, {2}] ;

dwtc = CompressImage[dwt, #] & /@ {1, 5, 10, 25, 50, 75, 100, 150} ;

Count number of nonzero wavelet coefficients as threshold is increased

(100 ((Times @@ Dimensions[img]) - (Position[#, 0] // Length))/(Times @@ Dimensions[img])) & /@ dwtc // N

RowBox[{{, RowBox[{83.1985, ,, 40.2893, ,, 21.2967, ,, 6.41937, ,, 2.43073, ,, 1.46484, ,, 1.03455, ,, 0.63324}], }}]

Show compressed DWTs

ShowWaveletTransform2D[#, level, func, plotstyle, ImageSizeimgsize] & /@ dwtc ;

[Graphics:../HTMLFiles/index_38.gif]

[Graphics:../HTMLFiles/index_39.gif]

[Graphics:../HTMLFiles/index_40.gif]

[Graphics:../HTMLFiles/index_41.gif]

[Graphics:../HTMLFiles/index_42.gif]

[Graphics:../HTMLFiles/index_43.gif]

[Graphics:../HTMLFiles/index_44.gif]

[Graphics:../HTMLFiles/index_45.gif]

Take inverse DWTs

imgc = InverseWaveletTransform2D[#, filter, level] & /@ dwtc ;

Show compressed images

ShowImage[#, scale] & /@ imgc ;

[Graphics:../HTMLFiles/index_48.gif]

[Graphics:../HTMLFiles/index_49.gif]

[Graphics:../HTMLFiles/index_50.gif]

[Graphics:../HTMLFiles/index_51.gif]

[Graphics:../HTMLFiles/index_52.gif]

[Graphics:../HTMLFiles/index_53.gif]

[Graphics:../HTMLFiles/index_54.gif]

[Graphics:../HTMLFiles/index_55.gif]


Created by Mathematica  (February 16, 2004)