+ All Categories
Home > Documents > Algoritma Transformasi Ruang Warna.pdf

Algoritma Transformasi Ruang Warna.pdf

Date post: 16-Jan-2017
Category:
Upload: hoanghuong
View: 245 times
Download: 12 times
Share this document with a friend
94
RGB HEXTriplet HSL, HSV HSI, HCL YUV, YDbDr YIQ, YCbCr Visual Basic 6, Visual Basic.NET, C#.NET, JAVA ALGORITMA TRANSFORMASI RUANG WARNA RGB, HexTriplet, HSL, HSV, HSI, HCL, YUV, YDbDr, YIQ, YCbCr DENGAN BAHASA PEMROGRAMAN VISUAL BASIC 6, VISUAL BASIC.NET, C#.NET, dan JAVA Ericks Rachmat Swedia Margi Cahyanti
Transcript
Page 1: Algoritma Transformasi Ruang Warna.pdf

i  

 

 

   

 

 RGB 

HEXTriplet 

HSL, HSV HSI, HCL 

 YUV, YDbDr YIQ, YCbCr 

Visual Basic 6, Visual Basic.NET, C#.NET, JAVA 

ALGORITMA TRANSFORMASI RUANG 

WARNA RGB, HexTriplet, HSL, HSV, HSI, HCL,    

YUV, YDbDr, YIQ, YCbCr 

DENGAN BAHASA PEMROGRAMAN 

VISUAL BASIC 6,  VISUAL BASIC.NET,  C#.NET,  dan  JAVA 

 

 

 

Ericks Rachmat Swedia 

Margi Cahyanti 

 

Page 2: Algoritma Transformasi Ruang Warna.pdf

 i  

KATA PENGANTAR Ruang warna adalah sebuah model matematis yang menjelaskan tentang bagaimana cara warna direpresentasikan dalam angka. Monitor komputer menggunakan ruang warna yang disebut dengan RGB (Red Green Blue), sehingga data-data citra yang tersimpan dalam komputer adalah angka-angka (disebut juga dengan pixel) yang merepresentasikan warna Red, Green dan Blue. Pemahaman tentang algoritma ruang warna sangat dibutuhkan untuk menganalisis citra, karena dengan menggunakan ruang-ruang warna inilah kita selanjutnya dapat mengklasifikasikan citra, mendeteksi objek dalam citra, mengkompresi ukuran citra dan lain sebagainya. Buku ini akan memandu anda langkah per langkah dengan cepat dan mudah dalam memahami algoritma-algoritma ruang warna, terutama dalam melakukan transformasi antar ruang warna, dan implementasinya kedalam bahasa pemrograman Visual Basic 6, Visual Basic.Net, C# dan Java. Semua function dan method yang ada dalam buku ini telah di-run dan di-compile. Untuk Visual Basic menggunakan compiler Visual Basic dengan Service Pack 6. Untuk Visual Basic.Net dan C#.Net dapat digunakan compiler di versi 2005, 2008 dan versi terbaru 2010. Untuk Java menggunakan Netbeans versi 6.7.1. Project lengkap serta semua source code dalam buku ini juga tersedia didalam CD. Buku ini dapat digunakan oleh para mahasiswa strata satu, strata dua bahkan strata tiga, dalam melakukan penelitian tugas akhir, juga para pengajar, peneliti dan praktisi, terutama yang bergelut dibidang pengolahan citra. Buku ini juga bisa dipakai sebagai bahan ajar dalam matakuliah-matakuliah yang membahas tentang citra. Semoga buku ini dapat memberikan informasi yang bermanfaat bagi semua pembaca.

Depok, Juli 2010

Ericks Rachmat Swedia Margi Cahyanti

Page 3: Algoritma Transformasi Ruang Warna.pdf

ii  

DAFTAR ISI KATA PENGANTAR ………………………………………………………………………..… i DAFTAR ISI …………………………………………………………………………………… ii I. RUANG WARNA PADA CITRA ………………………………………………………. 1 I.1 RGB ………………………………………………………………………………. 1 I.2 HSL ……………………………………………………………………………….. 3 I.3 HSV ………………………………………………………………………………. 3 I.4 HSI ………………………………………………………………………………… 4 I.5 HCL ..………………………………………………………………………………. 5 I.6 YUV ……………………………………………………………………………….. 5 I.7 YDbDr ……………………………………………………………………………. 6 I.8 YIQ ………………………………………………………………………………… 6 I.9 YCbCr …………………………………………………………………………….. 7 II. ALGORITMA TRANSFORMASI WARNA ……………………………………………… 8 II.1 KONVERSI HEX TRIPLET KE RGB ……………………………………….. 8 II.1.A IMPLEMENTASI DENGAN VISUAL BASIC 6 ……………….. 9 II.1.B IMPLEMENTASI DENGAN VISUAL BASIC.NET …………… 10 II.1.C IMPLEMENTASI DENGAN C# ………………………………… 11 II.1.D IMPLEMENTASI DENGAN JAVA …………………………….. 12 II.2 KONVERSI RGB KE HEX TRIPLET ………………………………………… 13 II.2.A IMPLEMENTASI DENGAN VISUAL BASIC 6 ………….…… 13 II.2.B IMPLEMENTASI DENGAN VISUAL BASIC.NET …….…….. 15 II.2.C IMPLEMENTASI DENGAN C# ………………………….…….. 16 II.2.D IMPLEMENTASI DENGAN JAVA ……………………….…….. 17 II.3 TRANSFORMASI RGB KE HSL ……………………………………………. 17 II.3.A IMPLEMENTASI DENGAN VISUAL BASIC 6 ………….….. 20 II.3.B IMPLEMENTASI DENGAN VISUAL BASIC.NET …….……. 21 II.3.C IMPLEMENTASI DENGAN C# …………………………….….. 22 II.3.D IMPLEMENTASI DENGAN JAVA ……………………….……. 23 II.4 TRANSFORMASI HSL KE RGB …………………………………………….. 24 II.4.A IMPLEMENTASI DENGAN VISUAL BASIC 6 ………….….. 25 II.4.B IMPLEMENTASI DENGAN VISUAL BASIC.NET …….……. 26 II.4.C IMPLEMENTASI DENGAN C# ………………………….…….. 27 II.4.D IMPLEMENTASI DENGAN JAVA …………………….………. 28

Page 4: Algoritma Transformasi Ruang Warna.pdf

iii  

II.5 TRANSFORMASI RGB KE HSV …………………………………….……… 30 II.5.A IMPLEMENTASI DENGAN VISUAL BASIC 6 ……….……… 31 II.5.B IMPLEMENTASI DENGAN VISUAL BASIC.NET ……….…. 32 II.5.C IMPLEMENTASI DENGAN C# …………………….………….. 33 II.5.D IMPLEMENTASI DENGAN JAVA …………………….……….. 34 II.6 TRANSFORMASI HSV KE RGB …………………………………….………. 35 II.6.A IMPLEMENTASI DENGAN VISUAL BASIC 6 …….………… 36 II.6.B IMPLEMENTASI DENGAN VISUAL BASIC.NET …….…….. 37 II.6.C IMPLEMENTASI DENGAN C# ……………….………………… 38 II.6.D IMPLEMENTASI DENGAN JAVA ………….………………….. 39 II.7 TRANSFORMASI RGB KE HSI …………………………………….……….. 40 II.7.A IMPLEMENTASI DENGAN VISUAL BASIC 6 .………………. 41 II.7.B IMPLEMENTASI DENGAN VISUAL BASIC.NET .…………….. 42 II.7.C IMPLEMENTASI DENGAN C# …………………….…………… 43 II.7.D IMPLEMENTASI DENGAN JAVA …………………….……….. 44 II.8 TRANSFORMASI HSI KE RGB …………………………………….………. 45 II.8.A IMPLEMENTASI DENGAN VISUAL BASIC 6 …………….… 46 II.8.B IMPLEMENTASI DENGAN VISUAL BASIC.NET …….……. 47 II.8.C IMPLEMENTASI DENGAN C# ……………………….………… 48 II.8.D IMPLEMENTASI DENGAN JAVA ……………….…………….. 49 II.9 TRANSFORMASI RGB KE HCL ……………………………………………… 50 II.9.A IMPLEMENTASI DENGAN VISUAL BASIC 6 ….…………… 52 II.9.B IMPLEMENTASI DENGAN VISUAL BASIC.NET ….………. 53 II.9.C IMPLEMENTASI DENGAN C# ……………………….………… 54 II.9.D IMPLEMENTASI DENGAN JAVA ……………………….…….. 55 II.10 TRANSFORMASI HCL KE RGB .…………………………………………….. 55 II.10.A IMPLEMENTASI DENGAN VISUAL BASIC 6 ……………… 58 II.10.B IMPLEMENTASI DENGAN VISUAL BASIC.NET …………… 59 II.10.C IMPLEMENTASI DENGAN C# …………………………………. 60 II.10.D IMPLEMENTASI DENGAN JAVA ……………………………… 61 II.11 TRANSFORMASI RGB KE YUV DAN YUV KE RGB …………………… 63 II.11.A IMPLEMENTASI DENGAN VISUAL BASIC 6 …..………….. 64 II.11.B IMPLEMENTASI DENGAN VISUAL BASIC.NET …………… 64 II.11.C IMPLEMENTASI DENGAN C# …………………………………. 65 II.11.D IMPLEMENTASI DENGAN JAVA ……………………………… 66 II.12 TRANSFORMASI RGB KE YDbDr DAN YDbDr KE RGB ………….. 67 II.12.A IMPLEMENTASI DENGAN VISUAL BASIC 6 ……………… 68 II.12.B IMPLEMENTASI DENGAN VISUAL BASIC.NET …………… 69 II.12.C IMPLEMENTASI DENGAN C# …………………………………. 70 II.12.D IMPLEMENTASI DENGAN JAVA ……………………………… 71

Page 5: Algoritma Transformasi Ruang Warna.pdf

iv  

II.13 TRANSFORMASI RGB KE YIQ DAN YIQ KE RGB …………..……….. 72 II.13.A IMPLEMENTASI DENGAN VISUAL BASIC 6 …….………… 72 II.13.B IMPLEMENTASI DENGAN VISUAL BASIC.NET …………… 73 II.13.C IMPLEMENTASI DENGAN C# …………………………………. 74 II.13.D IMPLEMENTASI DENGAN JAVA ……………………………… 75

II.14 TRANSFORMASI RGB KE YCbCr DAN YCbCr KE RGB …………..… 76

II.14.A IMPLEMENTASI DENGAN VISUAL BASIC 6 ……….……… 77 II.14.B IMPLEMENTASI DENGAN VISUAL BASIC.NET …………… 77 II.14.C IMPLEMENTASI DENGAN C# …………………………………. 78 II.14.D IMPLEMENTASI DENGAN JAVA ……………………………… 79 DAFTAR PUSTAKA ………………………………………………………………………… 81 LAMPIRAN A – MEMBACA RGB DARI CITRA ……………………………………….. 82 LAMPIRAN B – TAMPILAN PROJECT TRANSFORMASI RUANG WARNA ………. 85

Page 6: Algoritma Transformasi Ruang Warna.pdf

 1  

I. RUANG WARNA PADA CITRA Warna pada dasarnya merupakan hasil persepsi dari cahaya dalam spektrum wilayah yang terlihat oleh retina mata, dan memiliki panjang gelombang antara 400nm sampai dengan 700nm (Poynton , 1997). Ruang warna atau yang sering juga disebut sebagai model warna merupakan sebuah cara atau metode untuk mengatur, membuat dan memvisualisasikan warna (Ford and Roberts, 1998). Untuk aplikasi yang berbeda ruang warna yang dipakai bisa juga berbeda, hal ini dikarenakan beberapa peralatan tertentu memang membatasi secara ketat ukuran dan jenis ruang warna yang dapat digunakan. Ruang warna biasa digunakan untuk menganalisis citra. Beberapa ruang warna tersebut antara lain adalah sebagai berikut :

• RGB(Red Green Blue) • HSL (Hue Saturation Lightness), HSV (Hue Saturation Value), HSI (Hue

Saturation Intensity), dan HCL (Hue Chroma Lightness) • YUV, YDbDr, YIQ dan YCbCr (Luminance – Chrominance)

I.1 RGB (Red Green Blue) RGB sering digunakan didalam sebagian besar aplikasi komputer karena dengan ruang warna ini, tidak diperlukan transformasi untuk menampilkan informasi di layar monitor. Alasan diatas juga menyebabkan RGB banyak dimanfaatkan sebagai ruang warna dasar bagi sebagian besar aplikasi. Model warna RGB adalah model warna berdasarkan konsep penambahan kuat cahaya primer yaitu Red, Green dan Blue. Dalam suatu ruang yang sama sekali tidak ada cahaya, maka ruangan tersebut adalah gelap total. Tidak ada signal gelombang cahaya yang diserap oleh mata kita atau RGB (0,0,0). Apabila ditambahkan cahaya merah pada ruangan tersebut, maka ruangan akan berubah warna menjadi merah misalnya RGB (255,0,0), semua benda dalam ruangan tersebut hanya dapat terlihat berwarna merah. Demikian juga apabila cahaya diganti dengan hijau atau biru.

