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