Thursday, June 11, 2015

How JPEG Works (Part-3)

Pada bagian sebelumnya disebutkan inti dari konversi gambar ke format JPEG adalah proses DCT.

Berikut adalah rumus transformasi DCT.


Rumus DCT diatas menampilkan bagaimana gambar di proses dari domain spasial yaitu pixel (x,y) ke domain frekuensi yaitu "pixel" DCT (i,j).

Mungkin agak sulit membayangkan bagaimana rumus itu bekerja. Akan tetapi ilustrasi berikut membantu memudahkan penjelasan bagaimana rumus tsb bekerja.

Sebuah gambar terdiri dari banyak pixel. Gambar tsb di bagi-bagi dalam kotak-kotak kecil yang berisi 8 x 8 pixel. JPEG memang melakukan pengolahan gambar dengan basis 8 x 8 pixel, disebabkan ukuran pixel ini memberikan performa yang bagus bagi CPU komputer dan hasil kompresi yang cukup bagus, serta kecepatan pengolahan kompresi data.

Jika di perhatikan rumus DCT tsb, pada dasarnya cos [(2x+1)ix/2N] cos [(2y+1)jx/2N] dapat di buatkan lookup table (matrix x,y ) sehingga rumus nya menjadi lebih sederhana menjadi:

Cosines[x][j] * Cosines [y][j]

Demikian juga dengan 1/sqrt(2N) C[i] C[j]  dapat dibuatkan lookup table (matrix i,j) menjadi:


Coefficients[i][j]

Dengan demikian pengolahan DCT diatas dalam coding bahasa pemograman sbb:

for ( i = 0 ; i < N ; i++ )
   for ( j = 0 ; j < N ; j++ ) {
      temp = 0.0;
      for ( x = 0 ; x < N ; x++ )
         for ( y = 0 ; y < N ; y++ ) {
            temp += Cosines[ x ][ i ] *
            Cosines[ y ][ j ] * pixel[ x ][ y ];
            }
         temp *= sqrt( 2 * N ) * Coefficients[ i ][ j ];
      DCT[ i ][ j ] = INT_ROUND( temp );
   }

Disebabkan N=8, maka apabila dijalankan prosedur diatas akan terlihat bahwa apabila i=0 dan j=0 atau DCT [0][0] maka Cosines[x][0] = 1, dan Cosines[y][0]=1, artinya DCT[0][0] akan menjadi garis lurus (tidak ada komponen frekuensi). Maka DCT[0][0] sering disebut komponen DC. Sedangkan DCT selain dari DCT[0][0] fungsi cos tidak lagi =1, artinya variabel frekuensi sudah perperan (ingat cos bermain di ranah frekuensi)

Dengan demikian 64 buah pixel mulai dari pixel[0][0] sampai pixel[7][7] ditransformasikan ke DCT[0][0] sampai DCT[7][7], dengan nilai matrix:

DCT[0][0] = value paling besar <-- frekuensi 0 (komponen DC)
DCT[0][1] = value makin besar <-- frekuensi <> 0 (komponen AC)
. . .
DCT[i][j]
. . .
DCT[7][7] = value paling kecil (menjadi 0, apabila dibagi nilai Qunatisizer)

Nantinya DCT yang sudah di ujung-ujung karena nilainya setelah di bagi dengan Quantisizer value akan menjadi 0 maka sesuai dengan teknik kompresi, nilai 0 yang banyak dapat di kompress dengan sangat mudah.

Sebagi ilustrasi berikut adalah hasil pengolahan pixel (x,y) menjadi DCT(i,j).


Pixel perlu di normalisasi dari rentang 0 - 255 menjadi rentang -128 sd 127. Sehingga pixel (0,0) value 140 menjadi 140 - 128 = 12, dst.

Pixel normalisasi tsb di transformasi kan jadi "pixel" DCT.


Terlihat bahwa DCT(0,0) atau dalam matrix DCT[0][0] value nya adalah 186. Sedangkan DCT(7,7) valuenya 0. Terlihat semakin tinggi frekuensi (semakin mendekati posisi DCT(7,7)) maka semakin rendah nilai pixel DCT nya. Ide nya adalah nilai-nilai yang rendah (mendekati 0) bisa di buang, sehingga proses kompresi file gambar bisa terjadi.

Digambar terlihat bahwa komponen DC (Direct Current  atau komponen dengan frekuensi 0) dari DCT tsb yaitu DCT(0,0) value nya adalah 186.

Pada dasarnya sebuah potongan gambar dengan pixel 8 x 8 (64 buah pixel) dapat di wakilkan dengan beberapa pixel DCT saja, bahkan apabila kompresi sangat ditekan bisa dengan mengambil komponen DC nya saja. Artinya dari domain spasial 64 pixel diubah menjadi 1 pixel saja di domain frekuensi (yaitu komponen DC saja - dalam gambar 186).

Bagian 4 akan menjelaskan tentang Quantisizer.

No comments: