Skip to content Skip to sidebar Skip to footer

Ruang Warna Hue Saturation Value (HSV) serta Proses Konversinya

Warna adalah hasil persepsi dari cahaya dalam spektrum wilayah yang terlihat oleh retina mata, dan memiliki panjang gelombang antara 400nm sampai dengan 700nm. Sedangkan ruang warna adalah model matematis abstrak yang menggambarkan cara agar suatu warna dapat direpresentasikan sebagai baris angka biasanya dengan nilai-nilai dari tiga atau empat buah warna atau komponen. contohnya adalah ruang warna RGB, ruang warna CMY/CMYK, ruang warna YIQ, ruang warna YCbCr, ruang warna HSI, HSL, HSV, ruang warna CIELAB.

Sekarang, saya cukup membahas yang HSV dulu. HSV mendefinisikan warna dalam terminologi Hue, Saturation dan Value. Keuntungan HSV adalah terdapat warna-warna yang sama dengan yang ditangkap oleh indra manusia. Sedangkan warna yang dibentuk model lain seperti RGB merupakan hasil campuran dari warna-warna primer. 


Model HSV, pertama kali diperkenalkan oleh A.R Smith pada tahun 1978, yang ditunjukkan pada gambar diatas. Silakan dicermati bagaimana teman-teman menafsirkan.

Melalui model gambar diatas, kita tahu bahwa HSV memiliki 3 karakteristik pokok, yaitu Hue, Saturation dan Value. Apa yang dimaksud ketiganya? 
  • Hue : menyatakan warna sebenarnya, seperti merah, violet, dan kuning dan digunakan menentukan kemerahan (redness), kehijauan (greeness), dsb.  
  • Saturation : kadang disebut chroma, adalah kemurnian atau kekuatan warna.
  • Value : kecerahan dari warna. Nilainya berkisar antara 0-100 %. Apabila nilainya 0 maka warnanya akan menjadi hitam, semakin besar nilai maka semakin cerah dan  muncul variasi-variasi baru dari warna tersebut.
Bagaimana mengkonversi warna RGB ke HSV ? 

Saya akan menjabarkan 2 cara perhitungan, cara pertama untuk mendapatkan setiap nilai dari HSV relatif lebih sederhana yaitu : 




Kemudahan cara pertama ternyata menimbulkan permasalahan, cara pertama membuat hue tidak terdefinisi jika Saturation bernilai 0. 

Solusi kedua untuk mendapatkan setiap nilai HSV adalah menggunakan rumus kedua berikut : 


Untuk memudahkan teman-teman dalam belajar, berikut saya sertakan source code konversi RGB ke HSV didasarkan pada rumus cara kedua, dibuat dalam pemrograman Matlab agar lebih mudah. Untuk rumus cara pertama silakan buat sendiri ya !

Program : RGBkeHSV.m
function [H,S,V] = RGBkeHSV(R,G,B)
% RGBkeHSV digunakan untuk mengonversi RGB ke HSV.

% Normalisasi RGB ke [0, 1]
R = double(R);
G = double(G);
B = double(B);

if max(max(R)) > 1.0 || max(max(G)) > 1.0 || ...
   max(max(B)) > 1.0
    R = double(R) / 255;
    G = double(G) / 255;
    B = double(B) / 255;
end

[tinggi, lebar] = size(R);
for m=1: tinggi
    for n=1: lebar
        minrgb = min([R(m,n) G(m,n) B(m,n)]); 
        maxrgb = max([R(m,n) G(m,n) B(m,n)]); 
        V(m,n) = maxrgb;
        delta = maxrgb - minrgb;
        if maxrgb == 0
            S(m,n) = 0;
            H(m,n) = 0; 
        else
            S(m,n) = delta / maxrgb;
            if R(m,n) == maxrgb
                % Di antara kuning dan magenta
                H(m,n) = (G(m,n)-B(m,n)) / delta;
            elseif G(m,n) == maxrgb
                % Di antara cyan dan kuning
                H(m,n) = 2 + (B(m,n)-R(m,n)) / delta;
            else
                % Di antara magenta dan cyan
                H(m,n) = 4 + (R(m,n)-G(m,n)) / delta;
            end
            
            H(m,n) = H(m,n) * 60;
            if H(m,n) < 0
                H(m,n) = H(m,n)+360;
            end
        end
    end
