星期五, 12月 22, 2006

膚色切割器

膚色分割通常是做人臉辦識最重要的一件事,
要是沒先把膚色給分類出來並加以定位人臉的的位置, 
則會影響接下來的辨識結果.


切割膚色有很多的分法,這個切割器我是使用ycbcr的方法來做為偵察.
為什麼使用ycbcr呢:

因為RGB的色彩空間很容易受到光源的影響而有明顯的變化,

而使在設定顏色的分割值,會有很大的大的誤差.
又因為ycbcr有良好的亮度和色度分離的特特(彩度)所以我就使用它.

在此Y 代表亮度,Cb和CR都代表色度(彩度) 轉換公式如下

但在matlab你不用建立上式,只要打rgb2ycbcr('檔案')轉換就可以了


%----程式碼-----

clear all
close all
clc
a=imread('nomo.jpg'); % 輸入影像

b=rgb2ycbcr(a); % 轉換成ycbcr
cb=b(:,:,2);
cr=b(:,:,3);

cb(cb<=125)=255; % cb的判斷式,是膚色為白色
cb(cb~=255)=0;
figure(1);imshow(cb)

cr(cr>=137)=255; % cr的判斷式,是膚色為白色
cr(cr~=255)=0;
figure(2);imshow(cr)

rr=and(cr,cb); % 找出二者都是白的
rt(:,:,1)=double(rr).*double(a(:,:,1));
rt(:,:,2)=double(rr).*double(a(:,:,2));
rt(:,:,3)=double(rr).*double(a(:,:,3));
figure(3);imshow(uint8(rt))


%--------------結果----------
原影像圖,如下

分割後的cb影像,如下

分割後的cr影像,如下

只秀出膚色圖


以上就是建立膚色切割器的基礎公式
由上方的圖可知,這些影像還一些小雜點,在這我用形態學中的Opening operation來消除雜點
雜訊去除

形態學
Opening(斷開)運算:
opening運算是先被侵蝕後再膨脹,通常是用來平滑影像輪廓,截斷窄的細頸,消除細的突支,
其原理如下:
(一)膨脹:將物體的邊界往外膨脹若干像素的方法。 如下圖:

(二)侵蝕:與膨脹相反的動作,這是一種從物體的邊界上,將物體往內收縮若干像素。
如下圖:

斷開圖如下

標記法:
兩像素間關係有下述兩種性質:
(一)像素的近鄰(neighbors):
在座標(x,y)處的像素P有水平和垂直方向的近鄰,其座標為
(x-1,y),(x+1,y),(x,y+1),(x,y-1),
這樣一組像素稱P點的4-近鄰(4-nieghbors)。

P的四個對角近鄰的座標為(x-1,y+1),(x+1,y+1),(x-1,y-1),(x+1,y-1),
這些點與4-近鄰在一起,稱為P的8-近鄰(8-neighbors)。

(二)連通性(Connectivity):
像素間的連通性是用於確定影像中物體邊界和區域組成成分的重要概念。
要判斷兩個像素是否連通,必須要確定它們是否在某種意義中相鄰(如它們是否為4-近鄰),
並且它們的灰度值是否滿足特定的相似準則,(如灰度值是否相同)。
在此我們用V來定義連通性的灰階集合,並介紹二種類型的連通:
(a)4-連通:
若某一像素Q 位於4-近鄰( P)中,且Q和P的像素值位於所定的灰度值(V)中,則稱4-連通。
(b)8-連通:
若某一像素Q位於8-近鄰( P)中,且Q和P的像素值位於所定的灰度值(V)中,則稱8-連通。

(三)標記法原理:
標記法是使用在二值化影像,白色為255,黑色為0,p表掃描過程中之像素值;
先由左而右,再由上而下掃描影像,在此只考慮4-連通分量。
當掃描到為0的時則移動到下一掃描位置,當掃描到p為255的,並根據其連通性檢查p點的左方和上方,
如果它們均為0的為話,給p一個新的標記值,如果這二個近鄰中只有一個為255,
則把它的標記給予p,如果它們都是255且標記相同,則把這個標記給予p。
如果它們都是255但標記不同,則把其中一個標記給予p,並標明這兩個標記是等價的。
掃描結束後所有值為255的點都被標記過了,但有些標記是可能是等價的,
所以再對影像作第二次掃描,將所有被記錄為等價的標記值改成相同的標記。

新增加的程式碼

se=strel('disk',2);%用open過濾膚色圖像
bw= imopen(rr,se);
figure(4);imshow(bw)

%用open過濾後的圖,再用標記法來找出最大區塊
l=bwlabel(bw,8); % 標記法

stats=regionprops(l,'Area'); % 找出相同的並統計
allArea=[stats.Area];
tt=max(allArea); % 找出最大的區塊
idx=find(allArea==tt);
bw2=ismember(l,idx);
figure(5);imshow(bw2)%過濾後的人臉圖像
%----------------------------------------------------
GUIDE
首先把一張rgb的照片轉成ycbcr(y代表亮度,cb代表色度(blueness),cr也代表色度(redness))
然後我們可以使用slider來調整y cb cr的範圍,使它只出現膚色的範圍
即可達到膚色分割了




1 則留言:

匿名 提到...

不好意思!我在這有看到你有做一個膚色切割器,我本來想download下來用看看的,可是檔案已經失連了,可以麻煩你再傳上來嗎?
或是寄到我的信箱裡,真的很不好意思哦!!
如果太麻煩那就不用了,謝謝你!
E-mail:
asia0704@hotmail.com

花蓮的海豚

花蓮的海豚