JPEG: Kompresi dalam Kompresi

Posted on Leave a commentPosted in Uncategorized

Tulisan ini merupakan tulisan daur ulang mengenai JPEG diambil dari blog sebelumnya.

Panda Merah. thanks to: bobo
Panda Merah. thanks to: bobo

Sebelum melihat bagaimana JPEG bekerja ada baiknya kita pahami dulu bagaimana BITMAP bekerja. Amati gambar di atas. Gambar di atas memiliki resolusi 700 x 465 pixel. Sehingga untuk menampung gambar tersebut dibutuhkan 325.500 pixel. Lalu bayangkan juga setiap pixel gambar merupakan percampuran dari 3 warna dasar komputer, Merah+Ijo+Biru a.k.a. RGB (RedGreenBlue), berarti kita butuh nilai-nilai yang bisa menampung ketiga jenis warna ini. Anggap saja kita pakai 1 byte untuk menampung 1 jenis warna. Berarti untuk satu jenis warna, kita punya variasi sebanyak 2^8 = 256 buah. Klo diterjemahkan ke bahasa komputer nilainya mulai dari 0 sampai 255. Dengan kata lain kita butuh 3 byte untuk menampung definisi satu pixel yang berisi 3 percampuran warna RGB yang memiliki 256^3 = 16.777.216 variasi warna. Sehingga untuk format BITMAP, total untuk menampung gambar di atas tadi, kita butuh 325.500 pixel x 3 byte = 976.500 byte. Namun, berapa ukuran file di atas sesungguhnya? Hanya sekitar 48.6 kbyte.

Terjadi penghematan 20 kali lipat dari format BITMAP yang semula. Bahkan, kita masih bisa juga menurunkan ukurannya lagi. Itulah JPEG. Apa kunci kompresi data gambar ini? Kuncinya adalah ketika kita bekerja dengan BITMAP, maka kita bekerja dengan pixel. Sedangkan jika kita bekerja dengan JPEG, kita akan bekerja dengan vektor.

Pertama, JPEG akan membagi gambar menjadi blok-blok yang besar tiap bloknya 8 x 8 pixel. Kedua, format warna RGB pada file gambar pada umumnya memiliki korelasi yang sangat kuat antar komponennya. Maka dari itu dicarilah representasi warna yang korelasi antar komponennya kurang, dengan harapan kita akan mendapatkan sifat-sifat yang sama sekali berbeda antar komponennya, yang tentu saja, berimplikasi mungkin kita bisa mendapatkan sesuatu yang baru yang bisa kita manfaatkan untuk data kompresi ini.

Terus, ada satu lagi, bisa dibilang domain, yang beda dengan domain warna RGB yang kita ketahui, yaitu luminance (Y), kromines biru (Cb), dan kromines merah (Cr). Luminance itu membawa informasi tentang tingkat kecerahan. Sedangkan kromines itu membawa informasi tentang hue. Dalam eksperiman psychovisual, manusia lebih sensitif terhadap luminance dibanding dengan kromines. Sekarang, kita benar-benar mendapatkan sifat yang benar-benar berbeda antar 2 komponen ini. Berarti kita bisa lebih sering-sering mengabaikan perbedaan-perbedaan yang ada di krominens. Dan yang lebih menguntungkannya lagi, kita punya 2 krominens.

Jadi, bagaimana sebetulnya merubah RGB ke YCbCr? Kita pake tool color space transform, bukan fourier transform. Berikut adalah caranya.

Berhubung determinannya nggak nol, berarti transformasi ini bisa dibalikkan. Tahap ketiga yang selanjutnya akan dilakukan adalah merubah setiap blok 8 x 8 pixel yang sudah berisi YCbCr ke domain frekuensi pake Discrete Cosine Transform (DCT) tipe kedua untuk 2 dimensi. Dengan DCT ini kita akan mendapatkan representasi warna dari YCbCr di domain frekuensi. Inilah transformasi yang akan kita pergunakan.

Di mana G(u,v) adalah hasil dari transformasi DCT di koordinat (u,v). Adapun u dan v, mereka sediri adalah koordinat di domain frekuensi dengan nilai mulai dari 0 sampai 7. Untuk α(n), dia akan bernilai akar seperdelapan (1/(8)^0,5) untuk n = 0, dan dia akan bernilai setengah untuk yang lainnya. α(n) sendiri adalah fungsi penormalisasi. Lalu g(x,y) adalah nilai salah satu komponen dari Y, Cb, atau Cr di koordinat (x,y).

Akan tetapi, seperti kita tahu, kita mendapatkan nilai YCbCr dari RGB dalam interval nilai positif semuanya. Nilai-nilai ini perlu kita buat lebih kompak terlebih dahulu sebelum di-DCT-kan, dengan cara mengurangi masing-masing nilai YCbCr dengan 128, sehingga kita mendapatkan interval nilai dari -128 sampai 127, bukan 0 sampai 255 lagi.

Jadi inilah hasil contoh transformasinya. Anggap saja ini matrix blok luminance.

