Pengolahan Citra untuk Deteksi Warna Kulit (Skin Detection)


Deteksi warna kulit (skin color detection) merupakan salah satu proses segmentasi yang memisahkan region objek dalam citra berdasarkan pada perbedaan warna. Objek yang memiliki warna tertentu dipisahkan dengan objek yang memiliki warna lainnya. Hasil segmentasi dapat digunakan untuk proses selanjutnya seperti ekstraksi ciri atau klasifikasi citra. Pada contoh ini, warna kulit didefiniskan dalam ruang warna  YCbCr dengan nilai Cb antara 77 s.d 127 dan nilai Cr antara 133 s.d 173.

Deteksi warna kulit merupakan salah satu tahapan awal dalam computer vision untuk mendeteksi hal-hal yang berkaitan dengan manusia (people detection). Deteksi warna kulit dapat dijadikan sebagai metode segmentasi  untuk pengenalan wajah (face recognition) maupun pengenalan organ tubuh lainnya. Sistem tersebut dapat dikembangkan lebih lanjut untuk sistem biometrik.

Langkah-langkah proses segmentasi warna kulit adalah sebagai berikut:
1. Melakukan penyeimbangan warna RGB (Color Balanced 24-bit RGB Image)
2. Melakukan transformasi ruang warna RGB menjadi YCbCr
3. Melakukan segmentasi warna kulit berdasarkan nilai Cb antara 77 s.d 127 dan nilai Cr antara 133 s.d 173
4. Menampilkan hasil segmentasi

Hasil segmentasi ditunjukkan pada gambar berikut:

No                     Citra Asli      Hasil Deteksi Warna Kulit
1
2
3
4

Koding untuk melakukan deteksi warna kulit adalah:


% Adi Pamungkas, S.Si, M.Si
% Website: https://pemrogramanmatlab.com/
% Email  : adipamungkas@st.fisika.undip.ac.id

clc; clear; close all; warning off all;

% read the image
I = imread('image1.jpg');

out = uint8(zeros(size(I,1), size(I,2), size(I,3)));

% R,G,B components of the input image
R = I(:,:,1);
G = I(:,:,2);
B = I(:,:,3);

% Inverse of the Avg values of the R,G,B
mR = 1/(mean(mean(R)));
mG = 1/(mean(mean(G)));
mB = 1/(mean(mean(B)));

% Smallest Avg Value (MAX because we are dealing with the inverses)
maxRGB = max(max(mR, mG), mB);

% Calculate the scaling factors
mR = mR/maxRGB;
mG = mG/maxRGB;
mB = mB/maxRGB;

% Scale the values
out(:,:,1) = R*mR;
out(:,:,2) = G*mG;
out(:,:,3) = B*mB;

% Convert the image from RGB to YCbCr
img_ycbcr = rgb2ycbcr(out);
Cb = img_ycbcr(:,:,2);
Cr = img_ycbcr(:,:,3);

% Detect Skin
[r,c,v] = find(Cb>=77 & Cb<=127 & Cr>=133 & Cr<=173);
numind = size(r,1);

bin = false(size(I,1), size(I,2));

% Mark Skin Pixels
for i=1:numind
    bin(r(i),c(i)) = 1;
end

bin = imfill(bin,'holes');
R(~bin) = 0;
G(~bin) = 0;
B(~bin) = 0;
out = cat(3,R,G,B);

imshow(I);
figure; imshow(out);


Koding tersebut merupakan modifikasi dari koding yang diunggah oleh Gaurav Jain pada http://www.mathworks.com/matlabcentral/fileexchange/28565-skin-detection

Langkah-langkah pengolahan citra untuk mendeteksi warna kulit adalah:
1. Membaca citra asli

2. Melakukan normalisasi citra RGB

3. Melakukan transformasi ruang warna citra yang semula berada pada ruang warna RGB menjadi ruang warna YCbCr

4. Tampilan masing-masing kanal Y, Cr, dan Cr
Kanal Luminance (Y)

Kanal Chrominance (Cb) yang merepresentasikan perbedaan antara komponen biru dan nilai referensi

Kanal Chrominance (Cr) yang merepresentasikan perbedaan antara komponen merah dan nilai referensi

5. Melakukan segmentasi warna kulit pada ruang warna YCbCr berdasarkan nilai Cb antara 77 s.d 127 dan nilai Cr antara 133 s.d 173 sehingga diperoleh citra biner

6. Citra biner yang diperoleh kemudian dijadikan sebagai masking untuk memvisualisasikan hasil segmentasi pada citra RGB

File source code lengkap beserta citra untuk mendeteksi kulit pada pemrograman matlab di atas dapat diperoleh melalui halaman berikut ini: Source Code

Tutorial untuk melakukan deteksi warna kulit bisa dilihat pada video berikut ini:

Posted on October 10, 2016, in Pengenalan Matlab, Pengolahan Citra and tagged , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , . Bookmark the permalink. 12 Comments.

  1. assalamualikum mas adi, pada artikel ini “pengolahan citra untuk deteksi warna kulit” menggunakan metode apa ya ?

    terima kasih sebelumnya

  2. Wita Indrawati

    assalamu’alaikum mas, mau tanya cara mengkonversi dari YcrCb Citra biner yang diperoleh kemudian dijadikan sebagai masking untuk memvisualisasikan hasil segmentasi pada citra RGB itu proses source codenya bagaimana …?
    terimakasih

  3. Wita Indrawati

    apa ada yang menggunakan bahasa C# dgn library emgucv ?

  4. Wita Indrawati

    iya terimakasih mas

  5. mohon maaf mas adi. saya baru belajar menggunakan matlab. disini saya mempunyai tugas seperti berikut:

    1. upload foto
    2. cari titik yang terdapat pada citra yang mengandung warna kulit
    3. view nilai RGB titik tersebut
    4. Buat Threshold yang membatasi warna kulit dengan lainnya
    5. Tampilkan citra hasil threshold

    bagaimana mas adi caranya?
    mohon bimbingannya.. apakah sama dengan proses diatas?

  6. asslamualaikum mas, buat mencari mean mR, mG, mB, gimana ya mas?…saya coba kok ga berhasil ya

    terimakasih

  7. mas untuk flowchartnya seperti apa

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: