Senin, 04 Oktober 2010

Citra Digital

Konsep citra berwarna

Pengantar

Di dalam dunia dijital dikenal 2 jenis citra, yaitu citra berwarna dan citra monokrom. Perbedaan yang mendasar diantara keduanya terletak pada informasi warna pada setiap pixel. Pada artikel kali ini akan dibahas mengenai konsep-konsep dasar pada citra berwarna.

Sebenarnya, apa sih yang disimpan oleh sebuah file citra? Contoh misalkan, jika kita membuka file citra yang mempunyai extension jpeg, informasi apa yang akan dipergunakan oleh komputer untuk menampilkan citra? Kalau kita teliti lebih jauh, sebenarnya ada dua bagian besar yang lazim ditemui pada file-file citra. Bagian pertama disebut sebagai header yang berisi informasi mengenai bagaimana informasi citra disimpan, dan bagian yang kedua adalah informasi warna pada setiap pixel. Dimana kah meta data dari citra yang sering dibahas di infotainment? Nanti akan saya ceritakan diartikel yang lain.

Representasi matematis citra

Ok, balik ke pembahasan. Hal yang terpenting dalam memanipulasi data citra adalah pada informasi warna pada setiap pixel. Informasi ini seperti layaknya informasi kata-kata yang ada pada file text seperti .txt. Pada citra berwarna informasi ini biasa dipecah dalam 3 komponen warna yang lazim disebut RGB (Red Green Blue). Seperti yang kita ketahui kita dapat membuat warna apapun. Sebagai ilustrasi, silahkan lihat gambar di bawah ini (Gambar diambil dari http://en.wikipedia.org/wiki/RGB_color_model)


Secara matematis, kita dapat menuliskan sebuah citra sebagai sebuah fungsi dua dimensi f yang berisi nilai RGB pada koordinat (x,y).

   1: f(x,y) = [RGB]

Representasi Matrix

Nilai RGB bisa direpresentasikan dengan berbagai cara. Misalkan, BufferedReader pada java merepresentasikannya dalam bentuk sebuah integer (untuk lebih lanjut, silahkan tilik tutorial berikut). Cara yang lain adalah dengan merepresentasikannya dalam bentuk matrix 3 dimensi. Sebagai ilustrasi, marilah lihat gambar dibawah ini.

Pada gambar diatas, komponen red pada lokasi (0,0), bernilai 78, green 200, dan blue 12. Di dalam program, kita dapat menuliskannya sebagai berikut.

   1: const int RED = 0;
   2: const int GREEN = 1;
   3: const int BLUE = 2;
   4:  
   5: f[0][0][RED] = 78;
   6: f[0][0][GREEN] = 200;
   7: f[0][0][BLUE] = 12;

3 baris pertama dibuat agar code mudah dibaca. Note: Ini bukanlah satu-satunya cara untuk membuat representasi matrix. Ada banyak jalan menuju Roma!

Pertanyaan yang cukup menarik untuk dijawab adalah apa arti angka 78? Bagaimana meramu campuran RGB agar mendapatkan warna putih atau hitam?

Nilai dari masing-masing komponen berkisar 0 sampai dengan 255 jika direpresentasikan dengan integer (bilangan tanpa ada desimal). warna putih didapat ketika kita memberikan nilai 255 pada setiap komponen. Sebaliknya jika kita memberikan nilai 0 pada semua komponen, kita akan mendapatkan warna hitam. Sebenarnya teknik mencampur seperti ini sesuai dengan kenyataan. Jika kita mencampur warna merah hijau dan biru sebanyak-banyaknya, maka kita akan mendapatkan warna putih. Sebaliknya, warna hitam didapat jika kita tidak mencampur apa-apa.

int atau double?

Seperti yang telah disebutkan kalau nilai dari masing-masing komponen berkisar 0 sampai dengan 255 jika direpresentasikan dalam bentuk integer. Sebenarnya ada represenstasi yang lain, yaitu antara 0 sampai dengan 1 dalam bentuk floating point (bilangan desimal). Penggunaan floating point tentunya memiliki kelebihan dalam presisi ketimbang memakai nilai yang diskrit. Namun demikian, penggunaan floating point akan membuat file citra membesar.

Biasanya citra disimpan dalam representasi integer. Representasi floating point dipergunakan pada saat citra dimodifikasi. Bagaimana cara mengubah dari representasi integer ke floating point? Mudah, tinggal membagi nilai integer dengan angka 255. Sebagai contoh, jika kita ingin mengubah nilai komponen green.

   1: double green_d = green_i / 255;

Apa sih kegunaan representasi matrix?

Oh banyak kegunaannya. Salah satu contoh menarik adalah jika kita ingin membuat suatu citra menjadi citra abu2x. Caranya? dengan merata-rata semua komponen dari setiap pixel. Berikut adalah contoh singkat untuk melakukan hal tersebut.

   1: for (int x = 0; x <>      
   2:    for (int y = 0; y <>      
   3:    {
   4:        double rata = (f[x][y][RED] + f[x][y][GREEN] + f[x][y][BLUE]) / 3.0;
   5:        f[x][y][RED] = rata;
   6:        f[x][y][GREEN] = rata;
   7:        f[x][y][BLUE] = rata;
   8:    }

Sumber : http://pengolahancitra.com

Tidak ada komentar:

Posting Komentar