430 likes | 709 Views
Image Compression With Haar Discrete Wavelet Transform. Cory Cox ME 535 Computational Techniques in Mechanical Engineering.
E N D
Image Compression With Haar Discrete Wavelet Transform Cory Cox ME 535 Computational Techniques in Mechanical Engineering
An example of the 2D discrete wavelet transform that is used in JPEG2000. Source: http://en.wikipedia.org/wiki/File:Jpeg2000_2-level_wavelet_transform-lichtenstein.png
Importance Of Image Compression “Faster sites create happy users [...] Like us, our users place a lot of value in speed – that’s why we’ve decided to take site speed into account in our search rankings.” Google Spokesperson, 2010
Haar Discrete Wavelet Transform Method • Let’s assume we’re working with a grayscale image • Integer pixel values from 0 (black) ------- > 255 (white)
Haar Discrete Wavelet Transform Method Let’s look at the first row of the image matrix [88 88 89 90 92 94 96 97] How do we save this information accurately while using less storage space?
Haar Discrete Wavelet Transform Method [88 88 89 90 92 94 96 97] Split the row into pairs [88 88] [89 90] [92 94] [96 97] Take the averages [88 89.5 93 96.5] “Approximation Coefficients”
Approximation Coefficients [88 88 89 90 92 94 96 97] [88 89.5 93 96.5] “Approximation Coefficients” are a good estimate of the original pixel values, but it’s impossible to reconstruct the original data completely from the approximation coefficients Let’s choose to save four more values.
Detail Coefficients Let’s save four more values such that we can completely reconstruct the original data [88 88 89 90 92 94 96 97] [88 89.5 93 96.5] [0 -0.5 -1 -0.5] Approximation Coefficients Detail Coefficients “Detail Coefficients” are a measure of the distance from an approximation coefficient to the original points that are being approximated by an average value Example: [89 90] --- > Approximation Coefficient = 89.5 --- > Detail Coefficient = -0.5
Haar Discrete Wavelet Transform Method [88 88 89 90 92 94 96 97] [88 89.5 93 96.5 0 -0.5 -1 -0.5] Why would we want to save the approximation and detail coefficients rather than the original 8 values? Both vectors contain the same number of entries, so how does this save space?
Haar Discrete Wavelet Transform Method Sparse matrices save space! [88 88 89 90 92 94 96 97] [88 89.5 93 96.5 0 -0.5 -1 -0.5] This isn’t sparse enough so let’s do another row-wise iteration of the Haar discrete wavelet transform on the first four entries (the approximation coefficients)
Haar Discrete Wavelet Transform Method [88 88 89 90 92 94 96 97] [88 89.5 93 96.5 0 -0.5 -1 -0.5] [88.75 94.75 -0.75 -1.75 0 -0.5 -1 -0.5] [91.75 -3 -0.75 -1.75 0 -0.5 -1 -0.5] 1st Iteration 2nd Iteration 3rd Iteration
Haar Discrete Wavelet Transform Method [88 88 89 90 92 94 96 97] [91.75 -3 -0.75 -1.75 0 -0.5 -1 -0.5] All of the energy is concentrated in the leftmost entry The other entries are zero or near zero Now let’s do this for an entire matrix! 3rd Iteration
Original matrix After one iteration of row sums and differences
Original matrix Grayscale: 255 (white) -----> 0 (black) Lower Energy: -close to zero -black Higher Energy: -Far from zero -white After one iteration of row sums and differences
Original matrix After three iterations of row and column sums and differences
Original matrix Grayscale: 255 (white) -----> 0 (black) Lower Energy: -close to zero -black Higher Energy: -Far from zero -white After one iteration of row sums and differences
Haar Discrete Wavelet Transform Method How can we make this even more sparse? What if we define a limiting factor below which all pixel values are approximated as zero?
Haar Discrete Wavelet Transform Method Assume a limiting factor of 0.25 There are now 37 zero entries as opposed to the previous matrix which had only 16 zero entries
Compression Ratio • The Good: • Decrease the file size • The Bad (And the Ugly): • The downside is that when we reconstruct that image we’ll have lost some details and created some error in the pixel values
Procedure • Start with grayscale image of size 256 x 256 • Scan a row of the image at a time, finding the sums/differences between neighboring entries in the image matrix • Split the image matrix into a left side and a right side, storing the sums or approximate coefficients in one half and the differences or detail coefficients in the other half. • Scan the image matrix by columns, finding the sums/differences between neighboring entries • Split the matrix into a top half and bottom half, storing the sums in one half and the differences in the other half. • Repeat steps 2-7 for the smaller matrix where the sums of the column scan and the row scan overlap. In our case we’ll repeat 4 times to obtain an image matrix where all of the row and column sums are concentrated in the upper left hand corner in a 16 x 16 sub-matrix.
Procedure Step 1: Start with grayscale image of size 256 x 256
Procedure Step 2: Scan a row of the image at a time, finding the sums/differences between neighboring entries in the image matrix [88 88 89 90 92 94 96 97] [88 89.5 93 96.5 0 -0.5 -1 -0.5] Except for our image each row is 256 entries!
Procedure Step 3: Split the image matrix into a left side and a right side, storing the sums or approximate coefficients in one half and the differences or detail coefficients in the other half.
Procedure Step 4: Scan the image matrix by columns, finding the sums/differences between neighboring entries This is the same as scanning by rows. Our image is 256 x 256 so we also have 256 columns to scan.
Procedure Step 5: Split the matrix into a top half and bottom half, storing the sums in one half and the differences in the other half.
Procedure Step 6: Repeat steps 2-7 for the smaller matrix where the sums of the column scan and the row scan overlap. In our case we’ll repeat 4 times to obtain an image matrix where all of the row and column sums are concentrated in the upper left hand corner in a 16 x 16 sub-matrix. Original Image 1st Iteration 2nd Iteration 4th Iteration
Saving Compressed Image with Masks The compressed image is quantized and pixel values are turned into binary 4 bits per pixel ---- > 16 shades of gray 8 bits per pixel ---- > 255 shades of gray 16 bits per pixel --- > 65, 535 shades of gray
Saving Compressed Image with Masks To optimize the image compression process we can experiment with using different numbers of bits per pixel for different areas of the image Use most bits per pixel here… Use fewer bits per pixel here… Use fewer bits per pixel here… Use fewest bits per pixel here…
Saving Compressed Image with Masks Through testing various masks it seems that the best quality and compression results from the following pixel coding: 8 bits/pixel : 16 x 16 6 bits/pixel : 32 x 32 4 bits/pixel : 64 x 64 2 bits/pixel : 128 x 128 0 bits/pixel : 256 x 256
Results : Mean Square Error Compares the accuracy of a compressed and reconstructed image to the original image in terms of individual pixel values.
Results: Peak Signal to Noise Ratio Whereas the mean square error is indicative of the cumulative error, the peak signal to noise ratio describes a sort of maximum error The signal is the original image and the noise is the error that occurs as a result of the compression
Conclusion The results from this image compression are on the same order of magnitude that some other studies show The reconstructed image shows some signs of pixilation and error