Matrix pertama adalah matrix yang sudah dibuat lebih kompak bentuknya. Sedangkan matrix kedua adalah matrix hasil transformasi dari DCT. Yang perlu diperhatikan di sini adalah nilai-nilai pada sebelah kiri atas memiliki nilai yang cukup besar dan signifikan. Nilai yang paling ujung kiri sendiri disebut koefisien DC. Sisa yang lainnya namanya koefisien AC.

Keempat, langkah yang perlu dilakukan adalah kuantisasi. Mata manusia memiliki kepekaan yang bagus untuk melihat perbedaan kecil pada tingkat kecerahan di rentang area yang luas dibandingkan harus melihat perbedaan kecerahan di rentang area yang lebih sempit. Dengan kata lain, mata manusia bagus membedakan di frekuensi rendah tapi tidak bagus di frekuensi tinggi. Maka dari itu kita hanya perlu melakukan pengabaian nilai secara signifikan di frekuensi tinggi sekaligus melakukan optimalisasi keseluruhan nilai, terutama frekuensi rendah. Caranya dengan melakukan kuantisasi ke nilai yang lebih rendah. Berikut rumusnya.

A(i,j) adalah nilai awal hasil DCT yang belum terkuantisasi di posisi (i,j). B(i,j) adalah nilai hasil kuantisasi di posisi matrix (i,j). Q(i,j) adalah nilai faktor peng-kuantisasi dari matrix standar dari komite JPEG. Adapun fungsi bracket [ ] adalah fungsi pembulatan ke bilangan bulat terdekat. Adapun nilai β adalah faktor kualitas dari gambar yang dihasilkan. Anggap saja kualitas suatu gambar direpresentasikan oleh q, maka semakin tinggi nilai q maka semakin bagus kualitas gambar tersebut. Nah, nilai β ditentukan dari rumus berikut.

Standarnya, β bernilai 50. Dan inilah matriks standar pen-kuantisasi, Ql untuk luminance dan Qc untuk krominens, dan contoh matriks hasil kuantisasi.

Begitu banyak angka nol di sini. Maka dari itu kita hanya perlu melakukan setuhan akhir.

Terakhir, entropy coding namanya. Dia ini tipe loseless data compression. Caranya dengan mengurutkan data secara zigzag. Jadinya begini, -26 -3 0 -3 -2 -6 2 -4 1 -4 1 1 5 1 2 -1 1 -1 2 0 0 0 0 0 -1 -1 0 0 0 .. .. .. Dalam keadaan begini, dengan metode kompresi pohon Huffman, kita akan dapatkan data yang super duper kompak dan efisien. Dan dalam keadaan seperti inilah JPEG dibentuk. Maka wajar kita akan mendapatkan file gambar dengan ukuran yang kecil berkali-kali lipat.

Dan gimana caranya nge-decode kode ini ke gambar aslinya. Berarti urutannya tinggal kita balik. Kita susun ulang kode Huffman-nya, terus kita susun ulang kode entropi-nya, terus kita dekuantisasi (yang klo tadi dibagi faktor peng-kuantisasi, sekarang kita kali), trus kita balikan pake transformasi balik kosinus diskrit, setelah itu ditambah 128 masing-masing, terakhir tinggal kita kalikan lagi sama inver matriks pen-transform RGB ke YCbCr biar YCbCr-nya bisa balik lagi ke RGB.

Dan inilah fungsi balikan untuk invers DCT tadi.

Sekian.

Alat yang Baik

Posted on Leave a commentPosted in LaTeX

Alat pada dasarnya adalah sesuatu yang membantu meringankan manusia dalam melakukan sesuatu. Namun pada beberapa kasus, ada alat-alat yang terkadang menghambat atau memberatkan manusia untuk melakukan sesuatu. Memang setiap alat perlu dipelajari cara penggunaannya, tapi jika waktu yang dihabiskan untuk memahami atau menggunakan alat tersebut selalu lebih besar porsinya dibanding hal yang dikerjakan itu sendiri, kecocokan alat tersebut untuk anda menjadi dipertanyakan.

Kita ambil contoh kasus menulis ide.

Taruhlah, A memutuskan untuk menulis ide. Idenya terlajur muncul satu per satu di kepala dia dan dia seakan dikejar waktu untuk mengejawantahkan ide tadi dalam tulisan segera. Karena jika tidak, A merasa, ide-idenya bisa saja hilang kemudian seiring waktu. Maka A pun memutuskan untuk membuka Microsoft Word. Kebetulan, Windows yang ia gunakan adalah Windows bajakan dan kebetulan juga komputernya agak lambat digunakan untuk menjalankan Windows. Microsoft Word pun ia buka, dan ia menunggu loading dalam waktu 30 detik. Dia pun mulai menulis di Microsoft Word.

