【matlab 图像处理】 肤色检测
膚色檢測(cè)
膚色是人類(lèi)皮膚重要特征之一,在檢測(cè)人臉或手等目標(biāo)時(shí)常采用膚色檢測(cè)的方法,將相關(guān)區(qū)域從圖像中分割出來(lái)。
膚色檢測(cè)方法:
膚色檢測(cè)方法有很多,但無(wú)論是基于不同的色彩空間還是不同的膚色模型,其根本出發(fā)點(diǎn)在于膚色分布的聚集性,即膚色的顏色分量一般聚集在某個(gè)范圍內(nèi)。通過(guò)大量的膚色樣本進(jìn)行統(tǒng)計(jì),找出膚色顏色分量的聚集范圍或用特殊的分布模型去模擬膚色分布,進(jìn)而實(shí)現(xiàn)對(duì)任意像素顏色的判別。
本例主要采用膚色顏色分量分布范圍的方法,簡(jiǎn)要介紹膚色模型的概念。
不同彩色空間膚色分布范圍
膚色模型
膚色模型是根據(jù)大量樣本的統(tǒng)計(jì)數(shù)據(jù)建立以確定膚色的分布規(guī)律,進(jìn)而判斷像素的色彩是否屬于膚色或與膚色相似程度的模型。常用的有闕值模型、高斯模型和橢圓模型。
1)閾值模型
國(guó)值模型是用數(shù)學(xué)表達(dá)式明確膚色分布范圍的建模方法。這類(lèi)方法依據(jù)膚色分布范圍進(jìn)行檢測(cè),判斷簡(jiǎn)單、明確、快捷,但需要選擇合適的顏色空間及合適的參數(shù)。
2)高斯膚色模型
利用高斯函數(shù)模擬膚色在CbCr色度空間的分布
其實(shí),
為色度向量的均值和協(xié)方差矩陣,可通過(guò)多種方式獲取,數(shù)值略有區(qū)別,本例選擇
得到膚色分布的概率圖后,確定閾值T,如果p>T,則對(duì)應(yīng)像素點(diǎn)為膚色點(diǎn)﹔反之,為非像素點(diǎn)。可以看出,膚色檢測(cè)的精確度依賴于閾值的選擇
在下面示例中,不討論最佳閾值的確定,采用固定閾值的方法,實(shí)施效果因不同圖像而異;
3)橢圓模型
將圖像從RGB轉(zhuǎn)換到Y(jié)CbCr彩色空間,并進(jìn)行非線性分段色彩變換,變換后膚色的CbCr分布近似橢圓,經(jīng)實(shí)驗(yàn)可確定橢圓表達(dá)式的參數(shù)。對(duì)于待判斷的顏色,經(jīng)同樣的變換,若在橢圓內(nèi),則可以判斷其為膚色,否則為非膚色
- 檢測(cè)出的膚色區(qū)域存在不連續(xù)、噪聲大的特點(diǎn),往往需要利用濾波等方法,修正膚色區(qū)域,建議在后續(xù)學(xué)習(xí)過(guò)濾波方法后,改進(jìn)相應(yīng)的程序。
膚色檢測(cè)程序?qū)嵗?/strong>
clear,clc,close all; Image=imread('foreman004.jpg'); figure,imshow(Image),title('原圖'); r=double(Image(:,:,1)); % 提取紅色分量并轉(zhuǎn)化為高精度 g=double(Image(:,:,2)); b=double(Image(:,:,3)); [N,M]=size(r); % 提取矩陣r的大小 NxM miu=[117.4361 156.5599]'; % 高斯膚色模型均值 sigma=[160.1301 12.1430;12.1430 299.4574]; % 高斯膚色模型協(xié)方差矩陣 cbcr=zeros(2,1); % 生成 2x1矩陣 SkinCbCrG=zeros(N,M); % 生成所有值為0的 NxM矩陣用于存放處理后圖像 SkinRGB=zeros(N,M); SkinHSV=zeros(N,M); SkinCbCr=zeros(N,M); thresh=0.35; % 膚色概率二值化闕值 for i=1:M % 循環(huán)圖像每一個(gè)像素點(diǎn) 列循環(huán)for j=1:N % 行循環(huán)R=r(j,i); % 將圖像紅色分量中(j,i)點(diǎn)值賦值給RG=g(j,i);B=b(j,i);if (R>95 && G>40 && B>20 && (R-G)>15 && R-B>15) || ... % RGB空間膚色檢測(cè)(R>220 && G>210 && B>170 && R-B<=15 && R>B && G>B) % 符合RGB膚色檢測(cè)條件的像素點(diǎn)值置1則為白色,其他不符合條件的像素點(diǎn)為0黑色SkinRGB(j,i)=1;endmaxRGB=max(max(R,G),B); % 取三分量中同一點(diǎn)最大值minRGB=min(min(R,G),B); % 取三分量中同一點(diǎn)最小值C=maxRGB-minRGB; % 取最大差值V=maxRGB; % 最大值賦值給參數(shù)Vif V==0 % 比較最大值是否等于零 S=0;elseS=C/V; % 最大值不等于零則 C最大差值/V最大值endif maxRGB==R % 如果該點(diǎn)最大值==紅色分量值;作如下處理H=60*mod((G-B)/C,6);elseif maxRGB==G % 如果該點(diǎn)最大值==綠色分量值;作如下處理H=60*((B-R)/C+2);elseif maxRGB==B % 如果該點(diǎn)最大值==藍(lán)色分量值;作如下處理H=60*((R-G)/C+4);end % 符合HSV膚色檢測(cè) 將該點(diǎn)值置1if ((H>=0 && H<=25) || (H>=335 && H<=360)) && (S>=0.2 && S<=0.6) && V>=0.4SkinHSV(j,i)=1; % 優(yōu)化 HSV 效果增強(qiáng)?如何改?為什么這樣改?endR=R/255;G=G/255;B=B/255; % RGB 轉(zhuǎn) YCrCb 公式Cb=224*(-0.1687*R-0.3313*G+0.5*B)+128;Cr=224*(0.5*R-0.4187*G-0.0813*B)+128;if Cb>=77 && Cb<=127 && Cr>=133 && Cr<=173 % 符合 YCrCb膚色檢測(cè) 將該點(diǎn)值置1SkinCbCr(j,i)=1;endcbcr= [Cb Cr]'; % YCbCr空間基于高斯模型的膚色檢測(cè)p=exp(-0.5*((cbcr-miu)')*(inv(sigma))*(cbcr-miu)); % 高斯模型函數(shù)if p>thresh % p > 闕值0.35 值置1SkinCbCrG(j,i)=1;endend end figure,imshow(SkinRGB),title('RGB空間膚色檢測(cè)'); figure,imshow(SkinHSV),title('HSV空間膚色檢測(cè)'); figure,imshow(SkinCbCr),title('YCbCr空間范圍膚色檢測(cè)'); figure,imshow(SkinCbCrG),title('YCbCr空間高斯模型膚色檢測(cè)'); imwrite(SkinRGB,'skinrgb3.jpg'); imwrite(SkinHSV,'skinhsv3.jpg'); imwrite(SkinCbCr,'skincbcr3.jpg'); imwrite(SkinCbCrG,'skinCbCrG3.jpg');效果分析
從運(yùn)行結(jié)果可以看出,利用各個(gè)彩色空間膚色分布范圍能夠檢測(cè)出膚色,HSV空間檢測(cè)的結(jié)果比較零散。總體來(lái)講,基于膚色分布范圍的檢測(cè)方法的準(zhǔn)確率不高;基于高斯模型的檢測(cè)結(jié)果相對(duì)較好,若采用動(dòng)態(tài)閾值方法﹐會(huì)進(jìn)一步提高檢測(cè)準(zhǔn)確性;
下面會(huì)以HSV模型為例進(jìn)行優(yōu)化:
files=dir('11.jpg'); %讀入圖片 for i=1:length(files) %循環(huán) s=files(i).name; I=imread(s); %得到三維矩陣 I1=rgb2hsv(I); %RGB轉(zhuǎn)換為HSV H=I1(:,:,1); S=I1(:,:,2); V=I1(:,:,3); id=H>=0.0196&H<=0.0791&S>=0.0754&S<=0.6093&V>=0.4706&V<=0.9882; %閾值 figure,subplot(2,1,1),imshow(I), %顯示原始圖像 subplot(2,1,2),imshow(id) end- 在matlab中H、S、V的取值范圍為H: [0 1)、S: [0 1.0]、V: [0 1.0],給定的閾值范圍要在這個(gè)范圍內(nèi)!
效果比較
(1)HSV空間膚色檢測(cè)示例一;(2)HSV空間膚色檢測(cè)示例二;
? 很明顯第一張比第二張膚色檢測(cè)零散,第二張更為集中;優(yōu)化效果明顯
通過(guò)不斷的調(diào)整閾值,可以發(fā)現(xiàn)結(jié)果在不斷的變化。
總結(jié)
以上是生活随笔為你收集整理的【matlab 图像处理】 肤色检测的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ASP.NET 一文看懂repeater
- 下一篇: matlab 微分方程组参数拟合,拟合常