Pengolahan Video untuk Mendeteksi Warna Kulit


Deteksi warna kulit dapat dilakukan dengan cara melakukan transformasi ruang warna citra. Berikut ini merupakan contoh pemrograman matlab mengenai deteksi warna kulit pada ruang warna YCbCr yang terdiri dari luminance (Y) dan chrominance (Cb dan Cr). Langkah-langkah pemrogramannya adalah sebagai berikut:
1. Membaca video asli
2. Mengekstrak setiap frame pada video asli
3. Melakukan transformasi ruang warna citra yang semula berada pada ruang warna RGB menjadi ruang warna YCbCr
4. Melakukan segmentasi warna kulit pada ruang warna YCbCr berdasarkan nilai Y (20 s.d 60), Cb (117 s.d 127) dan Cr (133 s.d 153)
5. Menjalankan seluruh frame hasil pengolahan secara sekuensial dalam bentuk video

Pada contoh ini digunakan video dengan spesifikasi:

Property Nilai
Title Maze Runner The Scorch Trials 2015.mp4
Durasi 10 detik
Panjang frame 640
Lebar frame 480
Frame rate 23 frame/ detik
Jumlah frame 246

Tampilan video yang digunakan yaitu

Sedangkan tampilan source code pengolahan video adalah:

clc;clear;close all;warning off all;

vid = VideoReader('Maze Runner The Scorch Trials 2015.mp4');

vidWidth = vid.Width;
vidHeight = vid.Height;
vidFrameRate = vid.FrameRate;

mov = struct('cdata',zeros(vidHeight,vidWidth,3,'uint8'),...
    'colormap',[]);

k = 1;
while hasFrame(vid)
    Img = readFrame(vid);
    out = uint8(zeros(size(Img,1), size(Img,2), size(Img,3)));
    
    %R,G,B components of the input image
    R = Img(:,:,1);
    G = Img(:,:,2);
    B = Img(:,:,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);
    Y = img_ycbcr(:,:,1);
    Cb = img_ycbcr(:,:,2);
    Cr = img_ycbcr(:,:,3);
    
    %Detect Skin
    [r,c,v] = find(Y>=20 & Y<=60 & Cb>=117 & Cb<=127 & Cr>=133 & Cr<=153);
    numind = size(r,1);
    
    bin = false(size(Img,1), size(Img,2));
    
    %Mark Skin Pixels
    for i=1:numind
        bin(r(i),c(i)) = 1;
    end
    
    bin = imfill(bin,'holes');
    bin = bwareaopen(bin,4000);
    str = strel('disk',10);
    bin = imdilate(bin,str);
    
    stats = regionprops(bin,'All');
    bbox = cat(1, stats.BoundingBox);
    RGB = insertShape(Img,'rectangle',bbox,'color','yellow','LineWidth',5);
    mov(k).cdata = RGB;
    
    k = k+1;
end

hf = figure;
set(hf,'position',[150 150 vidWidth vidHeight]);

movie(hf,mov,1,vidFrameRate);

Langkah-langkah pengolahan pada setiap frame adalah sebagai berikut:
1. Membaca frame citra

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, Cb, 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 Y (20 s.d 60), Cb (117 s.d 127) dan Cr (133 s.d 153) sehingga diperoleh citra biner

6. Melakukan operasi morfologi filling holes

7. Menghilangkan object yang luasnya kurang dari 4000 piksel. Proses tersebut dilakukan dengan tujuan untuk menghilangkan noise

8. Melakukan operasi morfologi dilasi untuk menyempurnakan hasil segmentasi

9. Citra biner hasil operasi morfologi di atas kemudian dijadikan sebagai masking untuk memvisualisasikan bounding box pada frame citra asli

Sedangkan hasil pengolahan frame yang diperoleh ditunjukkan pada tabel berikut ini:

Urutan frame Frame asli Frame hasil pengolahan
1
60    
120    
180    
240    

Tampilan video hasil pengolahan yaitu

Video dan source code pada pemrograman di atas dapat diperoleh pada halaman berikut ini: Source Code

Posted on December 18, 2016, in Pengolahan Video and tagged , , , , , , , , , , , , , , , , , , , . Bookmark the permalink. 1 Comment.

  1. Permisi kak mau tanya, kalau untuk merubah frame yg telah ubah menjadi kebentuk video lagi, lalu di imshow, caranya gimana kak?

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 )

Google+ photo

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

Twitter picture

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

Facebook photo

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

Connecting to %s

%d bloggers like this: