一、實驗目的:
(1)進一步掌握圖像處理工具Matlab,熟悉基于Matlab的圖像處理函數。
(2)掌握圖像分割方法,熟悉常用圖像描述方法。
二、實驗原理
1.膚色檢測
膚色是人類皮膚重要特征之一,在檢測人臉或手等目標時常采用膚色檢測的方法,將相關區域從圖像中分割出來。
膚色檢測方法:
膚色檢測方法有很多,但無論是基于不同的色彩空間還是不同的膚色模型,其根本出發點在于膚色分布的聚集性,即膚色的顏色分量一般聚集在某個范圍內。通過大量的膚色樣本進行統計,找出膚色顏色分量的聚集范圍或用特殊的分布模型去模擬膚色分布,進而實現對任意像素顏色的判別。
不同彩色空間膚色分布范圍:
① RGB彩色空間
據統計資料,膚色在RGB模型中的分布范圍基本滿足以下條件:
(1)在均勻光照下:R>95且G>40且B>20 且 max{R,G,B}一min{R,G,B}>15且|R一G|>15且R>G且R>B。
(2)在閃光或側向照明環境下:R>220且G>210且B>170且|R一G≤15且R>B且G>B。
② YCbCr彩色空間
據統計資料,膚色在YCbCr空間的分布范圍為77≤C,≤127,133≤C,≤173。
③ HSV彩色空間
HSV空間建立的膚色模型要求滿足0°≤H≤25°或335°≤H≤360°且0.2≤S≤0.6且0.4V。
膚色模型
膚色模型是根據大量樣本的統計數據建立以確定膚色的分布規律,進而判斷像素的色彩是否屬于膚色或與膚色相似程度的模型。常用的有闕值模型、高斯模型和橢圓模型。
1)閾值模型
國值模型是用數學表達式明確膚色分布范圍的建模方法。這類方法依據膚色分布范圍進行檢測,判斷簡單、明確、快捷,但需要選擇合適的顏色空間及合適的參數。
2)高斯膚色模型
利用高斯函數模擬膚色在CbCr色度空間的分布。
其實,
為色度向量的均值和協方差矩陣,可通過多種方式獲取,數值略有區別。
2.圖像平滑
圖像平滑是指受傳感器和大氣等因素的影響,遙感圖像上會出現某些亮度變化過大的區域,或出現一些亮點(也稱噪聲)。這種為了抑制噪聲,使圖像亮度趨于平緩的處理方法就是圖像平滑。圖像平滑實際上是低通濾波,平滑過程會導致圖像邊緣模糊化。
圖像平滑的方法包括:插值方法,線性平滑方法,卷積法等等。這樣的處理方法根據圖像噪聲的不同進行平滑,比如椒鹽噪聲,就采用線性平滑方法!
3.皮膚區域分割
所采取的膚色分割的方法為:首先根據膚色在RGB空間分布統計進行初略非膚色過濾,初步去除圖像中的非膚色;然后根據膚色在CgCr空間分布范圍統計,進行膚色的第二次分割,獲取膚色分割圖像;在對膚色區域進行中值濾波,提高膚色檢測率。
⑴基于RGB空間非膚色像素的初步過濾
對于圖像中一些非膚色的像素點,若呈現過紅、過藍、過綠等特征,可通過設置取值范圍初步過濾這些非膚色像素點。具體操作過程如下:
①據統計,人眼的像素具有特征:R<70,G<40,B<20.這樣使得眼睛更加容易提取像素,減少亮度低的像素被誤判為膚色像素的概率。
②據統計,過紅、過綠像素大多具有特征R+G>500,可剔除這些像素點。
③據統計,當R<160,G<160,B<160,過紅、過綠像素大多數具有R>G>B,可剔除這些像素點。
⑵基于YCgCr空間的膚色分割
膚色YCbCr顏色空間是一種常用的膚色檢測的色彩模型,其中Y代表亮度,Cr代表光源中的紅色分量,Cb代表光源中的藍色分量。人的膚色在外觀上的差異是由色度引起的,不同人的膚色分布集中在較小的區域內。膚色的YCbCr顏色空間CbCr平面分布在近似的橢圓區域內,通過判斷當前像素點的CbCr是否落在膚色分布的橢圓區域內,就可以很容易地確認當前像素點是否屬于膚色。將圖像轉換到YCbCr空間并且在CbCr平面進行投影,可以采集到膚色的樣本點。
將CbCr平面均分為許多小區域,將每個區域的中心點CbCr色度值作為當前區域的特征值,對膚色區域像素值進行遍歷,如果當前像素值落在該區域內則替換當前區域特征值。
RGB轉換為YCbCr
4.圖像融合
圖像融合(Image Fusion) 是指綜合多幅輸入圖像的信息,以獲得更高質量輸出圖 像的過程與融合前的多幅圖像相比,融合后的圖像應更加適于進一步的觀察或處理。圖像融合屬于數字圖像處理領域,在計算攝影學中,用于拍攝所得圖像的后期處理。
5.圖像銳化
圖像銳化也稱邊緣增強。銳化技術用于加強圖像中的邊界和細節信息。由于邊界和細節信息對應頻域中的高頻部分,所以在頻域中通常對圖像進行高通濾波,在空間域則進行微分處理。為增加細節信息,采用了拉普拉斯算子進行圖像銳化。
Laplace算子
拉普拉斯(Laplace)是著名物理學家和數學家,laplace定義如下:
對于離散函數f(i,j),laplace算子定義為:
因為
同理可得:
由此可得Laplace算子矩陣為:
三、實驗步驟(包括分析、代碼和波形)
首先來看看這個實驗的內容。利用人物正面照,參考例7.15實現皮膚美化處理,要求:
(1)濾波、色彩空間、代數運算、銳化等技術實現美化
(2)加入皮膚的亮白處理
(3)嘗試其他膚色檢測處理。
要求:實驗報告一份,源程序一份,實驗效果對比圖;
實驗的思路是很明確的,結合原理中的討論,我們只要按照題目的要求依據參考代碼、查看運行并進行驗證就可以了,不需要計算。
下面是第(1)小題的代碼。濾波、色彩空間、代數運算、銳化等技術實現美化;
clear,clc,close all;
ImageOrigin=im2double(imread('face.jpg'));
figure,imshow(ImageOrigin),title('原圖');
DBImage=DBfilt(ImageOrigin);SkinImage1=FirstFilter(ImageOrigin); %%初步過濾
SkinArea=SecondFilter(SkinImage1); %%YCgCr空間范圍膚色檢測SkinFuse=Fuse(ImageOrigin,DBImage,SkinArea);
SkinBeautify=Sharp(SkinFuse);function Out=DBfilt(In)[height,width,c] = size(In); win=15; % 定義雙邊濾波窗口寬度 sigma_s=6; sigma_r=0.1; % 雙邊濾波的兩個標準差參數 [X,Y] = meshgrid(-win:win,-win:win); Gs = exp(-(X.^2+Y.^2)/(2*sigma_s^2));%計算鄰域內的空間權值 Out=zeros(height,width,c); for k=1:cfor j=1:height for i=1:width temp=In(max(j-win,1):min(j+win,height),max(i-win,1):min(i+win,width),k);Gr = exp(-(temp-In(j,i,k)).^2/(2*sigma_r^2));%計算灰度鄰近權值 % W為空間權值Gs和灰度權值Gr的乘積 W = Gr.*Gs((max(j-win,1):min(j+win,height))-j+win+1,(max(i-win,1):min(i+win,width))-i+win+1); Out(j,i,k)=sum(W(:).*temp(:))/sum(W(:)); endend endfigure,imshow(Out),title('雙邊濾波');
endfunction Out=FirstFilter(In)Out=In;[height,width,c] = size(In); IR=In(:,:,1); IG=In(:,:,2);IB=In(:,:,3);for j=1:heightfor i=1:widthif (IR(j,i)<160/255 && IG(j,i)<160/255 && IB(j,i)<160) && (IR(j,i)>IG(j,i) && IG(j,i)>IB(j,i))Out(j,i,:)=0;endif IR(j,i)+IG(j,i)>500/255Out(j,i,:)=0;endif IR(j,i)<70/255 && IG(j,i)<40/255 && IB(j,i)<20/255Out(j,i,:)=0;endendendfigure,imshow(Out);title('非膚色初步過濾');
endfunction Out=SecondFilter(In)IR=In(:,:,1); IG=In(:,:,2);IB=In(:,:,3); [height,width,c] = size(In);Out=zeros(height,width);for i=1:widthfor j=1:height R=IR(j,i); G=IG(j,i); B=IB(j,i); Cg=(-81.085)*R+(112)*G+(-30.915)*B+128; Cr=(112)*R+(-93.786)*G+(-18.214)*B+128; if Cg>=85 && Cg<=135 && Cr>=-Cg+260 && Cr<=-Cg+280 Out(j,i)=1; endendendOut=medfilt2(Out,[3 3]);figure,imshow(Out),title('YCgCr空間范圍膚色檢測');
endfunction Out=Fuse(ImageOrigin,DBImage,SkinArea)Skin=zeros(size(ImageOrigin));Skin(:,:,1)=SkinArea; Skin(:,:,2)=SkinArea; Skin(:,:,3)=SkinArea;Out=DBImage.*Skin+double(ImageOrigin).*(1-Skin);figure,imshow(Out);title('膚色與背景圖像融合');
end
function Out=Sharp(In)H=[0 -1 0;-1 4 -1;0 -1 0]; %Laplacian銳化模板Out(:,:,:)=imfilter(In(:,:,:),H); Out=Out/3+In;
% imwrite(Out,'man4.jpg');figure,imshow(Out),title('Laplacia銳化圖像');
end
下面是第(2)小題的代碼。加入皮膚的亮白處理;
rgb = imread('face.jpg');%讀取圖片
figure(1),subplot(2,2,1);imshow(rgb);title('原圖像');
[m,n,k] = size(rgb); %讀取圖片大小
hsv = rgb2hsv(rgb); %顏色空間轉換
H = hsv(:,:,1); % 色調
S = hsv(:,:,2); % 飽和度
V = hsv(:,:,3); % 亮度
for i = 1:m %遍歷每一個像素點,可以根據需要選擇自己需要處理的區域for j = 1: nhsv(i,j,3) =1.3* hsv(i,j,3); %1.3是需要增強的倍數,可以根據圖片情況動態調整end
endrgb1 = hsv2rgb(hsv); %轉為RGB,進行顯示
figure(1),subplot(2,2,2);imshow(rgb1);title('加亮圖像');
下面是第(3)小題的代碼。嘗試其他膚色檢測處理;
clear,clc,close all;
Image=imread('face.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');