Tapi baru menulis satu baris, dia merasa, tulisan dia kurang rapi dan tidak ada judulnya. Padahal, ide sudah terlanjur muncul di kepala dia. Maka dia mengompromikan ide yang akan dia keluarkan untuk ditahan dulu, untuk memberi judul di tulisan yang ia tulis. Kemudian, dia melanjutkan menulis lagi. Tapi baru beberapa baris, dia merasa, judulnya harusnya rata tengah. Maka dia berhenti menulis idenya untuk kemudian membetulkan posisi judulnya dengan membuatnya rata tengah terlebih dahulu. Dia pun melanjutkan ide yang terhambat tapi.

Ternyata, baru beberapa baris, dia merasa font yang ia gunakan kurang indah, maka dia pun berhenti menulis, kemudian memilih-milih font yang akan ia gunakan. Ternyata memilih font, membutuhkan waktu 30 menit. Setelah itu, dia melanjutkan menulis idenya. Baru beberapa baris, dia merasa judul tulisan haruslah berwarna. Maka dia pun disibukkan dengan memilih warna judul. Kemudian, komputernya hang beberapa saat, dia jadi stress sendiri.

Sampai di sini, kegiatan A, sangatlah tidak terfokus. Dia berulang kali terdistraksi dan begitu khawatir dengan penampilan dari tulisan yang akan ia tulis. Dengan kata lain, kegiatan utama yang seharusnya “menulis ide”, berubah menjadi “mendesain dokumen”. Padahal A bukanlah anak seni, dibutuhkan ilmu tersendiri untuk mendesain sesuatu. Alhasil, A mempelajari terlebih dahulu ilmu mendesain, barulah ia melakukan kegiatan utamanya yaitu menulis ide.

Dia pun membuka Google Chrome, dan mulai berselancar di dunia maya tentang bagaimana cara memilih huruf yang baik. Sayangnya ketika dibuka, Google Chrome menampilkan halaman yang terakhir ia buka, yang kebetulan adalah sebuah halaman youtube berisi video yang sangat ia gemari. Ia pun terlena dan memutuskan berselancar di youtube beberapa jam. Di tengah jalan, dia sadar, dia ingin melakukan sesuatu, yaitu mencari cara memilih huruf yang baik. Dia pun belajar mencari cara huruf yang baik, sembari mendownload font-font yang menurutnya bagus untuk dikoleksi. Sayangnya, begitu A selesai dengan kegiatannya, ide yang tadi sempat akan ia munculkan, hilang duluan tertutupi kegiatan lainnya.

Tak dinyana, A pun dipanggil ibunya untuk belanja ke pasar. Dia menyimpan tulisan dia. Mematikan komputer. Dan ternyata, komputernya tidak mau dimatikan karena windowsnya minta diupdate dan tidak boleh langsung dimatikan begitu saja. Dengan sedih, A pun harap-harap cemas menunggu komputernya mati dahulu baru pergi ke pasar. Begitu selesai dari pasar, A melanjutkan kegiatannya tadi, dan singkat kata, dia pun menyelesaikan menuangkan idenya.

Sampai di sini jika dilihat-lihat, sebenarnya apa tujuan awal A tadi menyalakan komputer? Menulis ide. Tapi kegiatan yang ia habiskan ketika menulis ide bisa jadi 90% dihabiskan untuk kegiatan yang lain, sedangkan 10%-nya sendiri adalah inti kegiatan menulisnya.

Di sini kita bisa mengidentifikasi masalah A.

  1. Komputer lemot
  2. Windows bajakan, kadang hang, sering minta update
  3. Gampang terdistraksi dengan sesuatu

Solusinya, ada banyak.

  1. Bisa dengan ganti ke komputer yang lebih cepat. Tapi solusi ini butuh uang, dan A kebetulan lagi tidak memiliki cadangan yang mencukupi.
  2. Ganti ke Linux. Solusi ini menarik, karena dia bisa terbebas dari dosa menggunakan windows bajakan, sekaligus beralih ke sistem operasi yang kebanyakan gratisnya.
  3. Daripada pakai Microsoft Word, bukankan lebih baik dia menulis di Notepad?

Dengan menggunakan Notepad, dia akan “terpaksa” memfokuskan diri pada menulis ide, tidak dengan kegiatan yang lain. Sampai di sini, kegiatan menulis ide bisa berubah menjadi 90%, dan 10% sisanya paling hanya dihabiskan dengan mengklik beberapa tombol untuk membuka Notepad atau menyimpan dokumen.

Efisien, bukan?

Maka dari itu, mari kita kenali alat yang akan kita pergunakan untuk melakukan sesuatu. Apakah alat itu akan memberatkan kita, atau malah mempercepat kita melakukan sesuatu.

Kembali ke kasus A, ternyata tulisan ide yang ditulis sudah berpanjang-panjang dan jika dilihat-lihat sudah siap juga layak untuk dipublikasikan. Tentu Notepad tidak menjadi satu-satunya solusi untuk memecahkan persoalan A. Ada solusi tambahan lain yang efisien dan elegan, yaitu LaTeX. Bagaimana cara menggunakannya?

Cara penulisan $latex \LaTeX$ akan dibahas pada postingan selanjutnya.