Warna-warni dunia kita

Warna merupakan salah satu fenomena menarik yang hampir semua orang mengalaminya. Sejak kita kecil kita diajari konsep warna sebagai sesuatu yang menarik indera okuler. Salah satu fenomena yang menarik tentang warna adalah pelangi yang diyakini menampilkan hampir seluruh warna yang bisa kita lihat. Ya, fenomena warna adalah fenomena persepsi. Ada keterlibatan antara sinyal yang dikirim (dimodelkan sebagai fenomena fisis) dengan sinyal yang diterima oleh indera.

Hal yang menjadi pertanyaan adalah ketika warna diolah dengan menggunakan komputer yaitu mengenai bagaimana kita memodelkan operator-operator yang bekerja pada informasi warna. Sebagai alat hitung, kita mendasarkan pengolahan dengan aritmetika dengan asumsi-asumsi. Salah satu model warna yang paling sering digunakan khususnya dalam menampilkan dan menyimpan informasi warna adalah RGB. Model ruang warna RGB didasarkan pada separasi sinyal warna-warna yang bersifat additif (digabung semakin terang). Model ruang warna RGB terdiri dari tiga komponen yaitu komponen warna merah (Red), hijau(Green), dan biru (Blue). Kalau mengingat kembali kuliah tentang vektor (aljabar linier), model ruang warna RGB bisa dimodelkan sebagai sebuah kubus euclidian atau dalam bahasa matematisnya direntang oleh tiga vektor basis ortonormal R, G, dan B. Asumsi tersebut mengarahkan intuisi kita ketika akan membandingkan dua buah warna yaitu menghitung jarak dengan fungsi metrik yang terdefinisi di ruang vektor tersebut. Beberapa contohnya adalah jarak euclidian (akar kuadrat dari jumlah kuadrat selisih tiap komponen) dan jarak manhattan (jumlah dari selisih mutlak) yang contoh penghitungannya ditampilkan dalam pseudocode berikut.

warna1,warna2: RGB;
dr,dg,db: real;

dr := warna2.r-warna1.r;
dg := warna2.g-warna1.g;
db := warna2.b-warna1.b;
//euclid
jarak := sqrt(dr*dr + dg*dg + db*db);
//manhattan
jarak := abs(dr)+abs(dg)+abs(db);

Kasus Seleksi berdasarkan warna

Beberapa waktu lalu sempat menemukan tugas kuliah gedung tetangga (EL 3008 Pengolahan Citra Digital) tentang Identifikasi dan Perhitungan Otomatis Bakteri Tahan Asam (BTA) dari spesimen dahak penderita Tuberkulosis (TB). contoh citra mikroskop untuk tugas tersebut adalah sebagai berikut.

Ringkasan deskripsi tugas tersebut adalah menghitung estimasi bakteri tahan asam yang pada gambar di atas ditampilkan dengan warna merah-ungu akibat pewarnaan. Salah satu langkah pengolahan yang diperlukan untuk menyelesaikan kasus di atas adalah bagaimana mendapatkan area citra yang mengandung bakteri tanpa terganggu dengan area lain yang tidak relevan dengan pertanyaan yang diajukan (misal area berwarna biru).

Kembali ke topik tentang warna RGB, penghitungan kemiripan warna menggunakan jarak euclid memiliki kelemahan yaitu tidak mengakomodasi perbedaan intensitas selain alasan distribusi warna yang tidak linier. Salah satu solusinya mungkin dengan mentransformasi citra tersebut ke model ruang warna lain seperti HSV, YCbCr, atau CIELab. solusi transformasi tersebut melibatkan operasi transformasi koordinat yang melibatkan perkalian. Apakah mungkin ada solusi yang lebih baik/cepat dari transformasi koordinat warna? mungkin saja!

Ketika saya mencoba menyelesaikan persoalan tersebut saya berhasil dengan cara yang cukup sederhana (tanpa melibatkan operasi perkalian) walaupun sampai saat ini saya belum mendapat penjelasan ataupun acuan ilmiah (masih membaca buku tentang ruang warna) mengenai solusi yang saya dapatkan tersebut. Idenya sederhana, kita mengubah representasi warna RGB menjadi representasi selisih antar komponen (R-G, R-B, dan G-B). Ternyata (hipotesis)warna yang sama, walau intensitas atau saturasinya berbeda memiliki komposisi atau selisih antar komponen yang sama. Jadi untuk melakukan seleksi warna kita dapat menggunakan rentang dari subset selisih antar komponen. untuk kasus di atas tentu tidak sesederhana itu, mengingat ada warna lain yang terlibat sebelumnya kasus yang memungkinkan terjadinya false-positive harus dikurangi terlebih dahulu (dengan cara yang sama!). Kode untuk kasus di atas terdiri dari dua baris kode berikut (untuk tiap piksel).

if ( p[i].g - p[i].r >= 30 ) then mark_falsepositive;
if not marked then
if ( p[i].r - p[i].g >= 31 ) or ( ( p[i].b - p[i].g >= 31 ) and ( p[i].r > 80 ) ) then mark_object
else mark_nothing;

Baris pertama, mencoba mengurangi false positive yang mungkin tertangkap di rule kedua. Rule kedua baru melakukan klasifikasi piksel berdasarkan selisih komponen seperti yang dijelaskan di atas. Hasilnya? silakan lihat sendiri

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s