The following example shows the different steps of compression using the Baseline sequential Lossy JPEG standard. It starts with a 8x8 image block and a corresponding bit pattern is generated at the end.

__INPUT 8x8(8 bit precision) Image Matrix__

117 118 120 121 121 121 120 119 118 119 121 122 122 121 120 120 120 120 121 122 121 121 121 120 119 120 120 120 119 119 119 119 119 118 118 118 117 117 117 117 118 118 117 116 115 115 115 116 120 119 117 116 114 115 116 116 121 120 118 117 115 115 116 117 |
This is a 8x8 block of a sample image |

The input matrix is level shifted(ie 128 substracted from each element values)
and a 2-D Discrete Cosine Transform is performed on all the elements. The
following 8x8 matrix is generated.

__Discrete Cosine Transformed Matrix__

-75 3 0 -1 0 0 0 0 |
This matrix is in frequency domain and the leftmost top element is the zero frequency or DC element. As can be seen except for a few low frequency coefficients, the amplitudes of all other elements are quite small or zero. |

__Sample Quantization Table Used__

6 6, 7, 10, 13, 29, 30, 28, 7, 7, 8, 12, 20, 29, 35, 28, 7, 9, 11, 15, 26, 44, 40, 31, 9, 11, 19, 28, 34, 55, 52, 39, 12, 18, 28, 32, 41, 52, 57, 46, 25, 32, 39, 44, 52, 61, 60, 51, 36, 46, 48, 49, 56, 50, 52, 50, |
This step achieves further compression by representing DCT coefficients with no greater precesion than is necessary to achieve the desired image quality and is a fundamentally LOSSY step. |

__Quantized and Rounded off Matrix__

1 -1 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
Each element in the DCT matrix is divided by the corresponding element of the Quantization matrix and the results rounded off to the nearest integer. |

This quantized values are now Zic-Zac ordered in the following way[{0, 0}, {0, 1}, {1, 0}, {2, 0}, {1, 1}, {0, 2}..] to generate a element stream

__ZicZac Ordered values__

-9 0 1 0 -1 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

__Entropy Encoding__

**STEP 1**. *Intermediate Symbol Generation*

The first term is a DC term which is differentially encoded. If the DC term of the preceeding block was for e.g. -14 then the difference is 5 (-9-(-14)).

The DC symbol format is [ Size ] [Amplitude]

DC symbol is ( 5 ) , ( 3 )

The AC symbol format is [ Runlength, Size ] [ Amplitude ]

So the Runlength Coded AC Symbols are

AC symbol is ( 1 , 1 ) , ( 1 )

AC symbol is ( 1 , 1 ) , ( -1 )

AC symbol is ( 2 , 1 ) , ( -1 )

After this all elements are zero and this is represented by a standard End Of Block symbol (0,0)

AC symbol is ( 0 , 0 )

Hence the intermediate symbol sequence are ( 5 )( 3 ), ( 1 , 1 )( 1 ), ( 1 , 1 )( -1 ), ( 2 , 1 )( -1 ), ( 0 , 0 )

**STEP 2**. *BitStream Generation*

The required luminance DC coefficient code are:

(5) 110

The required luminance AC coefficient code are:

(1,1) 1100

(2,1) 11100

(0,0) 1010

The amplitudes are related to complement representation

(3) 11

(1) 1

(-1) 0

Thus the JPEG bit-stream for this 8x8 image block is

**11011 11001 11000 111000 1010**

So 25 bits are required to represent the 64 coefficients(ie 512 bits) !!

And the resulting compression is around 0.4 bits/sample !!!

Tapan Samaddar |

** Note**: Many of the above
information is copyrighted content. Just contact me at the above email to use
any of the above content, for reference.