Warna RGB (Sumber http://en.wikipedia.org/wiki/RGB_color_model)

Page 7: Algoritma Transformasi Ruang Warna.pdf

2  

Apabila diberikan 2 macam cahaya primer dalam ruangan tersebut seperti (merah dan hijau), atau (merah dan biru) atau (hijau dan biru), maka ruangan akan berubah warna masing-masing menjadi kuning, atau magenta atau cyan. Warna-warna yang dibentuk oleh kombinasi dua macam cahaya tersebut disebut warna sekunder. Warna Tersier adalah warna yang hanya dapat terlihat apabila ada tiga cahaya primer, jadi apabila dinon-aktifkan salah satu cahaya, maka benda tersebut berubah warna. Contoh warna tersier seperti abu-abu,putih. Pada perhitungan dalam program-program komputer model warna direpresentasi dengan nilai komponennya, seperti dalam RGB (r, g, b) masing-masing nilai antara 0 hingga 255 sesuai dengan urusan masing-masing yaitu pertama Red, kedua Green dan ketigha adalah nilai Blue dengan demikian masing-masing komponen ada 256 tingkat. Apabila dikombinasikan maka ada 256 x 256 x 256 atau 16.777.216 kombinasi warna RGB yang dapat dibentuk.

• (0, 0, 0) : hitam • (255, 255, 255) :

putih • (255, 0, 0) : merah • (0, 255, 0) : hijau • (0, 0, 255) : biru • (255, 255, 0) :

kuning • (0, 255, 255) : cyan • (255, 0, 255) :

magenta

kuning (255,255,0)

hijau (0,255,0)

cyan (0,255,255)

merah (255,0,0)

biru (0,0,255)

merah

(255,0,0) magenta (255,0,255)

Konfigurasi Warna RGB (Sumber http://en.wikipedia.org/wiki/RGB_color_model)

Dalam mendesign web warna RGB kerapkali direpresentasikan dengan Hex Triplet atau kombinasi 2 pasang bilangan hexadecimal, seperti #FF5D25 artinya Red = FF atau 15*16 + 15 = 255, Green = 5D atau 5*16 + 13 = 93 dan Blue = 25 atau 2*16 + 5 = 37. Jadi RGB (255,93,37)

Page 8: Algoritma Transformasi Ruang Warna.pdf

3  

I.2 HSL Mode HSL merupakan mode yang ditemukan oleh Alvy Ray Smith pada tahun 1978. Mode ini merepresentasikan warna dalam tiga komponen: hue, saturation, dan lightness. Secara konseptual HSL berbentuk kerucut berganda atau lingkaran dengan pucuknya berwarna putih, sudut dasarnya berwarna hitam, dan warna-warni sangat pekat pada sekeliling sisi lingkar horizontal serta pada bagian tengah warna abu-abu sedang .

Ruang Warna HSL (Sumber : http://en.wikipedia.org/wiki/HSL_and_HSV) Pengertian Hue merupakan karakteristik warna berdasar cahaya yang dipantulkan oleh objek, dalam warna dilihat dari ukurannya mengikuti tingkatan 0 sampai 359. Sebagai contoh, pada tingkat 0 adalah warna Merah, 60 adalah warna Kuning, untuk warna Hijau pada tingkatan 120, sedangkan pada 180 adalah warna Cyan. Untuk tingkat 240 merupakan warna Biru, serta 300 adalah warna Magenta. Saturation/Chroma adalah tingkatan warna berdasarkan ketajamannya berfungsi untuk mendefinisikan warna suatu objek cenderung murni atau cenderung kotor (gray). Saturation mengikuti persentase yang berkisar dari 0% sampai 100% sebagai warna paling tajam. Lightness adalah tingkatan warna berdasarkan pencampuran dengan unsur warna Putih sebagai unsur warna yang memunculkan kesan warna terang atau gelap. Nilai koreksi warna pada Lightness berkisar antara 0 untuk warna paling gelap dan 100 untuk warna paling terang.

I.3 HSV Model warna HSV mendefinisikan warna dalam terminologi Hue, Saturation dan Value. Hue menyatakan warna sebenarnya, seperti merah, violet, dan kuning. Hue digunakan untuk membedakan warna-warna dan menentukan kemerahan (redness), kehijauan (greeness), dsb, dari cahaya. Hue berasosiasi dengan panjang gelombang cahaya. Saturation menyatakan tingkat kemurnian suatu warna, yaitu mengindikasikan seberapa banyak warna putih diberikan pada warna. Value adalah

Page 9: Algoritma Transformasi Ruang Warna.pdf

4  

atribut yang menyatakan banyaknya cahaya yang diterima oleh mata tanpa memperdulikan warna

Ruang Warna HSV (Sumber : http://en.wikipedia.org/wiki/HSL_and_HSV) I.4 HSI Model warna HSI mendefinisikan warna dalam terminologi Hue, Saturation dan Intensity. Hue menyatakan warna sebenarnya, seperti merah, violet, dan kuning. Hue digunakan untuk membedakan warna-warna dan menentukan kemerahan (redness), kehijauan (greeness), dsb, dari cahaya. Hue berasosiasi dengan panjang gelombang cahaya. Saturation menyatakan tingkat kemurnian suatu warna, yaitu mengindikasikan seberapa banyak warna putih diberikan pada warna. Intensity adalah atribut yang menyatakan banyaknya cahaya yang diterima oleh mata tanpa memperdulikan warna.

Ruang Warna HSI (Sumber : http://en.wikipedia.org/wiki/HSL_and_HSV)

Page 10: Algoritma Transformasi Ruang Warna.pdf

5  

I.5 HCL Ruang warna HCL(Hue, Chroma, Luminance) telah dikembangkan dengan mempertahankan kelebihan yang ada pada ruang warna HSL dan HSV serta menutupi kekurangan yang ada pada keduanya. Dengan demikian ruang warna ini menjadi lebih optimal untuk kebutuhan analisis informasi warna dalam citra. Madenda dan Missaoui dalam papernya [2005] telah membuktikan bahwa, ruang warna HCL memiliki keunggulan yang cukup signifikan dibandingkan dengan ruang warna lainnya. Kelebihan dari ruang warna ini diantaranya adalah componen H (warna) memiliki nilai yang konstan sekalipun terjadi perubahan intensitas cahaya maupun chroma pada objek.

(a) (b)

Gambar. 2. a) Model ruang warna HCL. b) Representasi variasi chroma C dan luminance L untuk 6 warna. [Madenda dan Missaoui, 2005]

I.5 YUV (PAL) YUV adalah ruang warna yang biasanya digunakan sebagai bagian dari kompresi image. YUV mengurangi komponen chrominance sehingga memperkecil bandwidth data image namun tidak terlalu berpengaruh dalam penglihatan manusia. Dalam YUV komponen krominansi (U dan V) dengan jelas terpisah dari komponen luminansinya (Y) sehingga memudahkan dalam mensegmentasi image. ruang warna ini biasanya digunakan dalam kebanyakan standar coding citra dan video.

Page 11: Algoritma Transformasi Ruang Warna.pdf

6  

Ruang Warna YUV (Sumber : http://en.wikipedia.org/wiki/YUV)

I.6 YDbDr YdbDr adalah alternatif lain dari YUV, ruang warna ini digunakan di Perancis dan beberapa negara timur lainnya. YdbDr terdiri dari komponen - Y, Db and Dr. Y adalah luminance, dan Db, Dr adalah chrominance (perbedaan antara warna merah dan biru).

I.7 YIQ YIQ adalah ruang warna yang digunakan oleh TV berwarna NTSC, digunakan sebagian besar di Amerika Utara dan Tengah dan Jepang. Komponen Y menunjukkan luma, dan komponen ini adalah satu-satunya komponen yang digunakan oleh penerima televisi hitam-putih. I berarti in-phase, Q berarti quadrature, mengacu kepada komponen quadrature amplitudo. Ruang warna YIQ dimaksudkan untuk mengambil kelebihan dari karakteristik response penglihatan manusia. Mata manusia lebih sensitif ke perubahan kuning-biru (I) daripada ke ungu-hijau (Q).

Ruang Warna YIQ(Sumber : http://en.wikipedia.org/wiki/YIQ)

Page 12: Algoritma Transformasi Ruang Warna.pdf

7  

I.8 YCbCr YCbCr merupakan standar internasional bagi pengkodean digital gambar televisi yang didefinisikan di CCIR Recommendation 601 (Ford dan Roberts, 1998). Y merupakan komponen luminance, Cb dan Cr adalah komponen chrominance. Pada monitor monokrom nilai luminance digunakan untuk merepresentasikan warna RGB, secara psikologis ia mewakili intensitas sebuah warna RGB yang diterima oleh mata. Chrominance merepresentasikan corak warna dan saturasi (saturation). Nilai komponen ini juga mengindikasikan banyaknya komponen warna biru dan merah pada warna (Cuturicu, 1999). Retina mata mempunyai dua macam sel yang berfungsi sebagai analis visual, yaitu : Sel yang digunakan untuk penglihatan di waktu malam dan sel yang dipakai untuk penglihatan di siang hari. Jenis yang pertama hanya menerima corak keabuan mulai dari warna putih terang sampai dengan hitam pekat. Dan jenis kedua menerima corak warna. Jika sebuah warna RGB diberikan, sel jenis yang pertama mendeteksi tingkat keabuan (gray level) yang serupa dengan nilai luminance-nya, sedangkan sel jenis kedua yang bertanggungjawab terhadap penerimaan corak warna, mendeteksi nilai yang sesuai dengan nilai chrominancenya (Cuturicu, 1999).

Page 13: Algoritma Transformasi Ruang Warna.pdf

8  

II. ALGORITMA TRANSFORMASI WARNA

II.1 KONVERSI HEX TRIPLET KE RGB Dalam mendesign web, warna RGB kerapkali direpresentasikan dengan Hex Triplet atau kombinasi 2 pasang bilangan hexadecimal. Hex Triplet pada dasarnya adalah bilangan Hexadesimal, untuk mengkonversi RGB ke Hex Triplet dibutuhkan konversi tabel bilangan Hexadesimal ke bilangan desimal seperti tabel dibawah.

HEXADESIMAL DESIMAL HEXADESIMAL DESIMAL 0 0 8 8 1 1 9 9 2 2 A 10 3 3 B 11 4 4 C 12 5 5 D 13 6 6 E 14 7 7 F 15

Jadi bila terdapat Hex Triplet #411BEA, bilangan ini dipecah menjadi 41 untuk Red dan 1B untuk Green dan EA untuk Blue, sehingga :

• Bilangan 41, untuk karakter yang pertama adalah 4 hexadesimal dan menurut tabel diatas 4 hexadesimal adalah 4 desimal, maka 4 x 16 =64, sedangkan untuk karakter yang kedua yaitu 1 dan menurut tabel diatas 1 hexadesimal adalah 1 desimal, maka 64 + 1 = 65, jadi konversi 41 ke RGB (Red) adalah 65.

• Bilangan 1B, untuk karakter yang pertama adalah 1 hexadesimal dan menurut tabel diatas 1 hexadesimal adalah 1 desimal, maka 1 x 16 =16, sedangkan untuk karakter yang kedua yaitu B dan menurut tabel diatas B hexadesimal adalah 11 desimal, maka 16 + 11 = 27 jadi konversi 1B ke RGB (Green) adalah 27.

• Bilangan EA, untuk karakter yang pertama adalah E hexadesimal dan menurut

tabel diatas E hexadesimal adalah 14 desimal, maka 14 x 16 = 224, sedangkan untuk karakter yang kedua yaitu A dan menurut tabel diatas A hexadesimal adalah 10 desimal, maka 224 + 10 = 234, jadi konversi EA ke RGB (Blue) adalah 234.

Jadi konversi dari Hex Triplet #411BEA ke RGB adalah 65, 27, 234.

Page 14: Algoritma Transformasi Ruang Warna.pdf

9  

Berdasarkan langkah-langkah konversi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut : II.1.A VISUAL BASIC 6 0 Private Function Konversi_HexTriplet_RGB(HEXTRIPLET As String) As String 1 Dim strData As String 2 Dim strRet As String 3 4 strData = Replace(HEXTRIPLET, "#", "") 5 strData = UCase$(strData) 6 If Len(strData) >= 6 Then 7 Dim strRed As String, strGreen As String, strBlue As String 8 9 strRed = CStr(Hex_Des(Mid$(strData, 1, 1)) * 16 + _ 10 Hex_Des(Mid$(strData, 2, 1))) 11 12 strGreen = CStr(Hex_Des(Mid$(strData, 3, 1)) * 16 + _ 13 Hex_Des(Mid$(strData, 4, 1))) 14 15 strBlue = CStr(Hex_Des(Mid$(strData, 5, 1)) * 16 + _ 16 Hex_Des(Mid$(strData, 6, 1))) 17 18 strRet = strRed + "," + strGreen + "," + strBlue 19 End If 20 21 Konversi_HexTriplet_RGB = strRet 22 End Function Untuk mengkonversi Hexadesimal ke desimal dibutuhkan function berikut : 0 Private Function Hex_Des(HEXA As String) As Integer 1 Dim iRet As Integer 2 Select Case HEXA 3 Case "A" 4 iRet = 10 5 Case "B" 6 iRet = 11 7 Case "C" 8 iRet = 12 9 Case "D" 10 iRet = 13 11 Case "E" 12 iRet = 14 13 Case "F" 14 iRet = 15 15 Case Else 16 If IsNumeric(HEXA) Then iRet = CInt(HEXA) 17 End Select 18 19 Hex_Des = iRet 20 End Function

Page 15: Algoritma Transformasi Ruang Warna.pdf

10  

II.1.B VISUAL BASIC.NET 0 Private Function Konversi_HexTriplet_RGB(ByVal HEXTRIPLET As String) As String 1 Dim strData As String 2 Dim strRet As String 3 4 strRet = "" 5 strData = HEXTRIPLET.Replace("#", "").ToUpper() 6 If strData.Length >= 6 Then 7 Dim strRed As String, strGreen As String, strBlue As String 8 9 strRed = CStr(Hex_Des(strData.Substring(0, 1)) * 16 + _ 10 Hex_Des(strData.Substring(1, 1))) 11 12 strGreen = CStr(Hex_Des(strData.Substring(2, 1)) * 16 + _ 13 Hex_Des(strData.Substring(3, 1))) 14 15 strBlue = CStr(Hex_Des(strData.Substring(4, 1)) * 16 + _ 16 Hex_Des(strData.Substring(5, 1))) 17 18 strRet = strRed + "," + strGreen + "," + strBlue 19 End If 20 21 Return strRet 22 End Function Untuk mengkonversi Hexadesimal ke desimal dibutuhkan function berikut : 0 Private Function Hex_Des(ByVal HEXA As String) As Integer 1 Dim iRet As Integer 2 3 iRet = 0 4 Select Case HEXA 5 Case "A" 6 iRet = 10 7 Case "B" 8 iRet = 11 9 Case "C" 10 iRet = 12 11 Case "D" 12 iRet = 13 13 Case "E" 14 iRet = 14 15 Case "F" 16 iRet = 15 17 Case Else 18 If IsNumeric(HEXA) Then iRet = CInt(HEXA) 19 End Select 20 21 Return iRet 22 End Function

Page 16: Algoritma Transformasi Ruang Warna.pdf

11  

II.1.C C# 0 private string Konversi_HexTriplet_RGB(string HEXTRIPLET) 1 { 2 string strData; 3 string strRet; 4 5 strData=HEXTRIPLET.Replace("#","").ToUpper(); 6 strRet = ""; 7 8 if (strData.Length >= 6) 9 { 10 string strRed, strGreen, strBlue; 11 12 strRed = Convert.ToString(Hex_Des(strData.Substring(0, 1)) * 16 + 13 Hex_Des(strData.Substring(1, 1))); 14 strGreen = Convert.ToString(Hex_Des(strData.Substring(2, 1)) * 16 + 15 Hex_Des(strData.Substring(3, 1))); 16 strBlue = Convert.ToString(Hex_Des(strData.Substring(4, 1)) * 16 + 17 Hex_Des(strData.Substring(5, 1))); 18 19 strRet = strRed + "," + strGreen + "," + strBlue; 20 } 21 return strRet; 22 } Method konversi dari Hexadesimal ke desimal dalam C# : 0 private int Hex_Des(string HEXA) 1 { 2 int iRet = 0; 3 4 if (HEXA == "A") 5 iRet = 10; 6 else if (HEXA == "B") 7 iRet = 11; 8 else if (HEXA == "C") 9 iRet = 12; 10 else if (HEXA == "D") 11 iRet = 13; 12 else if (HEXA == "E") 13 iRet = 14; 14 else if (HEXA == "F") 15 iRet = 15; 16 else 17 { 18 try { 19 iRet = Convert.ToInt32(HEXA); 20 } 21 catch (Exception) { } 22 } 23 24 return iRet; 25 }

Page 17: Algoritma Transformasi Ruang Warna.pdf

12  

II.1.D JAVA 0 private String Konversi_HexTriplet_RGB(String HEXTRIPLET) 1 { 2 String strData; 3 String strRet; 5 strData=HEXTRIPLET; 6 strRet = ""; 8 if (strData.length() >= 6) 9 { 10 int strRed, strGreen, strBlue; 11 12 strRed = Hex_Des(strData.substring(0, 1)) * 16 + 13 Hex_Des(strData.substring(1, 2)); 14 strGreen = Hex_Des(strData.substring(2, 3)) * 16 + 15 Hex_Des(strData.substring(3, 4)); 16 strBlue = Hex_Des(strData.substring(4, 5)) * 16 + 17 Hex_Des(strData.substring(5)); 18 19 strRet = String.valueOf(strRed) + "," + String.valueOf(strGreen) + 20 "," + String.valueOf(strBlue); 21 } 22 return strRet; 23 } Method konversi dari Hexadesimal ke desimal dalam Java : 0 private int Hex_Des(String HEXA) 1 { 2 int iRet = 0; 3 4 if (HEXA.equals("A")) 5 iRet = 10; 6 else if (HEXA.equals("B")) 7 iRet = 11; 8 else if (HEXA.equals("C")) 9 iRet = 12; 10 else if (HEXA.equals("D")) 11 iRet = 13; 12 else if (HEXA.equals("E")) 13 iRet = 14; 14 else if (HEXA.equals("F")) 15 iRet = 15; 16 else 17 { 18 try 19 { 20 iRet = Integer.parseInt(HEXA); 21 } 22 catch(Exception ex) {} 23 } 24 25 return iRet; 26 }

Page 18: Algoritma Transformasi Ruang Warna.pdf

13  

Function/Method Konversi_HexTriplet_RGB (dalam bahasa pemrograman VB, VB.NET, C# dan Java) diatas menerima parameter data HexTriplet berupa string, contoh parameter yang dikirimkan adalah 411BEA, dan function ini akan mengembalikan nilai RGB yang bertipe string dan dipisahkan dengan koma, contoh output adalah 65,27,234.

II.2 RGB KE HEX TRIPLET Untuk menkonversi RGB ke Hex Triplet, misal RGB(65, 27, 234) maka langkahnya adalah :

• 65 / 16 = 4.06, bilangan 4 dikonversikan menurut tabel konversi hexadesimal diatas adalah 4, dan sisa pembagiannya adalah 1 dikonversikan menurut tabel konversi hexadesimal adalah 1 maka Hex Triplet untuk RGB (Red) 65 adalah 41.

• 27 / 16 = 1.68, bilangan 1 dikonversikan menurut tabel konversi hexadesimal diatas adalah 1, dan sisa pembagiannya adalah 11 dikonversikan menurut tabel konversi hexadesimal adalah B maka Hex Triplet untuk RGB (Green) 27 adalah 1B.

• 234 / 16 = 14.625, bilangan 14 dikonversikan menurut tabel konversi hexadesimal diatas adalah E, dan sisa pembagiannya adalah 10 dikonversikan menurut tabel konversi hexadesimal adalah A maka Hex Triplet untuk RGB (Blue) 234 adalah EA.

Jadi konversi dari RGB(65, 27, 234) ke Hex Triplet adalah 411BEA. Berdasarkan langkah-langkah konversi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut : II.2.A VISUAL BASIC 6 0 Private Function Konversi_RGB_HexTriplet(RGB As String) As String 1 Dim strData() As String 2 Dim strRet As String 3 4 strRet = "" 5 strData = Split(RGB, ",") 6 If UBound(strData) >= 2 Then 7 Dim strRed As String, strGreen As String, strBlue As String 8 Dim iRed1 As Single 9 Dim iRed2 As Single 10 11 iRed1 = Fix(CSng(strData(0)) / 16) 12 iRed2 = Fix(CSng(strData(0)) Mod 16)

Page 19: Algoritma Transformasi Ruang Warna.pdf

14  

13 strRed = Des_Hex(CStr(iRed1)) + _ 14 Des_Hex(CStr(iRed2)) 15 Dim iGreen1 As Single 16 Dim iGreen2 As Single 17 18 iGreen1 = Fix(CSng(strData(1)) / 16) 19 iGreen2 = Fix(CSng(strData(1)) Mod 16) 20 strGreen = Des_Hex(CStr(iGreen1)) + _ 21 Des_Hex(CStr(iGreen2)) 22 23 Dim iBlue1 As Single 24 Dim iBlue2 As Single 25 26 iBlue1 = Fix(CSng(strData(2)) / 16) 27 iBlue2 = Fix(CSng(strData(2)) Mod 16) 28 strBlue = Des_Hex(CStr(iBlue1)) + _ 29 Des_Hex(CStr(iBlue2)) 30 31 strRet = strRed + strGreen + strBlue 32 End If 33 34 Konversi_RGB_HexTriplet = strRet 35 End Function Function konversi dari Hexadesimal ke desimal dalam VB : 0 Private Function Des_Hex(DESIMAL As Single) As String 1 Dim strRet As String 2 3 strRet = DESIMAL 4 Select Case DESIMAL 5 Case 10 6 strRet = "A" 7 Case 11 8 strRet = "B" 9 Case 12 10 strRet = "C" 11 Case 13 12 strRet = "D" 13 Case 14 14 strRet = "E" 15 Case 15 16 strRet = "F" 17 End Select 18 19 Des_Hex = strRet 20 End Function

Page 20: Algoritma Transformasi Ruang Warna.pdf

15  

II.2.B VISUAL BASIC.NET 0 Private Function Konversi_RGB_HexTriplet(ByVal RGB As String) As String 1 Dim strData() As String 2 Dim strRet As String 3 4 strRet = "" 5 strData = RGB.Split(",") 6 If strData.Length >= 3 Then 7 Dim strRed As String, strGreen As String, strBlue As String 8 9 Dim iRed1 As Single 10 Dim iRed2 As Single 11 12 iRed1 = Fix(CSng(strData(0)) / 16) 13 iRed2 = Fix(CSng(strData(0)) Mod 16) 14 strRed = Des_Hex(iRed1) + Des_Hex(iRed2) 15 16 Dim iGreen1 As Single 17 Dim iGreen2 As Single 18 19 iGreen1 = Fix(CSng(strData(1)) / 16) 20 iGreen2 = Fix(CSng(strData(1)) Mod 16) 21 strGreen = Des_Hex(iGreen1) + Des_Hex(iGreen2) 22 23 Dim iBlue1 As Single 24 Dim iBlue2 As Single 25 26 iBlue1 = Fix(CSng(strData(2)) / 16) 27 iBlue2 = Fix(CSng(strData(2)) Mod 16) 28 strBlue = Des_Hex(iBlue1) + Des_Hex(iBlue2) 29 30 strRet = strRed + strGreen + strBlue 31 End If 32 Return strRet 33 End Function Function konversi dari Hexadesimal ke desimal dalam VB.NET : 0 Private Function Des_Hex(ByVal DESIMAL As Single) As String 1 Dim strRet As String 2 3 strRet = DESIMAL 4 Select Case DESIMAL 5 Case 10 6 strRet = "A" 7 Case 11 8 strRet = "B" 9 Case 12 10 strRet = "C" 11 Case 13 12 strRet = "D" 13 Case 14 14 strRet = "E"

Page 21: Algoritma Transformasi Ruang Warna.pdf

16  

15 Case 15 16 strRet = "F" 17 End Select 18 Return strRet 19 End Function II.2.C C# 0 private string Konversi_RGB_HexTriplet(string RGB) 1 { 2 string[] strData; 3 string strRet; 4 5 strData = RGB.Split(','); 6 strRet = ""; 7 8 if (strData.Length >= 3) 9 { 10 string strRed, strGreen, strBlue; 11 double iRed1, iRed2; 12 iRed1 = Math.Truncate(Convert.ToDouble(strData[0]) / 16); 13 iRed2 = Math.Truncate(Convert.ToDouble(strData[0]) % 16); 14 strRed = Des_Hex(iRed1) + Des_Hex(iRed2); 15 16 double iGreen1, iGreen2; 17 iGreen1 = Math.Truncate(Convert.ToDouble(strData[1]) / 16); 18 iGreen2 = Math.Truncate(Convert.ToDouble(strData[1]) % 16); 19 strGreen = Des_Hex(iGreen1) + Des_Hex(iGreen2); 20 21 double iBlue1, iBlue2; 22 iBlue1 = Math.Truncate(Convert.ToDouble(strData[2]) / 16); 23 iBlue2 = Math.Truncate(Convert.ToDouble(strData[2]) % 16); 24 strBlue = Des_Hex(iBlue1) + Des_Hex(iBlue2); 25 26 strRet = strRed + strGreen + strBlue; 27 } 28 return strRet; 29 } Method konversi dari Hexadesimal ke desimal dalam C# : 0 private string Des_Hex(double DESIMAL) 1 { 2 string strRet = DESIMAL.ToString(); 3 4 if (DESIMAL == 10) 5 strRet = "A"; 6 else if (DESIMAL == 11) 7 strRet = "B"; 8 else if (DESIMAL == 12) 9 strRet = "C"; 10 else if (DESIMAL == 13)

Page 22: Algoritma Transformasi Ruang Warna.pdf

17  

11 strRet = "D"; 12 else if (DESIMAL == 14) 13 strRet = "E"; 14 else if (DESIMAL == 15) 15 strRet = "F"; 16 17 return strRet; 18 } II.2.D JAVA 0 private String Konversi_RGB_HexTriplet(String RGB) 1 { 2 String[] strData; 3 String strRet; 4 5 strData = RGB.split(","); 6 strRet = ""; 7 8 if (strData.length >= 2) 9 { 10 String strRed, strGreen, strBlue; 11 double iRed1, iRed2; 12 iRed1 = Double.parseDouble(strData[0]) / 16; 13 iRed2 = Double.parseDouble(strData[0]) % 16; 14 strRed = Des_Hex((int)iRed1) + Des_Hex((int)iRed2); 15 16 double iGreen1, iGreen2; 17 iGreen1 = Double.parseDouble(strData[1]) / 16; 18 iGreen2 = Double.parseDouble(strData[1]) % 16; 19 strGreen = Des_Hex((int)iGreen1) + Des_Hex((int)iGreen2); 20 21 double iBlue1, iBlue2; 22 iBlue1 = Double.parseDouble(strData[2]) / 16; 23 iBlue2 = Double.parseDouble(strData[2]) % 16; 24 strBlue = Des_Hex((int)iBlue1) + Des_Hex((int)iBlue2); 25 26 strRet = strRed + strGreen + strBlue; 27 } 28 return strRet; 29 } Method konversi dari Hexadesimal ke desimal dalam Java : 0 private String Des_Hex(int DESIMAL) 1 { 2 String strRet = Integer.toString(DESIMAL); 3 4 if (DESIMAL == 10) 5 strRet = "A"; 6 else if (DESIMAL == 11) 7 strRet = "B";

Page 23: Algoritma Transformasi Ruang Warna.pdf

18  

8 else if (DESIMAL == 12) 9 strRet = "C"; 10 else if (DESIMAL == 13) 11 strRet = "D"; 12 else if (DESIMAL == 14) 13 strRet = "E"; 14 else if (DESIMAL == 15) 15 strRet = "F"; 16 17 return strRet; 18 } RGB terdiri dari bilangan Red, Green dan Blue, untuk memasukkan bilangan RGB ke function/method Konversi_RGB_HexTriplet diatas, data dipisahkan oleh tanda koma (,), jadi contoh pengiriman parameter ke function/method Konversi_RGB_HexTriplet diatas adalah 65,27,234. Output dari function ini akan berupa data HexTriplet bertipe string, contoh : 411BEA.

II.3 TRANSFORMASI RGB KE HSL Untuk mentransformasi nilai dari RGB ke HSL diasumsikan koordinat-koordinat R, G, B [0,1] adalah berurutan merah, hijau, biru dalam ruang warna RGB. Nilai max adalah nilai maksimum dari nilai red, green, blue, dan min adalah nilai minimum dari nilai red, green, blue. Untuk memperoleh sudut hue[0,3600] yang tepat untuk ruang warna HSL menggunakan rumus seperti berikut (http://en.wikipedia.org/wiki/HSL_and_HSV) :

   

  0,   max

 60       max  

    6   ,    max  

60       max  

    2   ,    max  

60       max  

    4    , max

Untuk mendapatkan saturation dan lightness (kecerahan cahaya) yang tepat pada HSL, dengan koordinat s, l [0,1] menggunakan rumus seperti berikut :

    12   max  min   

Page 24: Algoritma Transformasi Ruang Warna.pdf

19  

         

0   ,   max   

max  2

 ,           0.5      

    max  2 2L

 ,         0.5 

Rumus di atas menghasilkan nilai lightness dan saturation dalam jangkauan [0,1]. Kalikan dengan 255 untuk memperoleh nilai dengan jangkauan [0,255]. Transformasi RGB ke HSL/HSI/HSV/HCL dan sebaliknya menghasilkan bilangan real, sementara media bitmap bekerja pada bilangan integer diskrit, karena itu perlu dilakukan pembulatan. Jumlah kemungkinan mode RGB ada 256x256x256 = 16.777.216 warna, sedangkan mode HSL/HSI/HSV/HCL ada 360x100x100 = 3.600.000 warna. Jadi akan ada warna-warna yang jika ditransformasikan hasilnya tidak akan sama akibat pembulatan. Misalnya ingin ditransformasikan RGB(65, 27, 234) ke dalam bentuk HSL, maka langkahnya adalah sebagai berikut : Setiap nilai RGB(65, 27, 234) diubah dalam jangkauan [0,1] dengan membagi setiap nilai dengan 255 : menjadi     ,   ,     = 0.255, 0.106, 0.918  RGB(0.255, 0.104, 0.918) ini yang akan ditransformasikan ke bentuk HSL. max = nilai B (blue) = 0.918, min = nilai G (green) = 0.106, max – min = 0.918 – 0.106 = 0.812. h (hue) = 60           

     4   , karena max = B (blue).

= 60        .     .

.    4  = 2510

l (lightness) =    max  min      =    0.918  0.106    = 0.512 s (saturation) =      

L , karena l (lightness) > 0.5

=    .

    . = 0.832

Page 25: Algoritma Transformasi Ruang Warna.pdf

20  

sehingga nilai RGB(65, 27, 234) ditransformasikan menjadi HSL(2510, 0.832, 0.512) dengan jangkauan RGB [0,1]. Berdasarkan langkah - langkah transformasi diatas, maka untuk meng-implementasikan ke bahasa pemrograman adalah sebagai berikut : II.3.A VISUAL BASIC 6 0 Private Function RGB_HSL(RGB As String) As String 1 Dim strData() As String 2 Dim strRet As String 3 Dim H As Double 4 Dim S As Double 5 Dim L As Double 6 7 strRet = "" 8 strData = Split(RGB, ",") 9 If UBound(strData) >= 2 Then 10 Dim R As Double, G As Double, B As Double 11 Dim max As Double, min As Double 12 13 R = CDbl(strData(0)) / 255 14 G = CDbl(strData(1)) / 255 15 B = CDbl(strData(2)) / 255 16 max = R 17 If max < G Then max = G 18 If max < B Then max = B 19 min = R 20 If min > G Then min = G 21 If min > B Then min = B 22 23 If max = min Then 24 H = 0 25 ElseIf max = R Then 26 H = 60 * (((G - B) / (max - min)) Mod 6) 27 ElseIf max = G Then 28 H = 60 * (((B - R) / (max - min)) + 2) 29 ElseIf max = B Then 30 H = 60 * (((R - G) / (max - min)) + 4) 31 End If 32 33 L = 0.5 * (max + min) 34 35 If max = min Then S = 0 36 If L <= 0.5 Then 37 S = (max - min) / (2 * L) 38 ElseIf L > 0.5 Then 39 S = (max - min) / (2 - (2 * L)) 40 End If 41 End If 42 RGB_HSL = Format$(H, "0.000") + "," + Format$(S, "0.000") + "," + Format$(L, "0.000") 43 End Function

Page 26: Algoritma Transformasi Ruang Warna.pdf

21  

II.3.B VISUAL BASIC.NET 0 Private Function RGB_HSL(ByVal RGB As String) As String 1 Dim strData() As String 2 Dim strRet As String 3 4 strRet = "" 5 strData = RGB.Split(",") 6 If strData.Length() >= 3 Then 7 Dim R As Double, G As Double, B As Double 8 Dim H As Double 9 Dim S As Double 10 Dim L As Double 11 Dim max As Double 12 Dim min As Double 13 14 R = CDbl(strData(0)) / 255 15 G = CDbl(strData(1)) / 255 16 B = CDbl(strData(2)) / 255 17 max = R 18 If max < G Then max = G 19 If max < B Then max = B 20 21 min = R 22 If min > G Then min = G 23 If min > B Then min = B 24 25 If max = min Then 26 H = 0 27 ElseIf max = R Then 28 H = 60 * (((G - B) / (max - min)) Mod 6) 29 ElseIf max = G Then 30 H = 60 * (((B - R) / (max - min)) + 2) 31 ElseIf max = B Then 32 H = 60 * (((R - G) / (max - min)) + 4) 33 End If 34 35 L = 0.5 * (max + min) 36 37 If max = min Then S = 0 38 39 If L <= 0.5 Then 40 S = (max - min) / (2 * L) 41 ElseIf L > 0.5 Then 42 S = (max - min) / (2 - (2 * L)) 43 End If 44 45 strRet = H.ToString("0.000") + "," + S.ToString("0.000") + "," + L.ToString("0.000") 46 End If 47 48 Return strRet 49 End Function

Page 27: Algoritma Transformasi Ruang Warna.pdf

22  

II.3.C C# 0 private string RGB_HSL(string RGB) 1 { 2 string[] strData; 3 string strRet = ""; 4 5 strData = RGB.Split(','); 6 if (strData.Length >= 3) 7 { 8 double R, G, B; 9 double H = 0; 10 double S = 0; 11 double L = 0; 12 double max; 13 double min; 14 15 R = double.Parse(strData[0]) / 255; 16 G = double.Parse(strData[1]) / 255; 17 B = double.Parse(strData[2]) / 255; 18 max = R; 19 if (max < G) max = G; 20 if (max < B) max = B; 21 22 min = R; 23 if (min > G) min = G; 24 if (min > B) min = B; 25 26 if (max == min) 27 H = 0; 28 else if (max == R) 29 H = 60 * (((G - B) / (max - min)) % 6); 30 else if (max == G) 31 H = 60 * (((B - R) / (max - min)) + 2); 32 else if (max == B) 33 H = 60 * (((R - G) / (max - min)) + 4); 34 35 L = 0.5 * (max + min); 36 37 if (max == min) S = 0; 38 39 if (L <= 0.5) 40 S = (max - min) / (2 * L); 41 else if (L > 0.5) 42 S = (max - min) / (2 - (2 * L)); 43 44 strRet = H.ToString("0.000") + "," + S.ToString("0.000") + "," + L.ToString("0.000"); 45 } 46 47 return strRet; 48 }

Page 28: Algoritma Transformasi Ruang Warna.pdf

23  

II.3.D JAVA 0 private String RGB_HSL(String RGB) 1 { 2 String[] strData; 3 String strRet = ""; 4 5 strData = RGB.split(","); 6 if (strData.length >= 2) 7 { 8 double R, G, B, , max, min, H = 0, S = 0, double L = 0; 9 10 R = Double.parseDouble(strData[0]) / 255; 11 G = Double.parseDouble(strData[1]) / 255; 12 B = Double.parseDouble(strData[2]) / 255; 13 max = R; 14 if (max < G) max = G; 15 if (max < B) max = B; 16 17 min = R; 18 if (min > G) min = G; 19 if (min > B) min = B; 20 21 if (max == min) 22 H = 0; 23 else if (max == R) 24 H = 60 * (((G - B) / (max - min)) % 6); 25 else if (max == G) 26 H = 60 * (((B - R) / (max - min)) + 2); 27 else if (max == B) 28 H = 60 * (((R - G) / (max - min)) + 4); 29 30 L = 0.5 * (max + min); 31 32 if (max == min) S = 0; 33 34 if (L <= 0.5) 35 S = (max - min) / (2 * L); 36 else if (L > 0.5) 37 S = (max - min) / (2 - (2 * L)); 38 39 java.text.DecimalFormat df = new java.text.DecimalFormat ("0.###"); 40 strRet = df.format(H) + "," + df.format(S) + "," + df.format(L); 41 } 42 43 return strRet; 44 } RGB terdiri dari bilangan Red, Green dan Blue, untuk memasukkan bilangan RGB ke function/method RGB_HSL diatas, data dipisahkan oleh tanda koma (,), jadi contoh pengiriman parameter ke function/method RGB_HSL diatas adalah 65,27,234. Output dari function/method ini akan berupa data HSL bertipe string, contoh : 289.5, 0.833, 0.512.

Page 29: Algoritma Transformasi Ruang Warna.pdf

24  

II.4 TRANSFORMASI HSL KE RGB Untuk transformasi kembali dari HSL ke RGB, gunakan rumus berikut. Dengan hue H [0°, 360°), saturation S [0, 1], dan lightness L [0, 1] : (http://en.wikipedia.org/wiki/HSL_and_HSV)

 2      ,         

  2 2    ,         

′  

60

  1 | ′  2 1|

1, 1, 1  

     0, 0, 0  ,      , , 0  ,                        0  ′ 1, , 0  ,                        1  ′ 2

0, ,  ,                        2  ′ 30, ,  ,                        3  ′ 4, 0,  ,                        4  ′ 5, 0, 0  ,                         5  ′ 6

 

, , 1 , 1 , 1

Rumus di atas menghasilkan nilai RGB dalam jangkauan [0,1]. Untuk jangkauan [0,255], kalikan dengan 255. Transformasikan HSL(2510, 0.832, 0.512) ke dalam bentuk RGB, maka langkahnya adalah sebagai berikut : L = 0.512 lebih besar dari 0.5, maka C = (2 – 2L) x S = (2 – (2 x 0.512)) x 0.832 = 0.812 H’ = H / 600 = 251 / 60 = 4.183 X = C ( 1 – |H’ mod 2 – 1|) = 0.812 (1 - |(4.183 mod 2) - 1|) = 0.812 (1 - 0.187) = 0.812 (0.183) = 0.149

Page 30: Algoritma Transformasi Ruang Warna.pdf

25  

(R1, G1, B1) = (X, 0, C), karena H’ = 4.183 ≥ 4 dan H’ < 5 = (0.149, 0, 0.812) m = L - 0.5(C) = 0.512 - 0.5(0.812) = 0.512 - 0.406 = 0.106 (R, G, B) = (R1 + m, G1 + m, B1 + m) = (0.149 + 0.106, 0 + 0.106, 0.812 + 0.106) = (0.255, 0.106, 0.918) RGB (0.255, 0.106, 0.918) ini dalam jangkauan [0,1] untuk jangkauan [0,255] kalikan dengan 255 : (0.255 x 255, 0.106 x 255, 0.918 x 255) menjadi (65.025, 27,03, 234.09) bulatkan keatas menjadi (65, 27, 234). Berdasarkan langkah-langkah transformasi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut : II.4.A VISUAL BASIC 6 0 Private Function HSL_RGB(HSL As String) As String 1 Dim strData() As String 2 Dim strRet As String 3 Dim R As Double, G As Double, B As Double 4 5 strRet = "" 6 strData = Split(HSL, ",") 7 If UBound(strData) >= 2 Then 8 Dim R1 As Double, G1 As Double, B1 As Double 9 Dim H As Double, S As Double, L As Double 10 Dim H1 As Double 11 Dim X As Double 12 Dim C As Double 13 Dim m As Double 14 15 H = CDbl(strData(0)) 16 S = CDbl(strData(1)) 17 L = CDbl(strData(2)) 18 19 If L <= 0.5 Then 20 C = 2 * L * S 21 ElseIf L > 0.5 Then 22 C = (2 - 2 * L) * S 23 End If 24 25 H1 = H / 60 26 27 X = H1 Mod 2 : X = Abs(X - 1) : X = C * (1 - X) 28 29 If H1 >= 0 And H1 < 1 Then 30 R1 = C: G1 = X: B1 = 0 31 ElseIf H1 >= 1 And H1 < 2 Then

Page 31: Algoritma Transformasi Ruang Warna.pdf

26  

32 R1 = X: G1 = C: B1 = 0 33 ElseIf H1 >= 2 And H1 < 3 Then 34 R1 = 0: G1 = C: B1 = X 35 ElseIf H1 >= 3 And H1 < 4 Then 36 R1 = 0: G1 = X: B1 = C 37 ElseIf H1 >= 4 And H1 < 5 Then 38 R1 = X: G1 = 0: B1 = C 39 ElseIf H1 >= 5 And H1 < 6 Then 40 R1 = C: G1 = 0: B1 = 0 41 Else 42 R1 = 0: G1 = 0: B1 = 0 43 End If 44 45 m = L - (0.5 * C) 46 47 R = Round((R1 + m) * 255) 48 G = Round((G1 + m) * 255) 49 B = Round((B1 + m) * 255) 50 End If 51 52 HSL_RGB = Format$(R, "###") + "," + Format$(G, "###") + "," + Format$(B, "###") 53 End Function II.4.B VISUAL BASIC.NET 0 Private Function HSL_RGB(ByVal HSL As String) As String 1 Dim strData() As String 2 Dim strRet As String 3 4 strRet = "" 5 strData = HSL.Split(",") 6 If strData.Length() >= 3 Then 7 Dim R As Double, G As Double, B As Double 8 Dim R1 As Double, G1 As Double, B1 As Double 9 Dim H As Double, S As Double, L As Double 10 Dim H1 As Double 11 Dim X As Double 12 Dim C As Double 13 Dim m As Double 14 15 H = CDbl(strData(0)) 16 S = CDbl(strData(1)) 17 L = CDbl(strData(2)) 18 19 If L <= 0.5 Then 20 C = 2 * L * S 21 ElseIf L > 0.5 Then 22 C = (2 - 2 * L) * S 23 End If 24 25 H1 = H / 60 26 27 X = Math.Abs((H1 Mod 2) - 1)

Page 32: Algoritma Transformasi Ruang Warna.pdf

27  

28 X = C * (1 - X) 29 If H1 >= 0 And H1 < 1 Then 30 R1 = C : G1 = X : B1 = 0 31 ElseIf H1 >= 1 And H1 < 2 Then 32 R1 = X : G1 = C : B1 = 0 33 ElseIf H1 >= 2 And H1 < 3 Then 34 R1 = 0 : G1 = C : B1 = X 35 ElseIf H1 >= 3 And H1 < 4 Then 36 R1 = 0 : G1 = X : B1 = C 37 ElseIf H1 >= 4 And H1 < 5 Then 38 R1 = X : G1 = 0 : B1 = C 39 ElseIf H1 >= 5 And H1 < 6 Then 40 R1 = C : G1 = 0 : B1 = 0 41 Else 42 R1 = 0 : G1 = 0 : B1 = 0 43 End If 44 45 m = L - (0.5 * C) 46 47 R = Math.Round((R1 + m) * 255) 48 G = Math.Round((G1 + m) * 255) 49 B = Math.Round((B1 + m) * 255) 50 51 strRet = R.ToString("###") + "," + G.ToString("###") + "," + B.ToString("###") 52 End If 53 54 Return strRet 55 End Function II.4.C C# 0 private string HSL_RGB(string HSL) 1 { 2 string[] strData; 3 string strRet = ""; 4 5 strData = HSL.Split(','); 6 if (strData.Length >= 3) 7 { 8 double R, G, B; 9 double R1, G1, B1; 10 double H, S, L; 11 double H1, X, C = 0, m; 12 13 H = double.Parse(strData[0]); 14 S = double.Parse(strData[1]); 15 L = double.Parse(strData[2]); 16 17 if (L <= 0.5) 18 C = 2 * L * S; 19 else if (L > 0.5) 20 C = (2 - 2 * L) * S;

Page 33: Algoritma Transformasi Ruang Warna.pdf

28  

21 H1 = H / 60; 22 X = Math.Abs((H1 % 2) - 1); 23 X = C * (1 - X); 24 25 if (H1 >= 0 && H1 < 1) 26 { 27 R1 = C; G1 = X; B1 = 0; } 28 else if (H1 >= 1 && H1 < 2) 29 { 30 R1 = X; G1 = C; B1 = 0; } 31 else if (H1 >= 2 && H1 < 3) 32 { 33 R1 = 0; G1 = C; B1 = X; } 34 else if (H1 >= 3 && H1 < 4) 35 { 36 R1 = 0; G1 = X; B1 = C; } 37 else if (H1 >= 4 && H1 < 5) 38 { 39 R1 = X; G1 = 0; B1 = C; } 40 else if (H1 >= 5 && H1 < 6) 41 { 42 R1 = C; G1 = 0; B1 = 0; } 43 else 44 { 45 R1 = 0; G1 = 0; B1 = 0; } 46 47 m = L - (0.5 * C); 48 49 R = Math.Round((R1 + m) * 255); 50 G = Math.Round((G1 + m) * 255); 51 B = Math.Round((B1 + m) * 255); 52 53 strRet = R.ToString("###") + "," + G.ToString("###") + "," + B.ToString("###"); 54 } 55 56 return strRet; 57 } II.4.D JAVA 0 private String HSL_RGB(String HSL) 1 { 2 String[] strData; 3 String strRet; 4 5 strRet = ""; 6 strData = HSL.split(","); 7 8 if (strData.length >= 2) 9 { 10 double R, G, B; 11 double R1, G1, B1; 12 double H, S, L;

Page 34: Algoritma Transformasi Ruang Warna.pdf

29  

13 double H1, X, C = 0, m; 14 15 H = Double.parseDouble(strData[0]); 16 S = Double.parseDouble(strData[1]); 17 L = Double.parseDouble(strData[2]); 18 19 if (L <= 0.5) 20 C = 2 * L * S; 21 else if (L > 0.5) 22 C = (2 - 2 * L) * S; 23 24 H1 = H / 60; 25 X = Math.abs((H1 % 2) - 1); 26 X = C * (1 - X); 27 28 if (H1 >= 0 && H1 < 1) 29 { 30 R1 = C; G1 = X; B1 = 0; } 31 else if (H1 >= 1 && H1 < 2) 32 { 33 R1 = X; G1 = C; B1 = 0; } 34 else if (H1 >= 2 && H1 < 3) 35 { 36 R1 = 0; G1 = C; B1 = X; } 37 else if (H1 >= 3 && H1 < 4) 38 { 39 R1 = 0; G1 = X; B1 = C; } 40 else if (H1 >= 4 && H1 < 5) 41 { 42 R1 = X; G1 = 0; B1 = C; } 43 else if (H1 >= 5 && H1 < 6) 44 { 45 R1 = C; G1 = 0; B1 = 0; } 46 else 47 { 48 R1 = 0; G1 = 0; B1 = 0; } 49 50 m = L - (0.5 * C); 51 52 R = Math.round((R1 + m) * 255); 53 G = Math.round((G1 + m) * 255); 54 B = Math.round((B1 + m) * 255); 55 56 java.text.DecimalFormat df = new java.text.DecimalFormat ("###"); 57 strRet = df.format(R) + "," + df.format(G) + "," + df.format(B); 58 } 59 return strRet; 60 } HSL terdiri dari bilangan Hue, Saturation dan Lightness, untuk memasukkan bilangan HSL ke function/method HSL_RGB diatas, data dipisahkan oleh tanda koma (,), jadi contoh pengiriman parameter ke function/method HSL_RGB diatas adalah 251, 0.832, 0.512. Output dari function ini akan berupa data RGB bertipe string, contoh : 65,27,234.

Page 35: Algoritma Transformasi Ruang Warna.pdf

30  

II.5 TRANSFORMASI RGB KE HSV Untuk mentransformasi dari RGB ke HSV. Diasumsikan koordinat-koordinat R, G, B [0,1] adalah berurutan merah, hijau, biru dalam ruang warna RGB, dengan max adalah nilai maksimum dari nilai red, green, blue, dan min adalah nilai minimum dari nilai red, green, blue. Untuk memperoleh sudut hue[0,360] yang tepat untuk ruang warna HSV, menggunakan rumus seperti berikut (http://en.wikipedia.org/wiki/HSL_and_HSV) :

   

  0,   max

 60       max  

    6   ,    max  

60       max  

    2   ,    max  

    60       max  

    4    , max

Nilai-nilai untuk s dan v pada HSV didefinisikan sebagai berikut :

    

0  ,     

   max  

 ,   

 

Rumus di atas menghasilkan nilai value dan saturation dalam jangkauan RGB [0,1]. Kalikan dahulu dengan 255 untuk memperoleh nilai dengan jangkauan RGB [0,255]. Misalnya ingin ditransformasikan RGB(65, 27, 234) ke dalam bentuk HSV, maka langkahnya adalah sebagai berikut : Setiap nilai RGB(65, 27, 234) diubah dalam jangkauan [0,1] dengan membagi setiap nilai dengan 255 : menjadi     ,   ,     = 0.255, 0.106, 0.918  RGB(0.255, 0.106, 0.918) ini yang akan ditransformasikan ke bentuk HSV.

Page 36: Algoritma Transformasi Ruang Warna.pdf

31  

max = nilai B (blue) = 0.918, min = nilai G (green) = 0.106, max – min = 0.918 – 0.106 = 0.812. h (Hue) = 60           

     4   , karena max = B (blue).

= 60        .     .

.    4  = 2510

v (value) = max = 0.918 s (saturation) =       , karena max <> min =    .

. = 0.885

sehingga nilai RGB(65, 27, 234) ditransformasikan menjadi HSV(2510, 0.885, 0.918) dengan jangkauan RGB [0,1]. Berdasarkan langkah-langkah transformasi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut : II.5.A VISUAL BASIC 6 0 Private Function RGB_HSV(RGB As String) As String 1 Dim strData() As String 2 Dim H As Double, S As Double, V As Double 3 4 strData = Split(RGB, ",") 5 If UBound(strData) >= 2 Then 6 Dim R As Double, G As Double, B As Double 7 Dim max As Double 8 Dim min As Double 9 10 R = CDbl(strData(0)) / 255 11 G = CDbl(strData(1)) / 255 12 B = CDbl(strData(2)) / 255 13 max = R 14 If max < G Then max = G 15 If max < B Then max = B 16 min = R 17 If min > G Then min = G 18 If min > B Then min = B 19 20 If max = min Then 21 H = 0 22 ElseIf max = R Then 23 H = 60 * (((G - B) / (max - min)) Mod 6) 24 ElseIf max = G Then

Page 37: Algoritma Transformasi Ruang Warna.pdf

32  

25 H = 60 * (((B - R) / (max - min)) + 2) 26 ElseIf max = B Then 27 H = 60 * (((R - G) / (max - min)) + 4) 28 End If 29 30 V = max 31 If max = min Then 32 S = 0 33 Else 34 S = (max - min) / V 35 End If 36 End If 37 38 RGB_HSV = Format$(H, "0.000") + "," + Format$(S, "0.000") + "," + Format$(V, "0.000") 39 End Function II.5.B VISUAL BASIC.NET 0 Private Function RGB_HSV(ByVal RGB As String) As String 1 Dim strData() As String 2 Dim H As Double, S As Double, V As Double 3 4 strData = RGB.Split(",") 5 If strData.Length >= 3 Then 6 Dim R As Double, G As Double, B As Double 7 Dim max As Double 8 Dim min As Double 9 10 R = CDbl(strData(0)) / 255 11 G = CDbl(strData(1)) / 255 12 B = CDbl(strData(2)) / 255 13 max = R 14 If max < G Then max = G 15 If max < B Then max = B 16 17 min = R 18 If min > G Then min = G 19 If min > B Then min = B 20 21 If max = min Then 22 H = 0 23 ElseIf max = R Then 24 H = 60 * (((G - B) / (max - min)) Mod 6) 25 ElseIf max = G Then 26 H = 60 * (((B - R) / (max - min)) + 2) 27 ElseIf max = B Then 28 H = 60 * (((R - G) / (max - min)) + 4) 29 End If 30 31 V = max 32 33 If max = min Then 34 S = 0

Page 38: Algoritma Transformasi Ruang Warna.pdf

33  

35 Else 36 S = (max - min) / V 37 End If 38 End If 39 40 RGB_HSV = H.ToString("0.000") + "," + S.ToString("0.000") + "," + V.ToString("0.000") 41 End Function II.5.C C# 0 private string RGB_HSV(string RGB) 1 { 2 string[] strData; 3 double H = 0, S = 0, V = 0; 4 5 strData = RGB.Split(','); 6 if (strData.Length >= 3) 7 { 8 double R, G, B; 9 double min, max; 10 11 R = double.Parse(strData[0]) / 255; 12 G = double.Parse(strData[1]) / 255; 13 B = double.Parse(strData[2]) / 255; 14 max = R; 15 if (max < G) max = G; 16 if (max < B) max = B; 17 18 min = R; 19 if (min > G) min = G; 20 if (min > B) min = B; 21 22 if (max == min) 23 H = 0; 24 else if (max == R) 25 H = 60 * (((G - B) / (max - min)) % 6); 26 else if (max == G) 27 H = 60 * (((B - R) / (max - min)) + 2); 28 else if (max == B) 29 H = 60 * (((R - G) / (max - min)) + 4); 30 31 V = max; 32 33 if (max == min) 34 S = 0; 35 else 36 S = (max - min) / V; 37 } 38 39 return H.ToString("0.000") + "," + S.ToString("0.000") + "," + V.ToString("0.000"); 40 }

Page 39: Algoritma Transformasi Ruang Warna.pdf

34  

II.5.D JAVA 0 private String RGB_HSV(String RGB) 1 { 2 String[] strData; 3 String strRet = ""; 4 double H = 0, S = 0, V = 0; 5 6 strData = RGB.split(","); 7 if (strData.length >= 2) 8 { 9 double R, G, B; 10 double min, max; 11 12 R = Double.parseDouble(strData[0]) / 255; 13 G = Double.parseDouble(strData[1]) / 255; 14 B = Double.parseDouble(strData[2]) / 255; 15 max = R; 16 if (max < G) max = G; 17 if (max < B) max = B; 18 19 min = R; 20 if (min > G) min = G; 21 if (min > B) min = B; 22 23 if (max == min) 24 H = 0; 25 else if (max == R) 26 H = 60 * (((G - B) / (max - min)) % 6); 27 else if (max == G) 28 H = 60 * (((B - R) / (max - min)) + 2); 29 else if (max == B) 30 H = 60 * (((R - G) / (max - min)) + 4); 31 32 V = max; 33 34 if (max == min) 35 S = 0; 36 else 37 S = (max - min) / V; 38 39 java.text.DecimalFormat df = new java.text.DecimalFormat ("0.000"); 40 strRet = df.format(H) + "," + df.format(S) + "," + df.format(V); 41 } 42 43 return strRet; 44 } RGB terdiri dari bilangan Red, Green dan Blue, untuk memasukkan bilangan RGB ke function/method RGB_HSV diatas, data dipisahkan oleh tanda koma (,), jadi contoh pengiriman parameter ke function/method RGB_HSV diatas adalah 65,27,234. Output dari function ini akan berupa data HSV bertipe string, contoh : 251, 0.885, 0.918.

Page 40: Algoritma Transformasi Ruang Warna.pdf

35  

II.6 TRANSFORMASI HSV KE RGB Untuk transformasi kembali dari HSV ke RGB, gunakan rumus berikut. Dengan hue H [0°, 360°), saturation S [0, 1], dan value V [0, 1] (http://en.wikipedia.org/wiki/HSL_and_HSV) :

   

′60

  1 | ′  2 1|

1, 1, 1  

     0, 0, 0  ,      , , 0  ,                        0  ′ 1, , 0  ,                        1  ′ 2

0, ,  ,                        2  ′ 30, ,  ,                        3  ′ 4, 0,  ,                        4  ′ 5, 0, 0  ,                         5  ′ 6

 

, , 1 , 1 , 1

Rumus di atas menghasilkan nilai RGB dalam jangkauan [0,1]. Untuk jangkauan [0,255], kalikan dahulu dengan 255. Transformasikan HSV(251, 0.885, 0.918) ke dalam bentuk RGB, maka langkahnya adalah sebagai berikut : C = V x S = 0.918 x 0.885 = 0.812 H’ = H / 60 = 251 / 60 = 4.183 X = C ( 1 – |H’ mod 2 – 1|) = 0.815 (1 - |(4.183 mod 2) - 1|) = 0.815 (1 - | 0.183 – 1|) = 0.149 (R1, G1, B1) = (X, 0, C), karena H’ ≥ 4 dan H’ < 5 = (0.149, 0, 0.812) m = V - C = 0.918 - 0.812 = 0.106 (R, G, B) = (R1 + m, G1 + m, B1 + m) = (0.149 + 0.106, 0 + 0.106, 0.812 + 0.106) = (0.255, 0.106, 0.918)

Page 41: Algoritma Transformasi Ruang Warna.pdf

36  

RGB (0.255, 0.106, 0.918) ini dalam jangkauan [0,1] untuk jangkauan [0,255] kalikan dengan 255 : (0.255 x 255, 0.106 x 255, 0.918 x 255) menjadi (65.025, 27,03, 234.09) bulatkan keatas menjadi (65, 27, 234). Berdasarkan langkah-langkah transformasi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut : II.6.A VISUAL BASIC 6 0 Private Function HSV_RGB(HSV As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = Split(HSV, ",") 5 If UBound(strData) >= 2 Then 6 Dim R1 As Double, G1 As Double, B1 As Double 7 Dim H As Double, S As Double, V As Double 8 Dim H1 As Double, X As Double, C As Double, m As Double 9 10 H = CDbl(strData(0)) 11 S = CDbl(strData(1)) 12 V = CDbl(strData(2)) 13 14 C = V * S 15 H1 = H / 60 16 17 X = H1 Mod 2 18 X = Abs(X - 1) 19 X = C * (1 - X) 20 21 If H1 >= 0 And H1 < 1 Then 22 R1 = C: G1 = X: B1 = 0 23 ElseIf H1 >= 1 And H1 < 2 Then 24 R1 = X: G1 = C: B1 = 0 25 ElseIf H1 >= 2 And H1 < 3 Then 26 R1 = 0: G1 = C: B1 = X 27 ElseIf H1 >= 3 And H1 < 4 Then 28 R1 = 0: G1 = X: B1 = C 29 ElseIf H1 >= 4 And H1 < 5 Then 30 R1 = X: G1 = 0: B1 = C 31 ElseIf H1 >= 5 And H1 < 6 Then 32 R1 = C: G1 = 0: B1 = 0 33 Else 34 R1 = 0: G1 = 0: B1 = 0 35 End If 36 37 m = V - C 38 39 R = Round((R1 + m) * 255) 40 G = Round((G1 + m) * 255) 41 B = Round((B1 + m) * 255) 42 End If

Page 42: Algoritma Transformasi Ruang Warna.pdf

37  

43 44 HSV_RGB = Format$(R, "###") + "," + Format$(G, "###") + "," + Format$(B, "###") 45 End Function II.6.B VISUAL BASIC.NET 0 Private Function HSV_RGB(ByVal HSV As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = HSV.Split(",") 5 If strData.Length >= 3 Then 6 Dim R1 As Double, G1 As Double, B1 As Double 7 Dim H As Double, S As Double, V As Double 8 Dim H1 As Double, X As Double, C As Double, m As Double 9 10 H = CDbl(strData(0)) 11 S = CDbl(strData(1)) 12 V = CDbl(strData(2)) 13 14 C = V * S 15 H1 = H / 60 16 X = Math.Abs((H1 Mod 2) - 1) 17 X = C * (1 - X) 18 19 If H1 >= 0 And H1 < 1 Then 20 R1 = C : G1 = X : B1 = 0 21 ElseIf H1 >= 1 And H1 < 2 Then 22 R1 = X : G1 = C : B1 = 0 23 ElseIf H1 >= 2 And H1 < 3 Then 24 R1 = 0 : G1 = C : B1 = X 25 ElseIf H1 >= 3 And H1 < 4 Then 26 R1 = 0 : G1 = X : B1 = C 27 ElseIf H1 >= 4 And H1 < 5 Then 28 R1 = X : G1 = 0 : B1 = C 29 ElseIf H1 >= 5 And H1 < 6 Then 30 R1 = C : G1 = 0 : B1 = 0 31 Else 32 R1 = 0 : G1 = 0 : B1 = 0 33 End If 34 35 m = V - C 36 R = Math.Round((R1 + m) * 255) 37 G = Math.Round((G1 + m) * 255) 38 B = Math.Round((B1 + m) * 255) 39 End If 40 41 HSV_RGB = R.ToString("###") + "," + G.ToString("###") + _ 42 "," + B.ToString("###") 43 End Function

Page 43: Algoritma Transformasi Ruang Warna.pdf

38  

II.6.C C# 0 private string HSV_RGB(string HSV) 1 { 2 string[] strData; 3 double R = 0, G = 0, B = 0; 4 5 strData = HSV.Split(','); 6 if (strData.Length >= 3) 7 { 8 double R1, G1, B1; 9 double H, S, V; 10 double H1, X, C, m; 11 12 H = double.Parse(strData[0]); 13 S = double.Parse(strData[1]); 14 V = double.Parse(strData[2]); 15 16 C = V * S; 17 18 H1 = H / 60; 19 X = Math.Abs((H1 % 2) - 1); 20 X = C * (1 - X); 21 22 if (H1 >= 0 && H1 < 1) 23 { 24 R1 = C; G1 = X; B1 = 0; } 25 else if (H1 >= 1 && H1 < 2) 26 { 27 R1 = X; G1 = C; B1 = 0; } 28 else if (H1 >= 2 && H1 < 3) 29 { 30 R1 = 0; G1 = C; B1 = X; } 31 else if (H1 >= 3 && H1 < 4) 32 { 33 R1 = 0; G1 = X; B1 = C; } 34 else if (H1 >= 4 && H1 < 5) 35 { 36 R1 = X; G1 = 0; B1 = C; } 37 else if (H1 >= 5 && H1 < 6) 38 { 39 R1 = C; G1 = 0; B1 = 0; } 40 else 41 { 42 R1 = 0; G1 = 0; B1 = 0; } 43 44 m = V - C; 45 46 R = Math.Round((R1 + m) * 255); 47 G = Math.Round((G1 + m) * 255); 48 B = Math.Round((B1 + m) * 255); 49 } 51 return R.ToString("###") + "," + G.ToString("###") + "," + B.ToString("###"); 53 }

Page 44: Algoritma Transformasi Ruang Warna.pdf

39  

II.6.D JAVA 0 private String HSV_RGB(String HSV) 1 { 2 String[] strData; 3 String strRet = ""; 4 double R = 0, G = 0, B = 0; 5 6 strData = HSV.split(","); 7 if (strData.length >= 2) 8 { 9 double R1, G1, B1, H, S, V, H1, X, C, m; 10 11 H = Double.parseDouble(strData[0]); 12 S = Double.parseDouble(strData[1]); 13 V = Double.parseDouble(strData[2]); 14 15 C = V * S; 16 H1 = H / 60; 17 X = Math.abs((H1 % 2) - 1); 18 X = C * (1 - X); 19 20 if (H1 >= 0 && H1 < 1) { 21 R1 = C; G1 = X; B1 = 0; } 22 else if (H1 >= 1 && H1 < 2) { 23 R1 = X; G1 = C; B1 = 0; } 24 else if (H1 >= 2 && H1 < 3) { 25 R1 = 0; G1 = C; B1 = X; } 26 else if (H1 >= 3 && H1 < 4) { 27 R1 = 0; G1 = X; B1 = C; } 28 else if (H1 >= 4 && H1 < 5) { 29 R1 = X; G1 = 0; B1 = C; } 30 else if (H1 >= 5 && H1 < 6) { 31 R1 = C; G1 = 0; B1 = 0; } 32 else { 33 R1 = 0; G1 = 0; B1 = 0; } 34 35 m = V - C; 36 R = Math.round((R1 + m) * 255); 37 G = Math.round((G1 + m) * 255); 38 B = Math.round((B1 + m) * 255); 39 java.text.DecimalFormat df = new java.text.DecimalFormat ("###"); 40 strRet = df.format(R) + "," + df.format(G) + "," + df.format(B); 41 } 42 return strRet; 43 } HSV terdiri dari bilangan Hue, Saturation dan Value, untuk memasukkan bilangan HSV ke function/method HSV_RGB diatas, data dipisahkan oleh tanda koma (,), jadi contoh pengiriman parameter ke function/method HSV_RGB diatas adalah 251, 0.885, 0.918. Output dari function ini akan berupa data RGB bertipe string, contoh : 65,27,234.

Page 45: Algoritma Transformasi Ruang Warna.pdf

40  

II.7 TRANSFORMASI RGB KE HSI Untuk mentransformasi dari RGB ke HSI. Diasumsikan koordinat-koordinat R, G, B [0,1] adalah berurutan merah, hijau, biru dalam ruang warna RGB, dengan max adalah nilai maksimum dari nilai red, green, blue, dan min adalah nilai minimum dari nilai red, green, blue. Untuk memperoleh sudut hue[0,360] yang tepat untuk ruang warna HSI, menggunakan rumus seperti berikut : (http://en.wikipedia.org/wiki/HSL_and_HSV)

   

  0,   max

 60       max  

    6   ,    max  

60       max  

    2   ,    max  

    60       max  

    4    , max

Nilai-nilai untuk s dan i pada HSI didefinisikan sebagai berikut :

    

  0  ,     

  1   ,   

         

Rumus di atas menghasilkan nilai intensity dan saturation dalam jangkauan [0,1]. Misalnya ingin ditransformasikan RGB(65, 27, 234) ke dalam bentuk HSI, maka langkahnya adalah sebagai berikut : Setiap nilai RGB(65, 67, 234) diubah dalam jangkauan [0,1] dengan membagi setiap nilai dengan 255 : menjadi     ,   ,     = 0.255, 0.106, 0.918  RGB(0.255, 0.106, 0.918) ini yang akan ditransformasikan ke bentuk HSI. max = nilai B (blue) = 0.918, min = nilai G (green) = 0.106, max – min = 0.918 – 0.106 = 0.812.

Page 46: Algoritma Transformasi Ruang Warna.pdf

41  

h (Hue) = 60           

     4   , karena max = b (blue).

= 60        .     .

.    4  = 251

i (intensity) =       =    0.255 0.106 0.918  = 0.426 s (saturation) = 1   , karena max <> min =   1   .

. = 0.751

sehingga nilai RGB(65, 27, 234) ditransformasikan menjadi HSI(251, 0.751, 0.426) dengan jangkauan RGB [0,1]. Berdasarkan langkah-langkah transformasi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut : II.7.A VISUAL BASIC 6 0 Private Function RGB_HSI(RGB As String) As String 1 Dim strData() As String 2 Dim H As Double, S As Double, I As Double 3 4 strData = Split(RGB, ",") 5 If UBound(strData) >= 2 Then 6 Dim R As Double, G As Double, B As Double 7 Dim max As Double, min As Double 8 9 R = CDbl(strData(0)) / 255 10 G = CDbl(strData(1)) / 255 11 B = CDbl(strData(2)) / 255 12 max = R 13 If max < G Then max = G 14 If max < B Then max = B 15 min = R 16 If min > G Then min = G 17 If min > B Then min = B 18 If max = min Then 19 H = 0 20 ElseIf max = R Then 21 H = 60 * (((G - B) / (max - min)) Mod 6) 22 ElseIf max = G Then 23 H = 60 * (((B - R) / (max - min)) + 2) 24 ElseIf max = B Then 25 H = 60 * (((R - G) / (max - min)) + 4) 26 End If

Page 47: Algoritma Transformasi Ruang Warna.pdf

42  

27 I = (R + G + B) / 3 28 If max = min Then 29 S = 0 30 Else 31 S = 1 - (min / I) 32 End If 33 End If 34 35 RGB_HSI = Format$(H, "0.000") + "," + Format$(S, "0.000") + "," + Format$(I, "0.000") 36 End Function II.7.B VISUAL BASIC.NET 0 Private Function RGB_HSI(ByVal RGB As String) As String 1 Dim strData() As String 2 Dim H As Double, S As Double, I As Double 3 4 strData = RGB.Split(",") 5 If strData.Length >= 3 Then 6 Dim R As Double, G As Double, B As Double 7 Dim max As Double 8 Dim min As Double 9 10 R = CDbl(strData(0)) / 255 11 G = CDbl(strData(1)) / 255 12 B = CDbl(strData(2)) / 255 13 max = R 14 If max < G Then max = G 15 If max < B Then max = B 16 min = R 17 If min > G Then min = G 18 If min > B Then min = B 19 If max = min Then 20 H = 0 21 ElseIf max = R Then 22 H = 60 * (((G - B) / (max - min)) Mod 6) 23 ElseIf max = G Then 24 H = 60 * (((B - R) / (max - min)) + 2) 25 ElseIf max = B Then 26 H = 60 * (((R - G) / (max - min)) + 4) 27 End If 28 29 I = (R + G + B) / 3 30 31 If max = min Then 32 S = 0 33 Else 34 S = 1 - (min / I) 35 End If 36 End If 37 38 Return H.ToString("0.000") + "," + S.ToString("0.000") + "," + I.ToString("0.000") 40 End Function

Page 48: Algoritma Transformasi Ruang Warna.pdf

43  

II.7.C C# 0 private string RGB_HSI(string RGB) 1 { 2 string[] strData; 3 double H = 0, S = 0, I = 0; 4 5 strData = RGB.Split(','); 6 if (strData.Length >= 3) 7 { 8 double R, G, B; 9 double min, max; 10 11 R = double.Parse(strData[0]) / 255; 12 G = double.Parse(strData[1]) / 255; 13 B = double.Parse(strData[2]) / 255; 14 max = R; 15 if (max < G) max = G; 16 if (max < B) max = B; 17 18 min = R; 19 if (min > G) min = G; 20 if (min > B) min = B; 21 22 if (max == min) 23 H = 0; 24 else if (max == R) 25 H = 60 * (((G - B) / (max - min)) % 6); 26 else if (max == G) 27 H = 60 * (((B - R) / (max - min)) + 2); 28 else if (max == B) 29 H = 60 * (((R - G) / (max - min)) + 4); 30 31 I = (R + G + B) / 3; 32 33 if (max == min) 34 S = 0; 35 else 36 S = 1 - (min / I); 37 } 38 39 return H.ToString("0.000") + "," + S.ToString("0.000") + 40 "," + I.ToString("0.000"); 41 }

Page 49: Algoritma Transformasi Ruang Warna.pdf

44  

II.7.D JAVA 0 private String RGB_HSI(String RGB) 1 { 2 String[] strData; 3 String strRet = ""; 4 double H = 0, S = 0, I = 0; 5 6 strData = RGB.split(","); 7 if (strData.length >= 2) 8 { 9 double R, G, B; 10 double min, max; 11 12 R = Double.parseDouble(strData[0]) / 255; 13 G = Double.parseDouble(strData[1]) / 255; 14 B = Double.parseDouble(strData[2]) / 255; 15 max = R; 16 if (max < G) max = G; 17 if (max < B) max = B; 18 min = R; 19 if (min > G) min = G; 20 if (min > B) min = B; 21 22 if (max == min) 23 H = 0; 24 else if (max == R) 25 H = 60 * (((G - B) / (max - min)) % 6); 26 else if (max == G) 27 H = 60 * (((B - R) / (max - min)) + 2); 28 else if (max == B) 29 H = 60 * (((R - G) / (max - min)) + 4); 30 31 I = (R + G + B) / 3; 32 if (max == min) 33 S = 0; 34 else 35 S = 1 - (min / I); 36 37 java.text.DecimalFormat df = new java.text.DecimalFormat ("0.000"); 38 strRet = df.format(H) + "," + df.format(S) + "," + df.format(I); 39 } 40 return strRet; 41 } RGB terdiri dari bilangan Red, Green dan Blue, untuk memasukkan bilangan RGB ke function/method dibawah, data dipisahkan oleh tanda koma (,), jadi contoh pengiriman parameter ke function/method dibawah adalah 65,27,234. Output dari function ini akan berupa data HSI bertipe string, contoh : 251, 0.751, 0.426.

Page 50: Algoritma Transformasi Ruang Warna.pdf

45  

II.8 TRANSFORMASI HSI KE RGB Untuk transformasi kembali dari HSI ke RGB, gunakan rumus berikut. Dengan hue H [0°, 360°), saturation S [0, 1], dan intensity I [0, 1] [Gonzales and Woods, 1992] : Jika, 00 ≤ H < 1200

        1  

        1     cos  

cos   60  

    

Jika, 1200 ≤ H < 2400

 120

        1  

        1     cos  

cos   60  

    1

Jika, 2400 ≤ H < 3600

 240

        1  

        1     cos  

cos   60  

    1

Untuk setiap r, g dan b :

   3 ,       3 ,       3 . Rumus di atas menghasilkan nilai RGB dalam jangkauan [0,1]. Untuk jangkauan [0,255], kalikan dahulu dengan 255.

Page 51: Algoritma Transformasi Ruang Warna.pdf

46  

Transformasikan HSI(251, 0.751, 0.426) ke dalam bentuk RGB, maka langkahnya adalah sebagai berikut : Periksa nilai H (hue), H =251, maka H = H – 2400 = 251 – 240 = 11 g =    1  

=      1 0.751  = 0.083 b =      1        

   

=      1    .     

   

=      1    .       .

. = 0.71

r = 1 – (g + b) = 1 – (0.083 + 0.71) = 0.207 R (red) = 3Ir = 3 x 0.426 x 0.207 = 0.264 G (green) = 3Ig = 3 x 0.426 x 0.0813 = 0.104 B (blue) = 3Ib = 3 x 0.426 x 0.71 = 0.907 RGB (0.264, 0.104, 0.907) ini dalam jangkauan [0,1] untuk jangkauan [0,255] kalikan dengan 255 : (0.264 x 255, 0.104 x 255, 0.907 x 255) menjadi (67.32, 26.52, 231.285) bulatkan keatas menjadi (67, 27, 231). Berdasarkan langkah-langkah transformasi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut : II.8.A VISUAL BASIC 6 0 Private Function HSI_RGB(HSI As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = Split(HSI, ",") 5 If UBound(strData) >= 2 Then 6 Dim R1 As Double, G1 As Double, B1 As Double 7 Dim H As Double, S As Double, I As Double 8

Page 52: Algoritma Transformasi Ruang Warna.pdf

47  

9 H = CDbl(strData(0)) 10 S = CDbl(strData(1)) 11 I = CDbl(strData(2)) 12 13 If H >= 0 And H < 120 Then 14 B1 = (1 - S) / 3 15 R1 = (((S * Cos(H)) / Cos(60 - H)) + 1) / 3 16 G1 = B1 + R1 17 ElseIf H >= 120 And H < 240 Then 18 H = H - 120 19 R1 = (1 - S) / 3 20 G1 = (((S * Cos(H)) / Cos(60 - H)) + 1) / 3 21 B1 = 1 - (R1 - G1) 22 Else 23 H = H - 240 24 G1 = (1 - S) / 3 25 B1 = (((S * Cos(H)) / Cos(60 - H)) + 1) / 3 26 R1 = 1 - (G1 + B1) 27 End If 28 29 R = Round((R1 * 3 * I) * 255) 30 G = Round((G1 * 3 * I) * 255) 31 B = Round((B1 * 3 * I) * 255) 32 End If 33 34 HSI_RGB = Format$(R, "###") + "," + Format$(G, "###") + _ 35 "," + Format$(B, "###") 36 End Function II.8.B VISUAL BASIC.NET 0 Private Function HSI_RGB(ByVal HSI As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = HSI.Split(",") 5 If strData.Length >= 3 Then 6 Dim R1 As Double, G1 As Double, B1 As Double 7 Dim H As Double, S As Double, I As Double 8 9 H = CDbl(strData(0)) 10 S = CDbl(strData(1)) 11 I = CDbl(strData(2)) 12 13 If H >= 0 And H < 120 Then 14 B1 = (1 - S) / 3 15 R1 = (((S * Math.Cos(H)) / Math.Cos(60 - H)) + 1) / 3 16 G1 = B1 + R1 17 ElseIf H >= 120 And H < 240 Then 18 H = H - 120 19 R1 = (1 - S) / 3 20 G1 = (((S * Math.Cos(H)) / Math.Cos(60 - H)) + 1) / 3 21 B1 = 1 - (R1 - G1)

Page 53: Algoritma Transformasi Ruang Warna.pdf

48  

22 Else 23 H = H - 240 24 G1 = (1 - S) / 3 25 B1 = (((S * Math.Cos(H)) / Math.Cos(60 - H)) + 1) / 3 26 R1 = 1 - (G1 + B1) 27 End If 28 29 R = Math.Round((R1 * 3 * I) * 255) 30 G = Math.Round((G1 * 3 * I) * 255) 31 B = Math.Round((B1 * 3 * I) * 255) 32 End If 33 34 Return R.ToString("###") + "," + G.ToString("###") + 35 "," + B.ToString("###") 36 End Function II.8.C C# 0 private string HSI_RGB(string HSI) 1 { 2 string[] strData; 3 double R = 0, G = 0, B = 0; 4 5 strData = HSI.Split(','); 6 if (strData.Length >= 3) 7 { 8 double R1, G1, B1; 9 double H, S, I; 10 11 H = double.Parse(strData[0]); 12 S = double.Parse(strData[1]); 13 I = double.Parse(strData[2]); 14 15 if (H >= 0 && H < 120) 16 { 17 B1 = (1 - S) / 3; 18 R1 = (((S * Math.Cos(H)) / Math.Cos(60 - H)) + 1) / 3; 19 G1 = B1 + R1; 20 } 21 else if (H >= 120 && H < 240) 22 { 23 H = H - 120; 24 R1 = (1 - S) / 3; 25 G1 = (((S * Math.Cos(H)) / Math.Cos(60 - H)) + 1) / 3; 26 B1 = 1 - (R1 - G1); 27 } 28 else 29 { 30 H = H - 240; 31 G1 = (1 - S) / 3; 32 B1 = (((S * Math.Cos(H)) / Math.Cos(60 - H)) + 1) / 3; 33 R1 = 1 - (G1 + B1); 34 }

Page 54: Algoritma Transformasi Ruang Warna.pdf

49  

35 36 R = Math.Round((R1 * 3 * I) * 255); 37 G = Math.Round((G1 * 3 * I) * 255); 38 B = Math.Round((B1 * 3 * I) * 255); 39 } 40 return R.ToString("###") + "," + G.ToString("###") + "," + B.ToString("###"); 41 } II.8.D JAVA 0 private String HSI_RGB(String HSI) 1 { 2 String[] strData; 3 String strRet = ""; 4 double R = 0, G = 0, B = 0; 5 6 strData = HSI.split(","); 7 if (strData.length >= 3) 8 { 9 double R1, G1, B1; 10 double H, S, I; 11 H = Double.parseDouble(strData[0]); 12 S = Double.parseDouble(strData[1]); 13 I = Double.parseDouble(strData[2]); 14 if (H >= 0 && H < 120) 15 { 16 B1 = (1 - S) / 3; 17 R1 = (((S * Math.cos(H)) / Math.cos(60 - H)) + 1) / 3; 18 G1 = B1 + R1; 19 } 20 else if (H >= 120 && H < 240) 21 { 22 H = H - 120; 23 R1 = (1 - S) / 3; 24 G1 = (((S * Math.cos(H)) / Math.cos(60 - H)) + 1) / 3; 25 B1 = 1 - (R1 - G1); 26 } 27 else 28 { 29 H = H - 240; 30 G1 = (1 - S) / 3; 31 B1 = (((S * Math.cos(H)) / Math.cos(60 - H)) + 1) / 3; 32 R1 = 1 - (G1 + B1); 33 } 34 35 R = Math.round((R1 * 3 * I) * 255); 36 G = Math.round((G1 * 3 * I) * 255); 37 B = Math.round((B1 * 3 * I) * 255); 38 java.text.DecimalFormat df = new java.text.DecimalFormat ("###"); 39 strRet = df.format(R) + "," + df.format(G) + "," + df.format(B); 40 } 41 return strRet; 42 }

Page 55: Algoritma Transformasi Ruang Warna.pdf

50  

HSI terdiri dari bilangan Hue, Saturation dan Intensity, untuk memasukkan bilangan HSI ke function/method HSI_RGB diatas, data dipisahkan oleh tanda koma (,), jadi contoh pengiriman parameter ke function/method HSI_RGB diatas adalah 251, 0.756, 0.426. Output dari function ini akan berupa data RGB bertipe string, contoh : 67, 27, 231. II.9 TRANSFORMASI RGB KE HCL Untuk mentransformasi dari RGB ke HCL. Diasumsikan koordinat-koordinat R, G, B [0,1] adalah berurutan merah, hijau, biru dalam ruang warna RGB, dengan max adalah nilai maksimum dari nilai red, green, blue, dan min adalah nilai minimum dari nilai red, green, blue. Untuk memperoleh luminance untuk ruang warna HCL, menggunakan rumus seperti berikut [Madenda and Missaoui, 2005] :

  .   , ,        1  .   , ,

2

dimana   . adalah parameter yang memungkinkan untuk pengaturan terhadap pengaruh perubahan intensitas, α=0 jika Max(R,G,B)=0, dan jika tidak     , ,

, ,     . Sedang parameter Y0 adalah nilai stimulasi untuk referensi warnah putih dimana Y0 = 100 untuk standar iluminasi CIE D65. Parameter γ (1 ≤ γ ≤ 31) adalah faktor koreksi terhadap kondisi pencahayaan manusia.

     | |   | |   | |

3

Untuk Hue adalah,

arctan

     

        0

    0     0      23 

        60

     0     0     180    

    0     0      43 

        120  

    0     0      23     180

Page 56: Algoritma Transformasi Ruang Warna.pdf

51  

Misalnya ingin ditransformasikan RGB(65, 27, 234) ke dalam bentuk HCL, maka langkahnya adalah sebagai berikut : Setiap nilai RGB(65, 67, 234) diubah dalam jangkauan [0,1] dengan membagi setiap nilai dengan 255 : menjadi     ,   ,     = 0.255, 0.106, 0.918  RGB(0.255, 0.106, 0.918) ini yang akan ditransformasikan ke bentuk HCL. Max(R, G, B) = nilai B (blue) = 0.918, Min (R, G, B) =nilai G (green) = 0.106.

α = , ,, ,              .

.     = 0.001154684

parameter γ (Gamma) kita ambil = 30. Q = . = .      = . = 1.035

L =  .   , ,         .   , ,       .      .    .          .       0.477

C =     | |  | |  | |       .     | .     . |  | .     . |  | .   . |     0.56 H = arctan      arctan .     .

.     .        arctan 5.45        79.6

Karena, R – G = 0.255 – 0.106 = 0.149 > 0, dan G – B = 0.106 – 0.918 = -0.812 < 0, maka H =            79.6     106.13 sehingga nilai RGB(65, 27, 234) ditransformasikan menjadi HCL(-106.130, 0.56, 0.477) dengan jangkauan RGB [0,1]. Berdasarkan langkah-langkah transformasi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut :

Page 57: Algoritma Transformasi Ruang Warna.pdf

52  

II.10.A VISUAL BASIC 6 0 Private Function RGB_HCL(RGB As String, Gamma As Double) As String 1 Dim strData() As String 2 Const PI As Double = 3.14159265358979 3 4 strData = Split(RGB, ",") 5 If UBound(strData) >= 2 Then 6 Dim R As Double, G As Double, B As Double 7 Dim alpha As Double, max As Double, min As Double 8 Dim Q As Double, L As Double, C As Double, H As Double 9 10 R = CDbl(strData(0)) / 255 11 G = CDbl(strData(1)) / 255 12 B = CDbl(strData(2)) / 255 13 max = R 14 If max < G Then max = G 15 If max < B Then max = B 16 min = R 17 If min > G Then min = G 18 If min > B Then min = B 19 20 alpha = min / (max * Gamma) 21 Q = Exp(alpha) 22 L = ((Q * max) + ((Q - 1) * min)) / 2 23 C = (Q * (Abs(R - G) + Abs(G - B) + Abs(B - R))) / 3 24 25 H = Atn((G - B) / (R - G)) * (180 / PI) 26 If R = G And R = B Then 27 H = -1 28 ElseIf G = B And G < R Then 29 H = 0 30 ElseIf (R - G >= 0) And (G - B) >= 0 Then 31 H = (2 * H) / 3 32 ElseIf R = G And R > B Then 33 H = 60 34 ElseIf (R - G < 0) And (G - B >= 0) Then 35 H = 180 + ((4 * H) / 3) 36 ElseIf (R - G >= 0) And (G - B < 0) Then 37 H = (4 * H) / 3 38 ElseIf R = G And R < B Then 39 H = -120 40 ElseIf (R - G < 0) And (G - B < 0) Then 41 H = ((2 * H) / 3) - 180 42 End If 43 End If 44 45 RGB_HCL = Format$(H, "0.000") + "," + Format$(C, "0.000") + "," + Format$(L, "0.000") 46 End Function

Page 58: Algoritma Transformasi Ruang Warna.pdf

53  

II.10.A VISUAL BASIC.NET 0 Private Function RGB_HCL(ByVal RGB As String, ByVal Gamma As Double) As String 1 Dim strData() As String 2 Dim Q As Double, L As Double, C As Double, H As Double 3 Const PI As Double = 3.14159265358979 4 5 strData = RGB.Split(",") 6 If strData.Length >= 3 Then 7 Dim R As Double, G As Double, B As Double 8 Dim alpha As Double, max As Double, min As Double 9 10 R = Double.Parse(strData(0)) / 255 11 G = Double.Parse(strData(1)) / 255 12 B = Double.Parse(strData(2)) / 255 13 max = R 14 If max < G Then max = G 15 If max < B Then max = B 16 min = R 17 If min > G Then min = G 18 If min > B Then min = B 19 20 alpha = min / (max * Gamma) 21 Q = Math.Exp(alpha) 22 L = ((Q * max) + ((Q - 1) * min)) / 2 23 C = (Q * (Math.Abs(R - G) + Math.Abs(G - B) + Math.Abs(B - R))) / 3 24 25 H = Math.Atan((G - B) / (R - G)) * (180 / PI) 26 If R = G And R = B Then 27 H = -1 28 ElseIf G = B And G < R Then 29 H = 0 30 ElseIf (R - G >= 0) And (G - B) >= 0 Then 31 H = (2 * H) / 3 32 ElseIf R = G And R > B Then 33 H = 60 34 ElseIf (R - G < 0) And (G - B >= 0) Then 35 H = 180 + ((4 * H) / 3) 36 ElseIf (R - G >= 0) And (G - B < 0) Then 37 H = (4 * H) / 3 38 ElseIf R = G And R < B Then 39 H = -120 40 ElseIf (R - G < 0) And (G - B < 0) Then 41 H = ((2 * H) / 3) - 180 42 End If 43 End If 44 45 Return H.ToString("0.000") + "," + C.ToString("0.000") + "," + L.ToString("0.000") 46 End Function  

Page 59: Algoritma Transformasi Ruang Warna.pdf

54  

II.10.A C# 0 private string RGB_HCL(string RGB, double Gamma) 1 { 2 string[] strData; 3 double Q, L=0, C=0, H=0; 4 const double PI = 3.14159265358979; 5 6 strData = RGB.Split(','); 7 if (strData.Length >= 3) 8 { 9 double R, G, B; 10 double alpha, max, min; 11 12 R = double.Parse(strData[0]) / 255; 13 G = double.Parse(strData[1]) / 255; 14 B = double.Parse(strData[2]) / 255; 15 max = R; 16 if (max < G) max = G; 17 if (max < B) max = B; 18 min = R; 19 if (min > G) min = G; 20 if (min > B) min = B; 21 22 alpha = min / (max * Gamma); 23 Q = Math.Exp(alpha); 24 L = ((Q * max) + ((Q - 1) * min)) / 2; 25 C = (Q * (Math.Abs(R - G) + Math.Abs(G - B) + Math.Abs(B - R))) / 3; 26 27 H = Math.Atan((G - B) / (R - G)) * (180 / PI); 28 if (R == G && R == B) 29 H = -1; 30 else if (G == B && G < R) 31 H = 0; 32 else if ( (R - G >= 0) && (G - B) >= 0) 33 H = (2 * H) / 3; 34 else if ( R == G && R > B) 35 H = 60; 36 else if ( (R - G < 0) && (G - B >= 0)) 37 H = 180 + ((4 * H) / 3); 38 else if ( (R - G >= 0) && (G - B < 0)) 39 H = (4 * H) / 3; 40 else if (R == G && R < B) 41 H = -120; 42 else if ((R - G < 0) && (G - B < 0)) 43 H = ((2 * H) / 3) - 180; 44 } 45 46 return H.ToString("0.000") + "," + C.ToString("0.000") + "," + L.ToString("0.000"); 47 }  

Page 60: Algoritma Transformasi Ruang Warna.pdf

55  

II.10.A JAVA 0 private String RGB_HCL(String RGB, double Gamma) 1 { 2 String[] strData; 3 double Q, L=0, C=0, H=0; 4 double PI = 3.14159265358979; 5 6 strData = RGB.split(","); 7 if (strData.length >= 2) 8 { 9 double R, G, B; 10 double alpha, max, min; 11 12 R = Double.parseDouble(strData[0]) / 255; 13 G = Double.parseDouble(strData[1]) / 255; 14 B = Double.parseDouble(strData[2]) / 255; 15 max = R; 16 if (max < G) max = G; 17 if (max < B) max = B; 18 min = R; 19 if (min > G) min = G; 20 if (min > B) min = B; 21 22 alpha = min / (max * Gamma); 23 Q = Math.exp(alpha); 24 L = ((Q * max) + ((Q - 1) * min)) / 2; 25 C = (Q * (Math.abs(R - G) + Math.abs(G - B) + Math.abs(B - R))) / 3; 26 27 H = Math.atan((G - B) / (R - G)) * (180 / PI); 28 if (R == G && R == B) 29 H = -1; 30 else if (G == B && G < R) 31 H = 0; 32 else if ( (R - G >= 0) && (G - B) >= 0) 33 H = (2 * H) / 3; 34 else if ( R == G && R > B) 35 H = 60; 36 else if ( (R - G < 0) && (G - B >= 0)) 37 H = 180 + ((4 * H) / 3); 38 else if ( (R - G >= 0) && (G - B < 0)) 39 H = (4 * H) / 3; 40 else if (R == G && R < B) 41 H = -120; 42 else if ((R - G < 0) && (G - B < 0)) 43 H = ((2 * H) / 3) - 180; 44 } 45 46 java.text.DecimalFormat df = new java.text.DecimalFormat ("#.###"); 47 String strRet = df.format(H) + "," + df.format(C) + "," + df.format(L); 48 49 return strRet; 50 }

Page 61: Algoritma Transformasi Ruang Warna.pdf

56  

Pengiriman parameter ke function/method RGB_HCL diatas adalah nilai RGB contoh : 65, 27, 234, dan parameter Gamma. Gamma berada dalam jangkauan [0,31]. Output dari function/method ini akan berupa data HCL bertipe string, contoh : -106.13, 0.56, 0.477. II.10 TRANSFORMASI HCL KE RGB Untuk transformasi kembali dari HCL ke RGB [Madenda and Missaoui, 2005], dilakukan dalam dua tahap. tahap pertama adalah menghitung Q, Max dan Min :

      

 4 34 2

 32

 4 34 2

kemudian mengecek nilai H (hue) : Jika, 00 ≤ H ≤ 600

R = Max, B = Min

      tan        

1       

Jika, 600 < H ≤ 1200

G = Max, B = Min

      1   tan            

tan      

Jika, 1200 < H ≤ 1800

G = Max, R = Min

    1     180          180

Jika, -600 ≤ H < 00

R = Max, G = Min

    1                 

Page 62: Algoritma Transformasi Ruang Warna.pdf

57  

Jika, -1200 ≤ H < -600

B = Max, G = Min

      1   tan         

tan   

Jika, -1800 < H < -1200

B = Max, R = Min

       tan            

1  tan      

Transformasikan HCL(-106.130, 0.56, 0.477) ke dalam bentuk RGB, maka langkahnya adalah sebagai berikut : parameter γ (Gamma) = 30. Sesuai dengan parameter yang kita ambil sebelumnya saat transformasi dari RGB ke HCL.

Q =                   .      .            .       1.0367

  Max =                .             .

      .        .

    .    0.916

Min =              .             .

      .    0.106

Karena, H = -106.130 > -600, dan H ≤ -1200, maka B = Max = 0.916, G = Min = 0.106

      1   tan         

tan       

  0.106   1   tan        .  –  0.916 

tan         .    0.312

sehingga nilai HCL(-106.130, 0.56, 0.477) ditransformasikan menjadi RGB(0.312, 0.106, 0.916) dengan jangkauan RGB [0,1]. Kalikan dengan 255 menjadi : (0.312 x 255, 0.106 x 255, 0.916 x 255) menjadi (79.56, 27,03, 233.58) bulatkan keatas menjadi (80, 27, 234). Berdasarkan langkah-langkah transformasi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut :

Page 63: Algoritma Transformasi Ruang Warna.pdf

58  

II.10.A VISUAL BASIC 6 0 Private Function HCL_RGB(HCL As String, Gamma As Double) As String 1 Dim strData() As String 2 Const PI As Double = 3.14159265358979 3 Dim R As Double, G As Double, B As Double 4 5 strData = Split(HCL, ",") 6 If UBound(strData) >= 2 Then 7 Dim Q As Double, max As Double, min As Double 8 Dim H As Double, C As Double, L As Double 9 Dim tanH As Double 10 11 H = CDbl(strData(0)) 12 C = CDbl(strData(1)) 13 L = CDbl(strData(2)) 14 15 Q = Exp((1 - (3 * C) / (4 * L)) * (Gamma / 100)) 16 min = ((4 * L) - (3 * C)) / ((4 * Q) - 2) 17 max = (3 * C) / (2 * Q) 18 max = min + max 19 20 If H >= 0 And H <= 60 Then 21 tanH = Tan(H * 1.5 * PI / 180) 22 R = max 23 B = min 24 G = ((R * tanH) + B) / (1 + tanH) 25 ElseIf H > 60 And H <= 120 Then 26 H = H - 180 27 tanH = Tan(H * 0.75 * PI / 180) 28 G = max 29 B = min 30 R = ((G * (1 + tanH)) - B) / tanH 31 ElseIf H > 120 And H <= 180 Then 32 H = H - 180 33 tanH = Tan(H * 0.75 * PI / 180) 34 G = max 35 R = min 36 B = (G * (1 + tanH)) - (R * tanH) 37 ElseIf H >= -60 And H < 0 Then 38 tanH = Tan(H * 0.75 * PI / 180) 39 R = max 40 G = min 41 B = (G * (1 + tanH)) - (R * tanH) 42 ElseIf H >= -120 And H < -60 Then 43 tanH = Tan(H * 0.75 * PI / 180) 44 B = max 45 G = min 46 R = ((G * (1 + tanH)) - B) / tanH 47 ElseIf H > -180 And H < -120 Then 48 H = H + 180 49 tanH = Tan(H * 1.5 * PI / 180) 50 B = max 51 R = min

Page 64: Algoritma Transformasi Ruang Warna.pdf

59  

52 G = ((R * tanH) + B) / (1 + tanH) 53 End If 54 55 R = Round(R * 255) 56 G = Round(G * 255) 57 B = Round(B * 255) 58 End If 59 60 HCL_RGB = Format$(R, "###") + "," + Format$(G, "###") + "," + Format$(B, "###") 61 End Function II.10.A VISUAL BASIC.NET 0     Private Function HCL_RGB(ByVal HCL As String, ByVal Gamma As Double) As String 1         Dim strData() As String 2         Const PI As Double = 3.14159265358979 3         Dim R As Double, G As Double, B As Double 4 5         strData = HCL.Split(",") 6         If strData.Length >= 3 Then 7             Dim Q As Double, max As Double, min As Double 8             Dim H As Double, C As Double, L As Double 9             Dim tanH As Double 10 11            H = Double.Parse(strData(0)) 12            C = Double.Parse(strData(1)) 13            L = Double.Parse(strData(2)) 14 15            Q = Math.Exp((1 ‐ (3 * C) / (4 * L)) * (Gamma / 100)) 16            min = ((4 * L) ‐ (3 * C)) / ((4 * Q) ‐ 2) 17            max = (3 * C) / (2 * Q) 18            max = min + max 19 20            If H >= 0 And H <= 60 Then 21                tanH = Math.Tan(H * 1.5 * PI / 180) 22                R = max 23                B = min 24                G = ((R * tanH) + B) / (1 + tanH) 25            ElseIf H > 60 And H <= 120 Then 26                H = H ‐ 180 27                tanH = Math.Tan(H * 0.75 * PI / 180) 28                G = max 29                B = min 30                R = ((G * (1 + tanH)) ‐ B) / tanH 31            ElseIf H > 120 And H <= 180 Then 32                H = H ‐ 180 33                tanH = Math.Tan(H * 0.75 * PI / 180) 34                G = max 35                R = min 36                B = (G * (1 + tanH)) ‐ (R * tanH) 37            ElseIf H >= ‐60 And H < 0 Then 38                tanH = Math.Tan(H * 0.75 * PI / 180) 39                R = max 40                G = min 

Page 65: Algoritma Transformasi Ruang Warna.pdf

60  

41                B = (G * (1 + tanH)) ‐ (R * tanH) 42            ElseIf H >= ‐120 And H < ‐60 Then 43                tanH = Math.Tan(H * 0.75 * PI / 180) 44                B = max 45                G = min 46                R = ((G * (1 + tanH)) ‐ B) / tanH 47            ElseIf H > ‐180 And H < ‐120 Then 48                H = H + 180 49                tanH = Math.Tan(H * 1.5 * PI / 180) 50                B = max 51                R = min 52                G = ((R * tanH) + B) / (1 + tanH) 53            End If 54 55            R = Math.Round(R * 255) 56            G = Math.Round(G * 255) 57            B = Math.Round(B * 255) 58        End If 59 60        HCL_RGB = R.ToString("###") + "," + G.ToString("###") + "," + B.ToString("###") 61    End Function   II.10.A C# 0         private string HCL_RGB(string HCL, double Gamma) 1         { 2             string[] strData; 3             const double PI = 3.14159265358979; 4             double R=0, G=0, B=0; 5 6             strData = HCL.Split(','); 7             if (strData.Length >= 3) 8             { 9                 double Q, max, min; 10                double H, C, L; 11                double tanH; 12 13                H = double.Parse(strData[0]); 14                C = double.Parse(strData[1]); 15                L = double.Parse(strData[2]); 16 17                Q = Math.Exp((1 ‐ (3 * C) / (4 * L)) * (Gamma / 100)); 18                min = ((4 * L) ‐ (3 * C)) / ((4 * Q) ‐ 2); 19                max = (3 * C) / (2 * Q); 20                max = min + max; 21 22                if (H >= 0 && H <= 60) 23                { 24                    tanH = Math.Tan(H * 1.5 * PI / 180); 25                    R = max; 26                    B = min; 27                    G = ((R * tanH) + B) / (1 + tanH); 28                } 29                else if (H > 60 && H <= 120) 30                { 

Page 66: Algoritma Transformasi Ruang Warna.pdf

61  

31                    H = H ‐ 180; 32                    tanH = Math.Tan(H * 0.75 * PI / 180); 33                    G = max; 34                    B = min; 35                    R = ((G * (1 + tanH)) ‐ B) / tanH; 36                } 37                else if (H > 120 && H <= 180) 38                { 39                    H = H ‐ 180; 40                    tanH = Math.Tan(H * 0.75 * PI / 180); 41                    G = max; 42                    R = min; 43                    B = (G * (1 + tanH)) ‐ (R * tanH); 44                } 45                else if ( H >= ‐60 && H < 0) 46                { 47                    tanH = Math.Tan(H * 0.75 * PI / 180); 48                    R = max; 49                    G = min; 50                    B = (G * (1 + tanH)) ‐ (R * tanH); 51                } 52                else if ( H >= ‐120 && H < ‐60) 53                { 54                    tanH = Math.Tan(H * 0.75 * PI / 180); 55                    B = max; 56                    G = min; 57                    R = ((G * (1 + tanH)) ‐ B) / tanH; 58                } 59                else if ( H > ‐180 && H < ‐120) 60                { 61                    H = H + 180; 62                    tanH = Math.Tan(H * 1.5 * PI / 180); 63                    B = max; 64                    R = min; 65                    G = ((R * tanH) + B) / (1 + tanH); 66                } 67 68                R = Math.Round(R * 255); 69                G = Math.Round(G * 255); 70                B = Math.Round(B * 255); 71            } 72 73        return R.ToString("###") + "," + G.ToString("###") + "," + 74B.ToString("###"); 75        }   II.10.A JAVA 0 private String HCL_RGB(String HCL, double Gamma) 1 { 2 String[] strData; 3 double PI = 3.14159265358979; 4 double R=0, G=0, B=0; 5 6 strData = HCL.split(",");

Page 67: Algoritma Transformasi Ruang Warna.pdf

62  

7 if (strData.length >= 2) 8 { 9 double Q, max, min; 10 double H, C, L; 11 double tanH; 12 13 H = Double.parseDouble(strData[0]); 14 C = Double.parseDouble(strData[1]); 15 L = Double.parseDouble(strData[2]); 16 17 Q = Math.exp((1 - (3 * C) / (4 * L)) * (Gamma / 100)); 18 min = ((4 * L) - (3 * C)) / ((4 * Q) - 2); 19 max = (3 * C) / (2 * Q); 20 max = min + max; 21 22 if (H >= 0 && H <= 60) 23 { 24 tanH = Math.tan(H * 1.5 * PI / 180); 25 R = max; 26 B = min; 27 G = ((R * tanH) + B) / (1 + tanH); 28 } 29 else if (H > 60 && H <= 120) 30 { 31 H = H - 180; 32 tanH = Math.tan(H * 0.75 * PI / 180); 33 G = max; 34 B = min; 35 R = ((G * (1 + tanH)) - B) / tanH; 36 } 37 else if (H > 120 && H <= 180) 38 { 39 H = H - 180; 40 tanH = Math.tan(H * 0.75 * PI / 180); 41 G = max; 42 R = min; 43 B = (G * (1 + tanH)) - (R * tanH); 44 } 45 else if ( H >= -60 && H < 0) 46 { 47 tanH = Math.tan(H * 0.75 * PI / 180); 48 R = max; 49 G = min; 50 B = (G * (1 + tanH)) - (R * tanH); 51 } 52 else if ( H >= -120 && H < -60) 53 { 54 tanH = Math.tan(H * 0.75 * PI / 180); 55 B = max; 56 G = min; 57 R = ((G * (1 + tanH)) - B) / tanH; 58 } 59 else if ( H > -180 && H < -120) 60 { 61 H = H + 180;

Page 68: Algoritma Transformasi Ruang Warna.pdf

63  

62 tanH = Math.tan(H * 1.5 * PI / 180); 63 B = max; 64 R = min; 65 G = ((R * tanH) + B) / (1 + tanH); 66 } 67 68 R = Math.round(R * 255); 69 G = Math.round(G * 255); 70 B = Math.round(B * 255); 71 } 72 73 java.text.DecimalFormat df = new java.text.DecimalFormat ("###"); 74 String strRet = df.format(R) + "," + df.format(G) + "," + df.format(B); 75 return strRet; 76 } HCL terdiri dari bilangan Hue, Chroma dan Luminance, dan parameter Gamma. Gamma berada dalam jangkauan [0,31], nilai parameter ini harus sama dengan nilai saat di transformasi awal dari RGB ke HCL. Untuk memasukkan bilangan HCL ke function/method HCL_RGB diatas, data dipisahkan oleh tanda koma (,), jadi contoh pengiriman parameter ke function/method HCL_RGB diatas adalah -106.13, 0.56, 0.477 untuk parameter pertama dan 30 untuk parameter kedua. Output dari function ini akan berupa data RGB bertipe string, contoh : 80, 27, 234. II.11 TRANSFORMASI RGB KE YUV DAN YUV KE RGB Untuk mentransformasi dari RGB ke YUV. Diasumsikan koordinat-koordinat R, G, B [0,1] adalah berurutan merah, hijau, biru dalam ruang warna RGB, menggunakan rumus seperti berikut : (sumber : http://en.wikipedia.org/wiki/YUV)

0.299 0.587 0.114

0.436     0.886

 

0.615    0.701

Untuk transformasi kembali dari YUV ke RGB, gunakan rumus berikut :

   1.254    0.395       0.58

   2.03 Berdasarkan rumus transformasi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut :

Page 69: Algoritma Transformasi Ruang Warna.pdf

64  

II.11.A VISUAL BASIC 6 0 Private Function RGB_YUV(RGB As String) As String 1 Dim strData() As String 2 Dim Y As Double, U As Double, V As Double 3 4 strData = Split(RGB, ",") 5 If UBound(strData) >= 2 Then 6 Dim R As Double, G As Double, B As Double 7 8 R = CDbl(strData(0)) / 255 9 G = CDbl(strData(1)) / 255 10 B = CDbl(strData(2)) / 255 11 12 Y = (0.299 * R) + (0.587 * G) + (0.114 * B) 13 U = 0.436 * ((B - Y) / 0.886) 14 V = 0.615 * ((R - Y) / 0.701) 15 End If 16 17 RGB_YUV = Format$(Y, "0.000") + "," + Format$(U, "0.000") + _ 18 "," + Format$(V, "0.000") 19 End Function 0 Private Function YUV_RGB(YUV As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = Split(YUV, ",") 5 If UBound(strData) >= 2 Then 6 Dim Y As Double, U As Double, V As Double 7 8 Y = CDbl(strData(0)) 9 U = CDbl(strData(1)) 10 V = CDbl(strData(2)) 11 12 R = Round((Y + (V * 1.254)) * 255) 13 G = Round((Y - (U * 0.395) - (V * 0.58)) * 255) 14 B = Round((Y + (U * 2.03)) * 255) 15 End If 16 17 YUV_RGB = Format$(R, "###") + "," + Format$(G, "###") + _ 18 "," + Format$(B, "###") 19 End Function II.11.B VISUAL BASIC.NET 0 Private Function RGB_YUV(ByVal RGB As String) As String 1 Dim strData() As String 2 Dim Y As Double, U As Double, V As Double 3 4 strData = RGB.Split(",")

Page 70: Algoritma Transformasi Ruang Warna.pdf

65  

5 If strData.Length >= 3 Then 6 Dim R As Double, G As Double, B As Double 7 8 R = CDbl(strData(0)) / 255 9 G = CDbl(strData(1)) / 255 10 B = CDbl(strData(2)) / 255 11 Y = (0.299 * R) + (0.587 * G) + (0.114 * B) 12 U = 0.436 * ((B - Y) / 0.886) 13 V = 0.615 * ((R - Y) / 0.701) 14 End If 15 16 Return Y.ToString("0.000") + "," + U.ToString("0.000") + _ 17 "," + V.ToString("0.000") 18 End Function 0 Private Function YUV_RGB(ByVal YUV As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = strData = YUV.Split(",") 5 If UBound(strData) >= 2 Then 6 Dim Y As Double, U As Double, V As Double 7 8 Y = CDbl(strData(0)) 9 U = CDbl(strData(1)) 10 V = CDbl(strData(2)) 11 12 R = Math.Round((Y + (V * 1.254)) * 255) 13 G = Math.Round((Y - (U * 0.395) - (V * 0.58)) * 255) 14 B = Math.Round((Y + (U * 2.03)) * 255) 15 End If 16 17 Return R.ToString("###") + "," + G.ToString("###") + _ 18 "," + B.ToString("###") 19 End Function II.11.C C# 0 private string RGB_YUV(string RGB) 1 { 2 string[] strData; 3 double Y=0, U=0, V=0; 4 5 strData = RGB.Split(','); 6 if (strData.Length >= 3) 7 { 8 double R, G, B; 9 10 R = double.Parse(strData[0]) / 255; 11 G = double.Parse(strData[1]) / 255; 12 B = double.Parse(strData[2]) / 255; 13

Page 71: Algoritma Transformasi Ruang Warna.pdf

66  

14 Y = (0.299 * R) + (0.587 * G) + (0.114 * B); 15 U = 0.436 * ((B - Y) / 0.886); 16 V = 0.615 * ((R - Y) / 0.701); 17 } 18 19 return Y.ToString("0.000") + "," + U.ToString("0.000") + 20 "," + V.ToString("0.000"); 21 } 0 private string YUV_RGB(string YUV) 1 { 2 string[] strData; 3 double R=0, G=0, B=0; 4 5 strData = YUV.Split(','); 6 if (strData.Length >= 3) 7 { 8 double Y, U, V; 9 10 Y = double.Parse(strData[0]); 11 U = double.Parse(strData[1]); 12 V = double.Parse(strData[2]); 13 14 R = Math.Round((Y + (V * 1.254)) * 255); 15 G = Math.Round((Y - (U * 0.395) - (V * 0.58)) * 255); 16 B = Math.Round((Y + (U * 2.03)) * 255); 17 } 18 19 return R.ToString("###") + "," + G.ToString("###") + 20 "," + B.ToString("###"); 21 } II.11.D JAVA 0 private String RGB_YUV(String RGB) 1 { 2 String[] strData; 3 String strRet = ""; 4 double Y=0, U=0, V=0; 5 6 strData = RGB.split(","); 7 if (strData.length >= 2) 8 { 9 double R, G, B; 10 11 R = Double.parseDouble(strData[0] / 255); 12 G = Double.parseDouble(strData[1] / 255); 13 B = Double.parseDouble(strData[2] / 255); 14 15 Y = (0.299 * R) + (0.587 * G) + (0.114 * B); 16 U = 0.436 * ((B - Y) / 0.886);

Page 72: Algoritma Transformasi Ruang Warna.pdf

67  

17 V = 0.615 * ((R - Y) / 0.701); 18 19 java.text.DecimalFormat df = new java.text.DecimalFormat ("0.000"); 20 strRet = df.format(Y) + "," + df.format(U) + "," + df.format(V); 21 } 22 return strRet; 23 } 0 private static String YUV_RGB(String YUV) 1 { 2 String[] strData; 3 String strRet = ""; 4 double R=0, G=0, B=0; 5 6 strData = YUV.split(","); 7 if (strData.length >= 2) 8 { 9 double Y, U, V; 10 Y = Double.parseDouble(strData[0]); 11 U = Double.parseDouble(strData[1]); 12 V = Double.parseDouble(strData[2]); 13 14 R = Math.round((Y + (V * 1.254)) * 255); 15 G = Math.round((Y - (U * 0.395) - (V * 0.58)) * 255); 16 B = Math.round((Y + (U * 2.03)) * 255); 17 18 java.text.DecimalFormat df = new java.text.DecimalFormat ("###"); 19 strRet = df.format(R) + "," + df.format(G) + "," + df.format(B); 20 } 21 return strRet; 22 } Pengiriman parameter ke function/method RGB_YUV diatas adalah nilai RGB contoh : 65, 27, 234. Output dari function/method ini akan berupa data YUV bertipe string, contoh : 0.243,0.332,0.010. Dan sebaliknya untuk function/method YUV_RGB menerima parameter nilai YUV, dan menghasilkan nilai RGB. II.12 TRANSFORMASI RGB KE YDbDr dan YDbDr KE RGB Untuk mentransformasi dari RGB ke YDbDr. Diasumsikan koordinat-koordinat R, G, B [0,1] adalah berurutan merah, hijau, biru dalam ruang warna RGB dan Db, Dr[-1.333, 1.333] menggunakan rumus seperti berikut : (http://en.wikipedia.org/wiki/YDbDr) Y = 0.299R + 0.587G + 0.114B Db = -045R – 0.883G + 1.333B Dr = -1.333R + 1.116G + 0.217B

Page 73: Algoritma Transformasi Ruang Warna.pdf

68  

Untuk transformasi kembali dari YDbDr ke RGB, gunakan rumus berikut : R = Y + 0.000092303716148Db - 0.525912630661865Dr G = Y - 0.129132898890509Db + 0.267899328207599Dr B = Y + 0.664679059978955Db - 0.000079202543533Dr Berdasarkan rumus transformasi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut : II.12.A VISUAL BASIC 6 0 Private Function RGB_YDbDr(RGB As String) As String 1 Dim strData() As String 2 Dim Y As Double, Db As Double, Dr As Double 3 4 strData = Split(RGB, ",") 5 If UBound(strData) >= 2 Then 6 Dim R As Double, G As Double, B As Double 7 8 R = CDbl(strData(0)) / 255 9 G = CDbl(strData(1)) / 255 10 B = CDbl(strData(2)) / 255 11 Y = (0.299 * R) + (0.587 * G) + (0.114 * B) 12 Db = (-0.45 * R) - (0.883 * G) + (1.333 * B) 13 Dr = (-1.333 * R) + (1.116 * G) + (0.217 * B) 14 End If 15 RGB_YDbDr = Format$(Y, "0.000") + "," + Format$(Db, "0.000") + "," + Format$(Dr, "0.000") 16 End Function 0 Private Function YDbDr_RGB(YDbDr As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = Split(YDbDr, ",") 5 If UBound(strData) >= 2 Then 6 Dim Y As Double, Db As Double, Dr As Double 7 8 Y = CDbl(strData(0)) 9 Db = CDbl(strData(1)) 10 Dr = CDbl(strData(2)) 11 R = Y + (0.000092303716148 * Db) - (0.525912630661865 * Dr) 12 R = Round(R * 255) 13 G = Y - (0.129132898890509 * Db) + (0.267899328207599 * Dr) 14 G = Round(G * 255) 15 B = Y + (0.664679059978955 * Db) - (0.000079202543533 * Dr) 16 B = Round(B * 255) 17 End If 18 YDbDr_RGB = Format$(R, "###") + "," + Format$(G, "###") + "," + Format$(B, "###") 19 End Function

Page 74: Algoritma Transformasi Ruang Warna.pdf

69  

II.12.B VISUAL BASIC.NET 0 Private Function RGB_YDbDr(ByVal RGB As String) As String 1 Dim strData() As String 2 Dim Y As Double, Db As Double, Dr As Double 3 4 strData = RGB.Split(",") 5 If strData.Length >= 3 Then 6 Dim R As Double, G As Double, B As Double 7 8 R = CDbl(strData(0)) / 255 9 G = CDbl(strData(1)) / 255 10 B = CDbl(strData(2)) / 255 11 12 Y = (0.299 * R) + (0.587 * G) + (0.114 * B) 13 Db = (-0.45 * R) - (0.883 * G) + (1.333 * B) 14 Dr = (-1.333 * R) + (1.116 * G) + (0.217 * B) 15 End If 16 17 Return Y.ToString("0.000") + "," + Db.ToString("0.000") + "," + Dr.ToString("0.000") 18 End Function 0 Private Function YDbDr_RGB(ByVal YDbDr As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = YDbDr.Split(",") 5 If UBound(strData) >= 2 Then 6 Dim Y As Double, Db As Double, Dr As Double 7 8 Y = CDbl(strData(0)) 9 Db = CDbl(strData(1)) 10 Dr = CDbl(strData(2)) 11 12 R = Y + (0.000092303716148 * Db) - (0.525912630661865 * Dr) 13 R = Math.Round(R * 255) 14 G = Y - (0.129132898890509 * Db) + (0.267899328207599 * Dr) 15 G = Math.Round(G * 255) 16 B = Y + (0.664679059978955 * Db) - (0.000079202543533 * Dr) 17 B = Math.Round(B * 255) 18 End If 19 20 Return R.ToString("###") + "," + G.ToString("###") + "," + B.ToString("###") 21 End Function

Page 75: Algoritma Transformasi Ruang Warna.pdf

70  

II.12.C C# 0 private string RGB_YDbDr(string RGB) 1 { 2 string[] strData; 3 double Y = 0, Db = 0, Dr = 0; 4 5 strData = RGB.Split(','); 6 if (strData.Length >= 3) 7 { 8 double R, G, B; 9 10 R = double.Parse(strData[0]) / 255; 11 G = double.Parse(strData[1]) / 255; 12 B = double.Parse(strData[2]) / 255; 13 14 Y = (0.299 * R) + (0.587 * G) + (0.114 * B); 15 Db = (-0.45 * R) - (0.883 * G) + (1.333 * B); 16 Dr = (-1.333 * R) + (1.116 * G) + (0.217 * B); 17 } 18 19 return Y.ToString("0.000") + "," + Db.ToString("0.000") + "," + Dr.ToString("0.000"); 20 } 0 private string YDbDr_RGB(string YDbDr) 1 { 2 string[] strData; 3 double R = 0, G = 0, B = 0; 4 5 strData = YDbDr.Split(','); 6 if (strData.Length >= 3) 7 { 8 double Y, Db, Dr; 9 10 Y = double.Parse(strData[0]) / 255; 11 Db = double.Parse(strData[1]) / 255; 12 Dr = double.Parse(strData[2]) / 255; 13 14 R = Y + (0.000092303716148 * Db) - (0.525912630661865 * Dr); 15 R = Math.Round(R * 255); 16 G = Y - (0.129132898890509 * Db) + (0.267899328207599 * Dr); 17 G = Math.Round(G * 255); 18 B = Y + (0.664679059978955 * Db) - (0.000079202543533 * Dr); 19 B = Math.Round(B * 255); 20 } 21 22 return R.ToString("###") + "," + G.ToString("###") + "," + B.ToString("###"); 23 }

Page 76: Algoritma Transformasi Ruang Warna.pdf

71  

II.12.D JAVA 0 private String RGB_YDbDr(String RGB) 1 { 2 String[] strData; 3 String strRet = ""; 4 double Y=0, Db=0, Dr=0; 5 6 strData = RGB.split(","); 7 if (strData.length >= 2) 8 { 9 double R, G, B; 10 11 R = Double.parseDouble(strData[0]) / 255; 12 G = Double.parseDouble(strData[1]) / 255; 13 B = Double.parseDouble(strData[2]) / 255; 14 Y = (0.299 * R) + (0.587 * G) + (0.114 * B); 15 Db = (-0.45 * R) - (0.883 * G) + (1.333 * B); 16 Dr = (-1.333 * R) + (1.116 * G) + (0.217 * B); 17 18 java.text.DecimalFormat df = new java.text.DecimalFormat ("0.000"); 19 strRet = df.format(Y) + "," + df.format(Db) + "," + df.format(Dr); 20 } 21 return strRet; 22 } 0 private static String YDbDr_RGB(String YDbDr) 1 { 2 String[] strData; 3 String strRet = ""; 4 double R=0, G=0, B=0; 5 6 strData = YDbDr.split(","); 7 if (strData.length >= 2) 8 { 9 double Y, Db, Dr; 10 11 Y = Double.parseDouble(strData[0]); 12 Db = Double.parseDouble(strData[1]); 13 Dr = Double.parseDouble(strData[2]); 14 15 R = Y + (0.000092303716148 * Db) - (0.525912630661865 * Dr); 16 R = Math.round(R * 255); 17 G = Y - (0.129132898890509 * Db) + (0.267899328207599 * Dr); 18 G = Math.round(G * 255); 19 B = Y + (0.664679059978955 * Db) - (0.000079202543533 * Dr); 20 B = Math.round(B * 255); 21 22 java.text.DecimalFormat df = new java.text.DecimalFormat ("###"); 23 strRet = df.format(R) + "," + df.format(G) + "," + df.format(B); 24 } 25 return strRet; 26 }

Page 77: Algoritma Transformasi Ruang Warna.pdf

72  

Pengiriman parameter ke function/method RGB_YDbDr diatas adalah nilai RGB contoh : 65, 27, 234. Output dari function/method ini akan berupa data YDbDr bertipe string, contoh : 0.243, 1.015, -0.022. Dan juga sebaliknya untuk function/method YDbDr_RGB menerima parameter nilai YDbDr, dan mengembalikan nilai berupa nilai RGB. II.13 TRANSFORMASI RGB KE YIQ DAN YIQ KE RGB (NTSC) Untuk mentransformasi dari RGB ke YIQ. Diasumsikan koordinat-koordinat R, G, B [0,1] adalah berurutan merah, hijau, biru dalam ruang warna RGB dan I [-0.5957, 0.5957], Dr [-0.5226, 0.5226] menggunakan rumus seperti berikut : (sumber : http://en.wikipedia.org/wiki/YIQ) Y = 0.299R + 0.587G + 0.114B I = 0.595716R – 0.274453G – 0.321263B Q = 0.211456R – 0.522591G + 0.311135B Untuk transformasi kembali dari YIQ ke RGB, gunakan rumus berikut : R = Y + 0.9563I + 0.6210Q G = Y – 0.2721I – 0.6474Q B = Y – 1.1070I + 1.7046Q Berdasarkan rumus transformasi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut : II.13.A VISUAL BASIC 6 0 Private Function RGB_YIQ(RGB As String) As String 1 Dim strData() As String 2 Dim Y As Double, I As Double, Q As Double 3 4 strData = Split(RGB, ",") 5 If UBound(strData) >= 2 Then 6 Dim R As Double, G As Double, B As Double 7 8 R = CDbl(strData(0)) / 255 9 G = CDbl(strData(1)) / 255 10 B = CDbl(strData(2)) / 255 11 12 Y = (0.299 * R) + (0.587 * G) + (0.114 * B) 13 I = (0.595716 * R) - (0.274453 * G) - (0.321263 * B) 14 Q = (0.211456 * R) - (0.522591 * G) + (0.311135 * B) 15 End If 16 17 RGB_YIQ = Format$(Y, "0.000") + "," + Format$(I, "0.000") + "," + Format$(Q, "0.000") 18 End Function

Page 78: Algoritma Transformasi Ruang Warna.pdf

73  

0 Private Function YIQ_RGB(YIQ As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = Split(YIQ, ",") 5 If UBound(strData) >= 2 Then 6 Dim Y As Double, I As Double, Q As Double 7 8 Y = CDbl(strData(0)) 9 I = CDbl(strData(1)) 10 Q = CDbl(strData(2)) 11 12 R = Y + (0.9563 * I) + (0.621 * Q) 13 R = Round(R * 255) 14 G = Y - (0.2721 * I) - (0.6474 * Q) 15 G = Round(G * 255) 16 B = Y - (1.107 * I) + (1.7046 * Q) 17 B = Round(B * 255) 18 End If 19 20 YIQ_RGB = Format$(R, "###") + "," + Format$(G, "###") + "," + Format$(B, "###") 21 End Function II.13.B VISUAL BASIC.NET 0 Private Function RGB_YIQ(ByVal RGB As String) As String 1 Dim strData() As String 2 Dim Y As Double, I As Double, Q As Double 3 4 strData = RGB.Split(",") 5 If strData.Length >= 3 Then 6 Dim R As Double, G As Double, B As Double 7 8 R = CDbl(strData(0)) / 255 9 G = CDbl(strData(1)) / 255 10 B = CDbl(strData(2)) / 255 11 12 Y = (0.299 * R) + (0.587 * G) + (0.114 * B) 13 I = (0.595716 * R) - (0.274453 * G) - (0.321263 * B) 14 Q = (0.211456 * R) - (0.522591 * G) + (0.311135 * B) 15 End If 16 17 Return Y.ToString("0.000") + "," + I.ToString("0.000") + _ 18 "," + Q.ToString("0.000") 19 End Function 0 Private Function YIQ_RGB(ByVal YIQ As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = YIQ.Split(",")

Page 79: Algoritma Transformasi Ruang Warna.pdf

74  

5 If UBound(strData) >= 2 Then 6 Dim Y As Double, I As Double, Q As Double 7 8 Y = CDbl(strData(0)) 9 I = CDbl(strData(1)) 10 Q = CDbl(strData(2)) 11 12 R = Y + (0.9563 * I) + (0.621 * Q) 13 R = Math.Round(R * 255) 14 G = Y - (0.2721 * I) - (0.6474 * Q) 15 G = Math.Round(G * 255) 16 B = Y - (1.107 * I) + (1.7046 * Q) 17 B = Math.Round(B * 255) 18 End If 19 20 Return R.ToString("###") + "," + G.ToString("###") + _ 21 "," + B.ToString("###") 22 End Function II.13.C C# 0 private string RGB_YIQ(string RGB) 1 { 2 string[] strData; 3 double Y = 0, I = 0, Q = 0; 4 5 strData = RGB.Split(','); 6 if (strData.Length >= 3) 7 { 8 double R, G, B; 9 10 R = double.Parse(strData[0]) / 255; 11 G = double.Parse(strData[1]) / 255; 12 B = double.Parse(strData[2]) / 255; 13 14 Y = (0.299 * R) + (0.587 * G) + (0.114 * B); 15 I = (0.595716 * R) - (0.274453 * G) - (0.321263 * B); 16 Q = (0.211456 * R) - (0.522591 * G) + (0.311135 * B); 17 } 18 19 return Y.ToString("0.000") + "," + I.ToString("0.000") + 20 "," + Q.ToString("0.000"); 21 } 0 private string YIQ_RGB(string YIQ) 1 { 2 string[] strData; 3 double R = 0, G = 0, B = 0; 4 5 strData = YIQ.Split(','); 6 if (strData.Length >= 3)

Page 80: Algoritma Transformasi Ruang Warna.pdf

75  

7 { 8 double Y, I, Q; 9 10 Y = double.Parse(strData[0]); 11 I = double.Parse(strData[1]); 12 Q = double.Parse(strData[2]); 13 14 R = Y + (0.9563 * I) + (0.621 * Q); 15 R = Math.Round(R * 255); 16 G = Y - (0.2721 * I) - (0.6474 * Q); 17 G = Math.Round(G * 255); 18 B = Y - (1.107 * I) + (1.7046 * Q); 19 B = Math.Round(B * 255); 20 } 21 22 return R.ToString("###") + "," + G.ToString("###") + 23 "," + B.ToString("###"); 24 } II.13.D JAVA 0 private String RGB_YIQ(String RGB) 1 { 2 String[] strData; 3 String strRet = ""; 4 double Y=0, I=0, Q=0; 5 6 strData = RGB.split(","); 7 if (strData.length >= 2) 8 { 9 double R, G, B; 10 11 R = Double.parseDouble(strData[0]) / 255; 12 G = Double.parseDouble(strData[1]) / 255; 13 B = Double.parseDouble(strData[2]) / 255; 14 15 Y = (0.299 * R) + (0.587 * G) + (0.114 * B); 16 I = (0.595716 * R) - (0.274453 * G) - (0.321263 * B); 17 Q = (0.211456 * R) - (0.522591 * G) + (0.311135 * B); 18 19 java.text.DecimalFormat df = new java.text.DecimalFormat ("0.000"); 20 strRet = df.format(Y) + "," + df.format(I) + "," + df.format(Q); 21 } 22 return strRet; 23 } 0 private static String YIQ_RGB(String YIQ) 1 { 2 String[] strData; 3 String strRet = ""; 4 double R=0, G=0, B=0; 5 strData = YIQ.split(",");

Page 81: Algoritma Transformasi Ruang Warna.pdf

76  

6 if (strData.length >= 2) 7 { 8 double Y, I, Q; 9 10 Y = Double.parseDouble(strData[0]); 11 I = Double.parseDouble(strData[1]); 12 Q = Double.parseDouble(strData[2]); 13 14 R = Y + (0.9563 * I) + (0.621 * Q); 15 R = Math.round(R * 255); 16 G = Y - (0.2721 * I) - (0.6474 * Q); 17 G = Math.round(G * 255); 18 B = Y - (1.107 * I) + (1.7046 * Q); 19 B = Math.round(B * 255); 20 21 java.text.DecimalFormat df = new java.text.DecimalFormat ("###"); 22 strRet = df.format(R) + "," + df.format(G) + "," + df.format(B); 23 } 24 return strRet; 25 } Pengiriman parameter ke function/method RGB_YIQ diatas adalah nilai RGB contoh : 65,27,234. Output dari function/method ini akan berupa data YIQ bertipe string, contoh : 0.243, -0.172, 0.284. Dan juga sebaliknya untuk function/method YIQ_RGB menerima parameter nilai YIQ, dan mengembalikan nilai berupa data RGB. II.14 TRANSFORMASI RGB KE YCbCr DAN YCbCr KE RGB YCbCr (256 level) dapat diperoleh dari RGB dengan menggunakan rumus berikut (Hamilton,1992) : Y = 0.299 R + 0.587 G + 0.114 B Cb = - 0.1687 R - 0.3313 G + 0.5 B + 128 Cr = 0.5 R - 0.4187 G - 0.0813 B + 128 Sedangkan untuk konversi YCbCr ke RGB dapat dilakukan dengan rumus berikut (Hamilton,1992) : R = Y + 1.402 (Cr - 128) G = Y - 0.34414 (Cb - 128) - 0.71414 (Cr - 128) B = Y + 1.772 (Cb - 128) Berdasarkan rumus transformasi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut :

Page 82: Algoritma Transformasi Ruang Warna.pdf

77  

II.14.A VISUAL BASIC 6 0 Private Function RGB_YCbCr(RGB As String) As String 1 Dim strData() As String 2 Dim Y As Double, Cb As Double, Cr As Double 3 4 strData = Split(RGB, ",") 5 If UBound(strData) >= 2 Then 6 Dim R As Double, G As Double, B As Double 7 8 R = CDbl(strData(0)) / 255 9 G = CDbl(strData(1)) / 255 10 B = CDbl(strData(2)) / 255 11 12 Y = (0.299 * R) + (0.587 * G) + (0.114 * B) 13 Cb = (-0.1687 * R) - (0.3313 * G) + (0.5 * B) + 128 14 Cr = (0.5 * R) - (0.4187 * G) - (0.0813 * B) + 128 15 End If 16 RGB_YCbCr = Format$(Y, "0.000") + "," + Format$(Cb, "0.000") + "," + Format$(Cr, "0.000") 17 End Function 0 Private Function YCbCr_RGB(YCbCr As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = Split(YCbCr, ",") 5 If UBound(strData) >= 2 Then 6 Dim Y As Double, Cb As Double, Cr As Double 7 8 Y = CDbl(strData(0)) 9 Cb = CDbl(strData(1)) 10 Cr = CDbl(strData(2)) 11 R = Y + (1.402 * (Cr - 128)) 12 R = Round(R * 255) 13 G = Y - (0.34414 * (Cb - 128)) - (0.71414 * (Cr - 128)) 14 G = Round(G * 255) 15 B = Y + (1.772 * (Cb - 128)) 16 B = Round(B * 255) 17 End If 18 19 YCbCr_RGB = Format$(R, "###") + "," + Format$(G, "###") + "," + Format$(B, "###") 20 End Function II.14.B VISUAL BASIC.NET 0 Private Function RGB_YCbCr(ByVal RGB As String) As String 1 Dim strData() As String 2 Dim Y As Double, Cb As Double, Cr As Double 3 4 strData = RGB.Split(",") 5 If strData.Length >= 3 Then

Page 83: Algoritma Transformasi Ruang Warna.pdf

78  

6 Dim R As Double, G As Double, B As Double 7 8 R = CDbl(strData(0)) / 255 9 G = CDbl(strData(1)) / 255 10 B = CDbl(strData(2)) / 255 11 12 Y = (0.299 * R) + (0.587 * G) + (0.114 * B) 13 Cb = (-0.1687 * R) - (0.3313 * G) + (0.5 * B) + 128 14 Cr = (0.5 * R) - (0.4187 * G) - (0.0813 * B) + 128 15 End If 16 17 Return Y.ToString("0.000") + "," + Cb.ToString("0.000") + _ 18 "," + Cr.ToString("0.000") 19 End Function 0 Private Function YCbCr_RGB(ByVal YCbCr As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = YCbCr.Split(",") 5 If UBound(strData) >= 2 Then 6 Dim Y As Double, Cb As Double, Cr As Double 7 8 Y = CDbl(strData(0)) 9 Cb = CDbl(strData(1)) 10 Cr = CDbl(strData(2)) 11 12 R = Y + (1.402 * (Cr - 128)) 13 R = Math.Round(R * 255) 14 G = Y - (0.34414 * (Cb - 128)) - (0.71414 * (Cr - 128)) 15 G = Math.Round(G * 255) 16 B = Y + (1.772 * (Cb - 128)) 17 B = Math.Round(B * 255) 18 End If 19 20 Return R.ToString("###") + "," + G.ToString("###") + _ 21 "," + B.ToString("###") 22 End Function II.14.C C# 0 private string RGB_YCbCr(string RGB) 1 { 2 string[] strData; 3 double Y = 0, Cb = 0, Cr = 0; 4 5 strData = RGB.Split(','); 6 if (strData.Length >= 3) 7 { 8 double R, G, B; 9 10 R = double.Parse(strData[0]) / 255;

Page 84: Algoritma Transformasi Ruang Warna.pdf

79  

11 G = double.Parse(strData[1]) / 255; 12 B = double.Parse(strData[2]) / 255; 13 14 Y = (0.299 * R) + (0.587 * G) + (0.114 * B); 15 Cb = (-0.1687 * R) - (0.3313 * G) + (0.5 * B) + 128; 16 Cr = (0.5 * R) - (0.4187 * G) - (0.0813 * B) + 128; 17 } 18 19 return Y.ToString("0.000") + "," + Cb.ToString("0.000") + 20 "," + Cr.ToString("0.000"); 21 } 0 private string YCbCr_RGB(string YCbCr) 1 { 2 string[] strData; 3 double R = 0, G = 0, B = 0; 4 5 strData = YCbCr.Split(','); 6 if (strData.Length >= 3) 7 { 8 double Y, Cb, Cr; 9 10 Y = double.Parse(strData[0]); 11 Cb = double.Parse(strData[1]); 12 Cr = double.Parse(strData[2]); 13 14 R = Y + (1.402 * (Cr - 128)); 15 R = Math.Round(R * 255); 16 G = Y - (0.34414 * (Cb - 128)) - (0.71414 * (Cr - 128)); 17 G = Math.Round(G * 255); 18 B = Y + (1.772 * (Cb - 128)); 19 B = Math.Round(B * 255); 20 } 21 22 return R.ToString("###") + "," + G.ToString("###") + 23 "," + B.ToString("###"); 24 } II.14.D JAVA 0 private static String RGB_YCbCr(String RGB) 1 { 2 String[] strData; 3 String strRet = ""; 4 double Y=0, Cb=0, Cr=0; 5 6 strData = RGB.split(","); 7 if (strData.length >= 2) 8 { 9 double R, G, B; 10 11 R = Double.parseDouble(strData[0]) / 255;

Page 85: Algoritma Transformasi Ruang Warna.pdf

80  

12 G = Double.parseDouble(strData[1]) / 255; 13 B = Double.parseDouble(strData[2]) / 255; 14 Y = (0.299 * R) + (0.587 * G) + (0.114 * B); 15 Cb = (-0.1687 * R) - (0.3313 * G) + (0.5 * B) + 128; 16 Cr = (0.5 * R) - (0.4187 * G) - (0.0813 * B) + 128; 17 18 java.text.DecimalFormat df = new java.text.DecimalFormat ("0.000"); 19 strRet = df.format(Y) + "," + df.format(Cb) + "," + df.format(Cr); 20 } 21 return strRet; 22 } 0 private String YCbCr_RGB(String YCbCr) 1 { 2 String[] strData; 3 String strRet = ""; 4 double R=0, G=0, B=0; 5 6 strData = YCbCr.split(","); 7 if (strData.length >= 2) 8 { 9 double Y, Cb, Cr; 10 11 Y = Double.parseDouble(strData[0]); 12 Cb = Double.parseDouble(strData[1]); 13 Cr = Double.parseDouble(strData[2]); 14 15 R = Y + (1.402 * (Cr - 128)); 16 R = Math.round(R * 255); 17 G = Y - (0.34414 * (Cb - 128)) - (0.71414 * (Cr - 128)); 18 G = Math.round(G * 255); 19 B = Y + (1.772 * (Cb - 128)); 20 B = Math.round(B * 255); 21 22 java.text.DecimalFormat df = new java.text.DecimalFormat ("###"); 23 strRet = df.format(R) + "," + df.format(G) + "," + df.format(B); 24 } 25 return strRet; 26 } Pengiriman parameter ke function/method RGB_YCbCr diatas adalah nilai RGB contoh : 65, 27, 234. Output dari function/method ini akan berupa data YCbCr bertipe string, contoh : 251.13, 0.756, 0.4257. Dan juga sebaliknya untuk function/method YCbCr_RGB menerima parameter nilai YCbCr, dan mengembalikan nilai berupa data RGB.

Page 86: Algoritma Transformasi Ruang Warna.pdf

81  

DAFTAR PUSTAKA Cuturicu, C., 1999, A note about the JPEG decoding algorithm, http:// www.opennet.ru/ docs/ formats/ jpeg.txt. Ford, A., dan Roberts, A., Agustus 1998, Colour Space Conversions,http:// www.inforamp.net/ ~poynton/ PDFs/ coloureq.pdf. Gonzales and Woods, Digital Image Processing, 1st ed, Addison-Wesley, 1992. Hamilton, E., September 1992, JPEG File Interchange Format, Version 1.02. http:// www.w3.org/ Graphics/ JPEG/ jfif.txt. HSL and HSV, http://en.wikipedia.org/wiki/HSL_color_space. M. Sarifuddin and Rokia Missaoui, HCL: a new Color Space for a more Effective Content-based Image Retrieval, RESEARCH REPORT D´epartement d’informatique et d’ing´enierie, Universit´e du Qu´ebec en Outaouais, C.P. 1250, Succ. B, Gatineau (Qc), Canada, J8X 3X7., 2005 RGB Color Model, http://en.wikipedia.org/wiki/RGB_color_model.

Page 87: Algoritma Transformasi Ruang Warna.pdf

82  

LAMPIRAN A MENGAMBIL NILAI RGB DARI CITRA

VISUAL BASIC 6 Private Declare Function GetPixel Lib "GDI32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long) As Long 0 Private Function GetRGBFromPos(pict As PictureBox, Width As Long, Height As Long) 1 Dim pixel As Long 2 Dim Red As Long, Green As Long, Blue As Long 3 Dim strRGB As String 4 5 pixel = GetPixel(pict.hDC, Width, Height) 6 'pixel = pict.Point(J, I) 7 Red = pixel And 255 8 Green = (pixel \ 256) And 255 9 Blue = (pixel \ 65536) And 255 10 11 GetRGBFromPos = CStr(Red) + ", " + CStr(Green) + ", " + CStr(Blue) 12 End Function Prosedur diatas akan mendapatkan nilai RGB yang disimpan ke variabel Red, Green dan Blue (di baris 7, 8 dan 8). Data citra diambil dari kontrol PictureBox. GetPixel adalah fungsi API untuk mengambil data pixel, yang berjalan lebih cepat dibandingkan dengan fungsi standard PictureBox pict.Point(J, I).

Page 88: Algoritma Transformasi Ruang Warna.pdf

83  

VISUAL BASIC.NET 0 Private Function GetRGBFromPos(ByVal filename As String, ByVal Width As Integer, _ 1 ByVal Height As Integer) As String 2 Dim myBitmap As Bitmap = New Bitmap(filename) 3 4 If (Height > myBitmap.Height) Then Height = myBitmap.Height - 1 5 If (Width > myBitmap.Width) Then Width = myBitmap.Width - 1 6 7 Dim pixelColor As Color = myBitmap.GetPixel(Width, Height) 8 9 Return pixelColor.R.ToString() + ", " + pixelColor.G.ToString() + _ 10 ", " + pixelColor.B.ToString() 11 End Function

C# 0 private string GetRGBFromPos(string filename, int Width, int Height) 1 { 2 Bitmap myBitmap = new Bitmap(filename); 3 if (Height > myBitmap.Height) Height = myBitmap.Height-1; 4 if (Width > myBitmap.Width) Width = myBitmap.Width-1; 5 6 Color pixelColor = myBitmap.GetPixel(Width, Height); 7 8 return pixelColor.R.ToString() + ", " + pixelColor.G.ToString() + 9 ", " + pixelColor.B.ToString(); 10 } Prosedur diatas (Visual Basic.Net dan C#) akan mendapatkan nilai RGB yang disimpan ke variabel Red, Green dan Blue (di baris 8). Data citra diambil dari file. Ukuran citra yang sebenarnya terdapat di variabel myBitmap.Height dan myBitmap.Width seperti di baris 3 dan 4. Parameter filename (baris 0) adalah nama lengkap dari file citra, misalnya c:\gambar\gambar1.jpg untuk visual basic.net dan c:\\gambar\\gambar1.jpg, untuk c#.

Page 89: Algoritma Transformasi Ruang Warna.pdf

84  

JAVA 0 private String GetRGBFromPos(String filename, int x, int y) 1 { 2 int red =0, green=0, blue=0, color=0; 3 try 4 { 5 java.io.File file= new java.io.File(filename); 6 7 java.awt.image.BufferedImage image = 8 javax.imageio.ImageIO.read(file); 9 10 color = image.getRGB(x,y); 11 12 red = (color & 0x00ff0000) >> 16; 13 green = (color & 0x0000ff00) >> 8; 14 blue = color & 0x000000ff; 15 } 16 catch(Exception ex) { } 17 18 return String.valueOf(red) + ", " + String.valueOf(green) + 29 ", " + String.valueOf(blue); 30 } Prosedur diatas akan mendapatkan nilai RGB yang disimpan ke variabel Red, Green dan Blue (di baris 12, 13 dan 14). Data citra diambil dari file. Parameter filename (baris 0) adalah nama lengkap dari file citra, misalnya c:\\gambar\\gambar1.jpg.

Page 90: Algoritma Transformasi Ruang Warna.pdf

85  

LAMPIRAN B TAMPILAN PROJECT

PROJECT TRANSFORMASI WARNA DI VISUAL BASIC 6

PROJECT TRANSFORMASI WARNA DI VISUAL BASIC.NET

Page 91: Algoritma Transformasi Ruang Warna.pdf

86  

PROJECT TRANSFORMASI WARNA DI C#

PROJECT TRANSFORMASI WARNA DI JAVA

Program-program diatas tersedia secara lengkap dalam CD yang disertakan di buku ini.

Page 92: Algoritma Transformasi Ruang Warna.pdf

87  

ERICKS RACHMAT SWEDIA, ST, MMSI PERSONAL DATA Alamat : Pondok Bambu Kuning Blok B1/7, Bojonggede, Bogor. Telepon : 087878020802 Email : [email protected] Posisi : Wakil Kepala sub Bagian Pengembangan Sistem, Universitas Gunadarma TEACHING EXPERIENCES Algoritma dan Pemrograman I, Universitas Gunadarma (2009) Konsep Data Mining, Universitas Gunadarma (2009) Pengantar Kecerdasan Buatan, Universitas Gunadarma (2010) Pengolahan Paralel, Universitas Gunadarma (2009) Sistem Basis Data I, Universitas Gunadarma (2009) INTERNATIONAL CERTIFICATION 2005 Microsoft Certified Professional in Developing Windows Applications with Visual Basic.NET. 2005 Microsoft Certified Professional in Developing XML Web Services with Visual Basic.NET. 2005 Microsoft Certified Professional in Implementing and Designing SQL Server. 2005 Microsoft Certified Professional in Developing Web Applications with Visual Basic.NET. 2005 Microsoft Certified Applications Developer (MCAD.NET) FORMAL EDUCATION 2005-2008 Master of Information System Management at Gunadarma University.

Thesis : Design and Analysis Project Monitoring Control System at PT. Jalan Tol Seksi Empat Makassar.

1994-1999 Bachelor Degree at Gunadarma University, Faculty of Industry Technology, Department of Information Technique. Thesis :

Designing and Programming The Deterministic Turing Machine Simulator

Page 93: Algoritma Transformasi Ruang Warna.pdf

88  

PROJECTS EXPERIENCE 2000 Developed Chief Election Application for KOPERTIS III Jakarta with Windows Socket (TCP/IP).

Part of a team in developing Project Monitoring Information System for Departemen Dalam Negeri Indonesia. Part of a team in developing Investment Information System for Departemen Dalam Negeri Indonesia. Part of a team in developing Voucher System Application for IT Division PT. Bristol Myers Squibb Indonesia Tbk.

2001 Developed Exam Application for Gunadarma University. Part of a team in Analyze Technological and Professional Skill Development Project for Dirjen Pendidikan Tinggi (DIKTI) Indonesia. Developed Transcript Application and System for Gunadarma University.

2002 Developed Product Scheduler Application for PPIC Division PT. Bristol Myers Squibb Indonesia Tbk. Developed Task Remainder Application for PPIC Division PT. Bristol Myers

Squibb Indonesia Tbk. Developed Asessment Result Application for Human Resource division, Departement Kehutanan Republik Indonesia.

2004 Developed Sales-Distributor Report Application for Sales Division PT. Nestle Indonesia. 2005 Developed Academic Application for Gunadarma University.

Developed Radio Application and System for Megaswara Radio (Bogor, Serang, Sukabumi, Kuningan).

2006 Developed Malaysian Derivative Exchange Interpreter for Bernama with TCP/IP and Serial Communications (COMM). Developed Kuala Lumpur Stock Exchange Interpreter for Bernama with Serial Communications (COMM). Developed Unit Trust Web Application for Bernama.

2007 Developed Academic Application for Akademi Kebidanan Gunadarma University.

Developed Chess Application for Gunadarma University. Developed Project Monitoring Control System for PT. Jalan Tol Seksi IV -

Makassar. Developed Crude Oil Import Monitoring for Crude & Intermediate Procurement Department PT. Pertamina - Jakarta.

2009 Developed Report Management for MetroTV. 2010 Developed Oil Publication for PT. Pertamina - Jakarta. I hereby certify that the information given above is true. Under any circumstances where misrepresentation or omission of information is found, I understand that I shall be fully responsible.

Page 94: Algoritma Transformasi Ruang Warna.pdf

89  

MARGI CAHYANTI, SKom, MMSI PERSONAL DATA Alamat : Pondok Bambu Kuning Blok B1/7, Bojonggede, Bogor. Telepon : 087878020820 Email : [email protected] Posisi : Kepala Bagian Ujian Mandiri, Universitas Gunadarma Alamat Kantor : Jl. Margonda Raya No. 100 Depok Telepon Kantor : 021-78881112 ext. 501 TEACHING EXPERIENCES Algoritma Pemrograman I, STMIK Gunadarma (1993 - 1995) Pemrograman Pascal I, STMIK Gunadarma (1993 - 1995) Pengantar Komputer dan TI II, Universitas Gunadarma (2000 - 2002) Teknik Pemrograman Terstruktur I, Universitas Gunadarma (2006 - Now) Teknik Pemrograman Terstruktur II, Universitas Gunadarma (2006 - Now)


Recommended