Kompresi JPEG Referensi – C program
Nyoman Bogi Aditya Karna Sisfo – IMTelkom
[email protected] http://bogi.blog.imtelkom.ac.id
Institut Manajemen Telkom http://www.imtelkom.ac.id
Kompresi JPEG @ Institut Manajemen Telkom (http://www.imtelkom.ac.id)
Kompresi Gambar dengan JPEG Pendahuluan Salah satu kompresi gambar photo yang paling banyak digunakan adalah JPEG (Joint Photographic Experts Group). Pada awalnya CCITT dan ISO mengembangkan teknik kompresi ini untuk gambar diam yang mampu mencapai tingkat kompresi rata-rata 15:1. Dalam perkembangan selanjutnya, kompresi JPEG juga diterapkan pada aplikasi real-time dan full-motion video (Motion JPEG MJPEG). Proses kompresi JPEG membutuhkan 2-dimensi Discrete Cosine Transform (2-D DCT), quantization (menggunakan array ternomalisasi), pengurutan secara zigzag, dan variable-lengthcoding di tahap Encoder. Pada tahap dekoding proses yang sebaliknya dilakukan di Dekoder untuk merekonstruksi gambar aslinya. Proses koding dan dekoding tersebut dijelaskan pada blok diagram di bawah ini.
Blok Enkoder mengubah gambar digital ke suatu blok kode yang merupakan hasil kompresi. Pada kompresi JPEG, Enkoder melakukan 3 tahapan proses yaitu DCT image transform, quantization dan mengkodekan gambar ke deretan angka biner. Fungsi dari Dekoder adalah untuk menterjemahkan blok kode tersebut menjadi suatu gambar utuh. Blok ini melakukan 3 tahapan proses yaitu decoding, dequantization, dan inverse image transform. Jadi keseluruhan operasi adalah berkebalikan.
JPEG Encoding Gambar di bawah ini menjelaskan proses enkoding JPEG. Sebelum diproses, gambar akan dibagi menjadi blok-blok gambar dengan ukuran 8x8 pixel. Kemudian setiap makroblok tersebut akan diproses secara independen. Sebelum melalui tahapan DCT, setiap harga pixel didalam makroblok dikurangi separuh nilai maksimumnya (misalnya dikurangi 128 untuk 256 level grayscale). Kemudian melalui proses DCT yang dilanjutkan dengan quantization, reordering, and image coding (Huffman coding).
Kompresi JPEG @ Institut Manajemen Telkom (http://www.imtelkom.ac.id)
JPEG Decoding Gambar di bawah menjelaskan proses dekoding JPEG. Proses dekoding dimulai dari Huffman-code dekoding dilanjutkan dengan pengurutan kembali (secara zigzag). Kemudian proses dequantization dan dilanjutkan dengan Inverse DCT. Proses terakhir adalah menambahkan dengan 128
Studi Kasus : Gambar grayscale 256 level dengan ukuran 16x16 pixel Data gambar tersebut : 255 255 255 255 251 0 0 0 0 0 0 241 255 255 255 255
255 255 255 255 253 0 0 0 0 0 0 247 255 255 255 255
255 255 255 255 255 255 0 0 0 0 255 255 255 255 255 255
255 255 255 255 255 255 249 0 0 249 255 255 255 255 255 255
255 255 255 255 255 255 255 0 0 255 255 255 255 255 255 255
0 63 225 255 255 255 255 0 0 255 255 255 255 199 0 29
0 219 255 255 255 255 255 255 255 255 0 0 173 255 255 255 255 255 255 255 0 0 0 117 255 255 255 255 255 255 27 0 0 157 255 255 255 255 255 255 195 0 0 0 0 189 255 255 255 255 243 0 0 0 0 245 255 255 255 255 255 0 0 0 0 25 223 223 223 233 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 217 45 0 0 0 17 213 213 213 239 255 35 0 0 0 233 255 255 255 255 225 0 0 0 0 173 255 255 255 255 39 0 0 195 255 255 255 255 255 255 0 0 0 83 255 255 255 255 255 255 0 0 231 247 255 255 255 255 255 255 0 215 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 0
0 0 219 63 0 0 225 0 0 255 27 0 255 195 0 255 243 0 255 255 0 0 0 0
SubImage 8x8 pixel 255 255 255 255 251 0 0 0
255 255 255 255 253 0 0 0
255 255 255 255 255 255 0 0
255 255 255 255 255 255 249 0
| 255 255 255 255 255 255 255 255 | 173 255 255 255 255 255 255 255 | 0 117 255 255 255 255 255 255 | 0 157 255 255 255 255 255 255 | 0 0 0 189 255 255 255 255 | 0 0 0 245 255 255 255 255 | 0 0 0 25 223 223 223 233 | 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 249 255 255 217 45 | 0 0 0 17 213 213 213 239 0 0 255 255 255 255 255 35 | 0 0 0 233 255 255 255 255 241 247 255 255 255 255 225 0 | 0 0 0 173 255 255 255 255 255 255 255 255 255 255 39 0 | 0 195 255 255 255 255 255 255 255 255 255 255 255 199 0 0 | 0 83 255 255 255 255 255 255 255 255 255 255 255 0 0 0 | 231 247 255 255 255 255 255 255 255 255 255 255 255 29 0 215 | 255 255 255 255 255 255 255 255
Kompresi JPEG @ Institut Manajemen Telkom (http://www.imtelkom.ac.id)
Listing Program: Img2JPEG.c #include <stdio.h> void DCT(float result[][8], float dct_matrix1[][8], float sub_image[][8], float dct_matrix2[][8]) { /* output=DCT(dct_matrix * sub_image * transposed_dct_matrix) */ int row,col,i; float temp[8][8]={{0}}; for (row=0; row<8; ++row) for (col=0; col<8; ++col) for (i=0; i<8; ++i) temp[row][col]+=dct_matrix1[row][i]*sub_image[i][col]; for (row=0; row<8; ++row) for (col=0; col<8; ++col) { result[row][col]=0; for (i=0; i<8; ++i) result[row][col]+=temp[row][i]*dct_matrix2[i][col]; } } int main(void) { float dct_matrix[8][8]= {{0.3536, 0.3536, 0.3536, 0.3536, 0.3536, 0.3536, 0.3536, 0.3536}, {0.4904, 0.4157, 0.2778, 0.0975,-0.0975,-0.2778,-0.4157,-0.4904}, {0.4619, 0.1913,-0.1913,-0.4619,-0.4619,-0.1913, 0.1913, 0.4619}, {0.4157,-0.0975,-0.4904,-0.2778, 0.2778, 0.4904, 0.0975,-0.4157}, {0.3536,-0.3536,-0.3536, 0.3536, 0.3536,-0.3536,-0.3536, 0.3536}, {0.2778,-0.4904, 0.0975, 0.4157,-0.4157,-0.0975, 0.4904,-0.2778}, {0.1913,-0.4619, 0.4619,-0.1913,-0.1913, 0.4619,-0.4619, 0.1913}, {0.0975,-0.2778, 0.4157,-0.4904, 0.4904,-0.4157, 0.2778,-0.0975}}; float transposed_dct_matrix[8][8]= {{0.3536, 0.4904, 0.4619, 0.4157, 0.3536, 0.2778, 0.1913, 0.0975}, {0.3536, 0.4157, 0.1913,-0.0975,-0.3536,-0.4904,-0.4619,-0.2778}, {0.3536, 0.2778,-0.1913,-0.4904,-0.3536, 0.0975, 0.4619, 0.4157}, {0.3536, 0.0975,-0.4619,-0.2778, 0.3536, 0.4157,-0.1913,-0.4904}, {0.3536,-0.0975,-0.4619, 0.2778, 0.3536,-0.4157,-0.1913, 0.4904}, {0.3536,-0.2778,-0.1913, 0.4904,-0.3536,-0.0975, 0.4619,-0.4157}, {0.3536,-0.4157, 0.1913, 0.0975,-0.3536, 0.4904,-0.4619, 0.2778}, {0.3536,-0.4904, 0.4619,-0.4157, 0.3536,-0.2778, 0.1913,-0.0975}}; int loop1, loop2; int row, col; float sub_image[8][8], quant[8][8], V[8][8]; int Q=1; /* creating the quantization table */ for (row=0; row<8; ++row) for (col=0; col<8; ++col) quant[row][col]=1+( (1+row+col)*Q ); /* input_image will be split into several 8x8 block */ /* blocks will be processed from left to right, top to bottom */ for (loop1=0; loop1<2; ++loop1) /* split column */ for (loop2=0; loop2<2; ++loop2) { /* split row */ for (row=0; row<8; ++row) for (col=0; col<8; ++col) sub_image[row][col]=image[loop1*8+row][loop2*8+col]-128;
Kompresi JPEG @ Institut Manajemen Telkom (http://www.imtelkom.ac.id)
/* Forward Image Transform */ DCT(V, dct_matrix, sub_image, transposed_dct_matrix); /* 2-D DCT */ for (row=0; row<8; ++row) /* Quantize V */ for (col=0; col<8; ++col) V[row][col]=floor(V[row][col]/quant[row][col]); /* Backward Image Transform */ for (row=0; row<8; ++row) /* de-Quantize V */ for (col=0; col<8; ++col) V[row][col]=floor(V[row][col]*quant[row][col]); DCT(sub_image, transposed_dct_matrix, V, dct_matrix); /* 2-D IDCT */ /* return the sub_image back to the original image */ for (row=0; row<8; ++row) for (col=0; col<8; ++col) image[loop1*8+row][loop2*8+col]=sub_image[row][col]+128; } }
References 1. Anil K. Jain, ‘Fundamentals of Digital Image Processing’, Prentice Hall, NJ, 1989 2. CCITT Recommendation T.81, ‘Information Technology-Digital Compression and Coding of Continuous-Tone Still Images-Requirements and Guidelines’, 1993.