end

% Konversikan ke jangkauan [0, 255] atau [0, 360]
H = uint8(H * 255/360);
S = uint8(S * 255);
V = uint8(V * 255);

Sekarang, bagaimana jika dibalik? dibalik menjadi konversi dari HSV ke RGB. No Problem, berikut source code untuk mengkonversi HSV ke RGB.

Program : HSVkeRGB.m
function [R,G,B] = HSVkeRGB(H,S,V)
% HSVkeRGB digunakan untuk mengonversi HSV ke RGB

% Normalisasi SV ke [0, 1] dan H ke [0, 360]
H = double(H);
S = double(S);
V = double(V);

if max(max(H)) > 1.0 || max(max(S)) > 1.0  || ...
   max(max(V)) > 1.0
    H = double(H) / 255 * 360;
    S = double(S) / 255;
    V = double(V) / 255;
end

[tinggi, lebar] = size(H);
for m=1: tinggi
    for n=1: lebar
        if S(m,n) == 0
            R(m,n) = V(m,n);
            G(m,n) = V(m,n);
            B(m,n) = V(m,n);
        else
            % S != 0
            
            % Menghitung posisi sektor (0 s/d 5)
            H(m,n) = H(m,n) / 60;
            sektor = floor(H(m, n)); 
            faktor = H(m,n) - sektor;
            p = V(m,n) * (1 - S(m,n));
            q = V(m,n) * (1 - S(m,n) * faktor);
            t = V(m,n) * (1 - S(m,n) * (1 - faktor));
       
            switch sektor
                case 0
                    R(m,n) = V(m,n);
                    G(m,n) = t;
                    B(m,n) = p;
                case 1
                    R(m,n) = q;
                    G(m,n) = V(m,n);
                    B(m,n) = p;
                case 2
                    R(m,n) = p;
                    G(m,n) = V(m,n);
                    B(m,n) = t;
                case 3
                    R(m,n) = p;
                    G(m,n) = q;
                    B(m,n) = V(m,n);
                case 4
                    R(m,n) = t;
                    G(m,n) = p;
                    B(m,n) = V(m,n);
                otherwise % case 5
                    R(m,n) = V(m,n);
                    G(m,n) = p;
                    B(m,n) = q;
            end
        end
    end
end

R = uint8(R * 255);
G = uint8(G * 255);
B = uint8(B * 255);

Sekian penjabaran saya tentang ruang warna Hue Saturation Value beserta proses konversinya, semoga bermanfaat bagi teman-teman (^_^)

Referensi :

  • Konversi Color Space RGB-HSV dan HSV-RGB dengan Metode Travis oleh febripuguhpermana.blogspot.com
  • Kadir, Abdul. 2013. Teori dan Aplikasi Pengolahan Citra. Yogyakarta : Andi 


Oleh



6 comments for "Ruang Warna Hue Saturation Value (HSV) serta Proses Konversinya "

  1. itu kalo RGB ke YIQ kodingannya seperti apa gan

    ReplyDelete
    Replies
    1. Baca ini
      http://www.charisfauzan.net/2017/01/konversi-ruang-warna-rgb-ke-yiq-dan-yiq.html

      Delete
  2. terimakasih gan, membantu banget penjelasannya

    ReplyDelete
  3. ada materi tentang cielab gan

    ReplyDelete
  4. saya coba kedua rumus diatas secara manual, tapi kenapa untuk hasilnya berbeda dari kedua rumus ya? apa memang seperti itu?

    ReplyDelete