1
$\begingroup$

I've done something which is not exactly the jpeg algorithm. What I've done is that given an image $I$ of $N\times N$ size, I have computed the DCT of individual $8\times 8$ blocks.

Once this has been done, I have imposed that the top leftmost corner is left intact but the other elements be equalled to zero.

Then i compute the inverse-DCT on that block and use it to reconstruct my image.

The algorithm seems to work giving the following results

enter image description here

enter image description here

Given that I've ignored lots of steps in the jpeg algorithm (all the things related to huffman encoding, quantization matrix etc) why is this simple algorithm working?

Thanks.

$\endgroup$
  • $\begingroup$ Transform coding is the same (DCT). Then you apply a coarse quantization (all but dc terms equal to zero). From here, all JPEG does is only to encode the quantized coefficients (represent the coefficients with a number of bits as small as possible) by applying run length coding, differential coding, and hufman/arithmatic coding on the quantized coefficients. Also note that the dc term has the highest information (which is not quarantized here). That's why a quite sensible picture is reconstructed. $\endgroup$ – msm Sep 30 '16 at 2:16
  • $\begingroup$ Happy new year, and a reminder that your question and its answers require some action (votes, acceptance) $\endgroup$ – Laurent Duval Dec 31 '16 at 16:17
  • $\begingroup$ Happy new year, and thanks for your answer. $\endgroup$ – DLV Dec 31 '16 at 18:08
3
$\begingroup$

If you compute a $8\times 8$ 2D-DCT, and keep the top left corner only, you are keeping a quantity that is proportional to the average of each $8\times 8$ block. This is the DC component, similar to the $0$ frequency in a Fourier transform. This works like a JPEG coding with a quantization table looking like:

$$\displaystyle \left( \begin{array}{cccc} 1 & \infty & \cdots & \infty\\ \infty & \infty & \cdots & \infty\\ \vdots & \vdots & \ddots & \infty\\ \infty & \infty & \cdots & \infty \end{array}\right)$$

Performing the inverse DCT with this "kind of" quantization spreads the average value over the $8\times 8$ block. What you are doing is equivalent to performing a moving average with an $8\times 8$ uniform window and then downsampling by $8$ in both the $x$ and $y$ directions. You compress by replacing each $64$-pixel block by its average, resulting (effectively) in a $64$ times smaller image, and you "fake" an original size image by extrapolating the average.

However, you cannot claim a $1/64$ compression yet, because the coefficients you keep are not quantized yet, and are stored for instance on $32$-bit floating point words. Before you go into more advanced coding, you are about at a $1/16 = 1/64\times 32/8$ compression rate.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.