一、目標(biāo)提取
1.1臉部元素與背景的分離
圖像邊緣對圖像識別和計(jì)算機(jī)分析十分有用,邊緣能勾畫出目標(biāo) 物體,使觀察者—目了然; 邊緣蘊(yùn)含了豐富的內(nèi)在信息,是圖像識別中重要的圖像特征之一。從本質(zhì)上說,圖像邊緣是圖像局部特性不連續(xù)的反映,它標(biāo)志著一個(gè)區(qū)域的終結(jié)和另一個(gè)區(qū)域的開始。它存在于目標(biāo) 與背景、 目標(biāo)與目標(biāo)、區(qū)域與區(qū)域、基元與基元之間,因此它是圖像分割所依賴的重要特征。
考慮目標(biāo)圖像中的對應(yīng)臉部元素邊界處過渡較明顯,我們先將圖像放大——為了減小檢測邊緣的鋸齒影響,銳化——使圖像的邊緣更加明顯,再將圖像縮小以更好的得到目標(biāo)元素的邊緣輪廓。接著將圖像二值化,并簡單的濾波將無關(guān)緊要的雜質(zhì)濾去,防止對邊緣檢測產(chǎn)生影響。為了找出最好的邊緣檢測方法,我們先后嘗試了Robert算子,Sobel算子,Prewitt算子,拉普拉斯算子,以及Canny算子,最終得出Canny算子是效果最好的一種算法,所以我們最終采用Canny算子邊緣檢測,其具體算法如下:
該檢測方法是尋找圖像梯度的局部極大值,梯度是用高斯濾波器的導(dǎo)數(shù)計(jì)算的。該方法使用兩個(gè)閾值來分別檢測強(qiáng)邊緣和弱邊緣,而且僅當(dāng)弱邊緣與強(qiáng)邊緣相連時(shí),弱邊緣才會包含在輸出中。此方法不容易受噪聲的干擾,能夠檢測到真正的弱邊緣。因此,Canny算子在圖像處理中應(yīng)用越來越廣泛。它依據(jù)圖像邊緣檢測最優(yōu)準(zhǔn)則設(shè)計(jì)算法:
①用高斯濾波模板進(jìn)行卷積以消除噪聲;
②利用導(dǎo)數(shù)算子找到圖像灰度沿著兩個(gè)(x,y)方向的偏導(dǎo)數(shù),并求出梯度的大小;
③利用②的結(jié)果計(jì)算出梯度的方向;
④知道邊緣的方向,就可以把邊緣的梯度方向大致分四種:0°、45°、90°、135°方向。通過梯度的方向,就可以找到這個(gè)像素梯度方向的鄰接像素;
⑤遍歷圖像,若某個(gè)像素的灰度值與其梯度方向上前后兩個(gè)像素的灰度值相比不是最大的,那么這個(gè)像素值為零,即不是邊緣;
⑥使用累計(jì)直方圖計(jì)算兩個(gè)閾值,大于高閾值的一定是邊緣,小于低閾值的一定不是邊緣,介于之間的,看這個(gè)像素的鄰接像素中有沒有超過高閾值的邊緣像素,如果有的話那么它就是邊緣了,否則它就不是邊緣。
Canny檢測方法不容易受噪聲干擾,能夠檢測到真正的弱邊緣,原因是它使用兩種不同的閾值分別檢測強(qiáng)邊緣和弱邊緣,并且當(dāng)弱邊緣和強(qiáng)邊緣相連時(shí),可以將弱邊緣包含在輸出圖像中,但是與原始圖像比較,所提取的邊緣仍然存在不完整,且有不連貫的現(xiàn)象,因此將邊緣檢測后的圖像
膨脹處理,用于將目標(biāo)元素輪廓的擴(kuò)充,接著對輪廓內(nèi)部填充,得到與目標(biāo)矩陣等大且元素所在位置像素值為1,其他位置像素值為0的模板矩陣。如下圖1。
圖1
之后將得到模板矩陣與目標(biāo)矩陣相乘,便得到只剩下相應(yīng)元素,其他為黑色的圖像。如圖2。
圖2
1.2臉部元素的處理
由于圖像是連續(xù)信號,對于提取的臉部元素圖像,其邊界點(diǎn)含有背景色成分。如果直接將它與人臉合成,會出現(xiàn)輪廓線、鋸齒狀等不自然的現(xiàn)象,所以在合成前有必要對元素部分進(jìn)行處理,消除其邊緣點(diǎn)含有的背景色成分。
1.2.1方案一:合理腐蝕法
對得到的元素圖像,進(jìn)行適當(dāng)腐蝕膨脹,得到邊緣被抹除的臉部元素,至此該元素不含背景顏色。如圖3。
圖3
1.2.2方案二:二值化邊界判別法
根據(jù)區(qū)分元素和背景的二值圖像,可以確定邊界點(diǎn)。對于該二值圖像,
“0”對應(yīng)背景點(diǎn),“1”對應(yīng)元素點(diǎn)。當(dāng)值為“1”時(shí),如果該點(diǎn)周圍的8個(gè)點(diǎn)構(gòu)成的鄰域內(nèi)含有“0”值點(diǎn),則該點(diǎn)以及對應(yīng)于原圖像中的像素點(diǎn)就是邊界點(diǎn),否則為內(nèi)點(diǎn)。
確定出邊界點(diǎn)后,從該邊界點(diǎn)的鄰域中尋找出內(nèi)點(diǎn),用該點(diǎn)內(nèi)的顏色替代該邊界點(diǎn)的顏色。將所有邊界點(diǎn)的顏色替換完畢,臉部元素的處理結(jié)束。如圖4。
圖4
二、圖像合成
2.1確定坐標(biāo)
用1與上面提取臉部元素的模板矩陣每一個(gè)像素點(diǎn)值相減,即使得原來元素所在位置像素點(diǎn)為0,背景為1的模板矩陣。根據(jù)臉部圖像的矩陣的大小,先大概確定元素應(yīng)該放置的位置坐標(biāo),然后利用剛才得到的模板矩陣與大概確定的位置同維度的矩陣卷積,以鼻子為例得到的結(jié)果如圖5所示。

圖5
模板為0的部分被去掉,為1的部分被保留,被去掉的地方就是等會兒要放的臉部元素,然后根據(jù)去掉的位置去調(diào)整坐標(biāo),使得元素安放的位置合理即可。
2.2放置臉部元素
將如圖4所示提取得到的臉部元素矩陣在2.1中確定的臉部放置元素的位置坐標(biāo)下與對應(yīng)的臉部矩陣像素值相加,這樣就可以把提取出來的臉部元素放置到臉部的相應(yīng)位置,效果如圖6所示:
圖6

將臉部上的所有元素都進(jìn)行這樣的操作就可以基本實(shí)現(xiàn)頭像的組合,但是從圖6中我們可以明顯的發(fā)現(xiàn)鼻子周圍有白色的分界線,所以下一步要對這里進(jìn)行修復(fù)處理。
三、圖像修復(fù)
3.1問題分析:利用邊緣檢測技術(shù)可以很好地提取保留我們想要的臉部元素,但是由于所給的元素如嘴巴的顏色和臉部的顏色不一致,如果將提取出來的元素直接貼到臉部相應(yīng)位置會出現(xiàn)明顯的分界線,所以我們有必要建立一種算法使得元素和臉部的顏色有一個(gè)漸變的過程。
3.2方案一:邊緣加權(quán)法
3.2.1方法思路:所給元素的背景是白色的,在元素內(nèi)部和背景之間也有一個(gè)漸變的過程,在這里我們可以利用這種漸變,提取邊界的像素值,經(jīng)過一定處理得到每個(gè)像素點(diǎn)對應(yīng)的加權(quán)系數(shù),將加權(quán)系數(shù)處理元素和臉部接觸處,可以使得元素顏色向臉部顏色過渡。
3.2.2具體過程:首先讀取一張臉部和一張?jiān)氐牟噬珗D片,將彩色圖片分解為RGB三個(gè)矩陣,再對彩色圖片灰度化,然后利用現(xiàn)有函數(shù)graythresh自動確定二值化閾值thresh 并用函數(shù)im2bw對圖像進(jìn)行二值化。由于圖像中可能存在噪聲,不利于對元素的邊緣檢測,所以邊緣檢測前先進(jìn)行低通濾波,這里選用高斯濾波。邊緣檢測的算子有很多種,比如Sobel、Prewitt和Canny算子等,可以說各具優(yōu)點(diǎn)和缺點(diǎn),在這里經(jīng)過我們多次嘗試對比這些算子最終選用了Canny算子檢測邊緣。邊緣檢測后用函數(shù)bwmorph
進(jìn)行膨脹,這樣有利于是邊緣封閉起來,然后用函數(shù)bwfill對元素邊緣內(nèi)進(jìn)行填充,到這里我們可以初步利用填充后的邊緣范圍去提取元素,但是提取出來的元素大小可能不是我們想要的,所以之后我們還有進(jìn)行多次腐蝕、膨脹已達(dá)到我們想要的邊緣范圍。在本方法中,我們需要兩種邊緣范圍,一種是完全包含元素并且有點(diǎn)白色背景的外部邊緣,另一種是比元素范圍稍小一點(diǎn)的內(nèi)部邊緣,可以通過腐蝕膨脹次數(shù)的不同來得到。將內(nèi)、外部邊緣分別去提取元素,然后將外部減去內(nèi)部的像素點(diǎn)就可以得到元素向背景過渡的邊界部分,為了讓邊緣更加規(guī)則平滑這里再次進(jìn)行高斯濾波。我們知道元素過渡邊界部分像素點(diǎn)的值從里向外是由小到變化的,白色部分的值接近255,將這些像素值全部除以255并將得到的數(shù)值變換到0~1之間,即像素除得的最小值對應(yīng)0、最大值對應(yīng)1,每一個(gè)像素點(diǎn)對應(yīng)一個(gè)加權(quán)系數(shù),為了表述方便我們把這個(gè)矩陣稱記為K1。由于我們在內(nèi)部要更多地保留元素的像素值,所以要用1減去這些值使它們在元素邊界部分從內(nèi)到外、由大到小的變化,將這時(shí)的加權(quán)系數(shù)矩陣記為K2。將K2與提取的元素外部進(jìn)行卷積得到具有過渡性的元素邊緣矩陣。回到我們用來保留元素內(nèi)部的邊緣范圍,將它的值反相,并在臉部要安放元素的位置進(jìn)行卷積運(yùn)算,可以挖去那一部分。然后用我們提取出來元素內(nèi)部進(jìn)行填充,這時(shí)可以看到元素和臉部會有明顯的色差,在先接觸會有分界線。這時(shí),我們用K1去和臉部對應(yīng)位置進(jìn)行卷積,相當(dāng)于把臉部和元素銜接處去掉一層以用來過渡顏色,然后將剛才用K2與元素外部卷積得到的矩陣填充到這里去掉的一層的位置,這樣可以很好的實(shí)現(xiàn)從元素顏色到臉部顏色的過渡。最終的成果圖如下圖所示:
圖7
3.3方案二:灰度加權(quán)法
將得到的元素圖像I灰度處理得到圖像HI,設(shè)定一個(gè)合適的閾值a,將圖像HI中所有超過a的像素值所在坐標(biāo)提取出來,記為HI(i,j)。記原始臉部圖像為F,添加元素后的臉部圖像為FI,復(fù)原處理后的臉部圖像為FFI, 建立加權(quán)模型如下:
設(shè)權(quán)值為c:
FFI(i,j,1)=FI(i,j,1)*(1-c)+F(i,j,1)*c
FFI(i,j,2)=FI(i,j,2)*(1-c)+F(i,j,2)*c
FFI(i,j,3)=FI(i,j,3)*(1-c)+F(i,j,3)*c
分析知:灰度元素圖像HI邊緣過渡處,隨著向外的擴(kuò)張?jiān)酱螅仃嚨南袼刂狄苍酱螅憩F(xiàn)在圖像I中即為越趨于白色。故,建立權(quán)值c的關(guān)系式如下:
c=(FI(i,j,:)-K)/255 (K值根據(jù)部位不同可做適當(dāng)調(diào)整)
這樣便得到隨著圖像顏色的變淺,權(quán)值c越大,原始臉部顏色的比例就越大,緩沖了顏色的嚴(yán)重過渡,使圖像顯示更加自然。如圖1。
圖1
四、總結(jié)
在信息化時(shí)代,圖像處理是必不可少的,本文討論的是人臉部位圖像和人臉圖像的合成。這種技術(shù)多用于照片合成,把圖像中的一部分轉(zhuǎn)移到另一張圖像上,我們可以想到的是影視上面的特效。
本文主要應(yīng)用了數(shù)字圖像處理的圖像融合,在提取人臉部位的時(shí)候主要采取了銳化,二值化,邊緣檢測,腐蝕,膨脹。圖像融合的時(shí)候應(yīng)用的更多的是基礎(chǔ)的坐標(biāo)定位和鑲嵌。最后是對融合圖像的人臉部位的背景殘余消除,主要是兩種像素加權(quán)的辦法。正是這些圖像處理技術(shù)的共同作用,使我們小組完成了這次課程設(shè)計(jì)。
通過幾天的課程設(shè)計(jì),讓我們明確了分工合作的方法,也讓我更多的學(xué)習(xí)到了MATLAB在圖像處理上的應(yīng)用,在這次課程設(shè)計(jì)中,我們查閱了許多資料,這些資料補(bǔ)足了我們在各方面的欠缺,同時(shí)提高了我們的圖像處理知識。
附錄:
- clear
- clc
- close all
- I1=imread('G:\數(shù)字圖像處理\2016課程設(shè)計(jì)\35頭像無痕組合技術(shù)實(shí)現(xiàn)\鷹鉤鼻3.bmp');
- I2=imread('G:\數(shù)字圖像處理\2016課程設(shè)計(jì)\35頭像無痕組合技術(shù)實(shí)現(xiàn)\圓臉.bmp');
- I3=imread('G:\數(shù)字圖像處理\2016課程設(shè)計(jì)\35頭像無痕組合技術(shù)實(shí)現(xiàn)\凸嘴.bmp');
- I4=imread('G:\數(shù)字圖像處理\2016課程設(shè)計(jì)\35頭像無痕組合技術(shù)實(shí)現(xiàn)\小眼睛.bmp');
- I5=imread('G:\數(shù)字圖像處理\2016課程設(shè)計(jì)\35頭像無痕組合技術(shù)實(shí)現(xiàn)\八字胡1.bmp');
- I6=imread('G:\數(shù)字圖像處理\2016課程設(shè)計(jì)\35頭像無痕組合技術(shù)實(shí)現(xiàn)\時(shí)尚發(fā).bmp');
- I7=imread('G:\數(shù)字圖像處理\2016課程設(shè)計(jì)\35頭像無痕組合技術(shù)實(shí)現(xiàn)\1.bmp');
- I8=imread('G:\數(shù)字圖像處理\2016課程設(shè)計(jì)\35頭像無痕組合技術(shù)實(shí)現(xiàn)\短眉毛3.bmp');
- figure,imshow(I1)
- I22=I2;
- [M,N,P]=size(I1);
- I1=(I1)/2;
- figure,imshow(I1)
- I11=I1;
- I3=(I3)/2;
- I33=I3;
- I4=(I4)/2;
- I44=I4;
- [m4,n4,p4]=size(I4);
- I5=(I5)/2;
- I55=I5;
- [m5,n5,p5]=size(I5);
- I6=(I6)/2;
- I66=imresize(I6,3);
- [m6,n6,p6]=size(I6);
- I7=(I7)/2;
- I77=imresize(I7,3);
- [m7,n7,p7]=size(I7);
- I8=(I8)/2;
- I88=I8;
- [m8,n8,p8]=size(I8);
- % ERI33=im2bw(imresize(I1,10),0.78);
- % ERI33 = medfilt2(ERI33,[3,3]); %中值濾波
- % ERI33=bwmorph(ERI33,'dilate',1); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
- % figure,imshow(ERI33)
- % BHI33 = bwfill((1-ERI33),'holes'); %將圖像中所有的封閉輪廓填充
- % figure,imshow(BHI33)
- % BHI33=bwmorph(BHI33,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
- % BHI33=bwmorph( BHI33,'erode',3); %將邊緣檢測后的圖像腐蝕
- % BHI33=bwmorph(BHI33,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
- % figure,imshow(BHI33)
- % BHI33=imresize(BHI33,0.1);
- % figure,imshow(BHI33)
- % I1(:,:,1)=double(I1(:,:,1)).*BHI33;
- % I1(:,:,2)=double(I1(:,:,2)).*BHI33;
- % I1(:,:,3)=double(I1(:,:,3)).*BHI33;
- % figure,imshow(I1)
-
-
- % for i=1:M
- % for j=1:N
- % if I1(i,j,1)>245
- % I1(i,j,1)=0;
- % I1(i,j,2)=0;
- % I1(i,j,3)=0;
- % end
- % end
- % end
- % figure,imshow(I1)
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 臉部定位
- II2=rgb2gray(I2);
- II2=edge(II2,'canny',[0.04 0.10],1.5); %canny算子邊緣檢測
- figure,imshow(II2)
- [m2,n2] = size (II2); %獲得圖像的大小
-
- BH=bwmorph(II2,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充,擴(kuò)充次數(shù)隨Mumd值變化
- figure,imshow(BH)
- %title('對獲得邊緣的圖像進(jìn)行膨脹'); %保證卡片的輪廓完整
-
- BH = bwfill(BH,'holes'); %將圖像中所有的封閉輪廓填充
- % BH=bwmorph(BH,'erode',Numd); %將邊緣檢測后的圖像腐蝕
- BH = medfilt2(BH,[5,5]); %中值濾波
- figure,imshow(BH);
- %title('膨脹后進(jìn)行填充,再腐蝕和濾波'); %消除噪點(diǎn)影響
- A=sum(BH>0,2);
- A=A(1:(m2)*0.7);
- a=find(A==max(A));
- I2(a(1),(n2)/2,1)=255;
- I2(a(1),(n2)/2,2)=0;
- I2(a(1),(n2)/2,3)=0;
- figure,imshow(I2)
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 鼻子
- ERI1=im2bw(imresize(I1,10),0.44);
- ERI1= medfilt2(ERI1,[5,5]); %中值濾波
- %ERI1=edge(ERI1,'canny',[0.04 0.10],1.5); %canny算子邊緣檢測
- figure,imshow(ERI1)
- ERI1=bwmorph((1-ERI1),'dilate',5); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
- figure,imshow(ERI1)
- BHI1= bwfill(ERI1,'holes'); %將圖像中所有的封閉輪廓填充
- figure,imshow(BHI1)
-
- BHI1=bwmorph( BHI1,'erode',6); %將邊緣檢測后的圖像腐蝕
- BHI1=bwmorph(BHI1,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
- % BHI1=bwmorph(BHI1,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
- BHI1=bwmorph( BHI1,'erode',3); %將邊緣檢測后的圖像腐蝕
-
- figure,imshow(BHI1)
- BHI1=imresize(BHI1,0.1);
- BHI1=bwmorph( BHI1,'erode',2); %將邊緣檢測后的圖像腐蝕
- BHI1=bwmorph(BHI1,'dilate',1); %將邊緣檢測后的圖像膨脹
- BHI1=bwmorph( BHI1,'erode',3); %將邊緣檢測后的圖像腐蝕
- figure,imshow(BHI1)
- I11(:,:,1)=double((I11(:,:,1))*2).*BHI1;
- I11(:,:,2)=double((I11(:,:,2))*2).*BHI1;
- I11(:,:,3)=double((I11(:,:,3))*2).*BHI1;
- figure,imshow(I11)
-
- HH1=1-BHI1;
- for i=188:284
- for j=143:239
- I2(i,j,1)= double(I2(i,j,1)).*HH1(i-187,j-142);
- I2(i,j,2)= double(I2(i,j,2)).*HH1(i-187,j-142);
- I2(i,j,3)= double(I2(i,j,3)).*HH1(i-187,j-142);
- I2(i,j,1)=I2(i,j,1)+I11(i-187,j-142,1);
- I2(i,j,2)=I2(i,j,2)+I11(i-187,j-142,2);
- I2(i,j,3)=I2(i,j,3)+I11(i-187,j-142,3);
- rgbI2=rgb2gray(I2);
- if rgbI2(i,j)>185
- HD=(rgbI2(i,j)-20)/255;
- I2(i,j,1)=I2(i,j,1)*(1-HD)+I22(i,j,1)*HD;
- I2(i,j,2)=I2(i,j,2)*(1-HD)+I22(i,j,2)*HD;
- I2(i,j,3)=I2(i,j,3)*(1-HD)+I22(i,j,3)*HD;
- end
- end
- end
- figure,imshow(I2)
- H=(1/9)*ones(3,3);
- I2=imfilter(I2,H);
-
- figure,imshow(I2)
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 嘴
- ERI3=im2bw(imresize(I3,10),0.44);
- ERI3= medfilt2(ERI3,[5,5]); %中值濾波
- %ERI1=edge(ERI1,'canny',[0.04 0.10],1.5); %canny算子邊緣檢測
- figure,imshow(ERI3)
- ERI3=bwmorph((1-ERI3),'dilate',5); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
- figure,imshow(ERI3)
- BHI3= bwfill(ERI3,'holes'); %將圖像中所有的封閉輪廓填充
- figure,imshow(BHI3)
-
- BHI3=bwmorph( BHI3,'erode',6); %將邊緣檢測后的圖像腐蝕
- BHI3=bwmorph(BHI3,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
- % BHI1=bwmorph(BHI1,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
-
- figure,imshow(BHI3)
- BHI3=imresize(BHI3,0.1);
- BHI3=bwmorph( BHI3,'erode',2); %將邊緣檢測后的圖像腐蝕
- BHI3=bwmorph(BHI3,'dilate',1); %將邊緣檢測后的圖像膨脹
- BHI3=bwmorph( BHI3,'erode',1); %將邊緣檢測后的圖像腐蝕
- figure,imshow(BHI3)
- I33(:,:,1)=double((I33(:,:,1))*2).*BHI3;
- I33(:,:,2)=double((I33(:,:,2))*2).*BHI3;
- I33(:,:,3)=double((I33(:,:,3))*2).*BHI3;
- figure,imshow(I33)
-
- HH3=1-BHI3;
- for i=251:347
- for j=143:239
- I2(i,j,1)= double(I2(i,j,1)).*HH3(i-250,j-142);
- I2(i,j,2)= double(I2(i,j,2)).*HH3(i-250,j-142);
- I2(i,j,3)= double(I2(i,j,3)).*HH3(i-250,j-142);
- I2(i,j,1)=I2(i,j,1)+I33(i-250,j-142,1);
- I2(i,j,2)=I2(i,j,2)+I33(i-250,j-142,2);
- I2(i,j,3)=I2(i,j,3)+I33(i-250,j-142,3);
- rgbI2=rgb2gray(I2);
- if rgbI2(i,j)>185
- HD=(rgbI2(i,j)-20)/255;
- I2(i,j,1)=I2(i,j,1)*(1-HD)+I22(i,j,1)*HD;
- I2(i,j,2)=I2(i,j,2)*(1-HD)+I22(i,j,2)*HD;
- I2(i,j,3)=I2(i,j,3)*(1-HD)+I22(i,j,3)*HD;
- end
- end
- end
- figure,imshow(I2)
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%************ 眼睛
- ERI4=im2bw(imresize(I4,10),0.44);
- ERI4= medfilt2(ERI4,[5,5]); %中值濾波
- %ERI1=edge(ERI1,'canny',[0.04 0.10],1.5); %canny算子邊緣檢測
- figure,imshow(ERI4)
- ERI4=bwmorph((1-ERI4),'dilate',5); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
- figure,imshow(ERI4)
- BHI4= bwfill(ERI4,'holes'); %將圖像中所有的封閉輪廓填充
- figure,imshow(BHI4)
-
- BHI4=bwmorph( BHI4,'erode',4); %將邊緣檢測后的圖像腐蝕
- BHI4=bwmorph(BHI4,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
- % BHI1=bwmorph(BHI1,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
-
- figure,imshow(BHI4)
- BHI4=imresize(BHI4,0.1);
- BHI4=bwmorph( BHI4,'erode',1); %將邊緣檢測后的圖像腐蝕
- BHI4=bwmorph(BHI4,'dilate',2); %將邊緣檢測后的圖像膨脹
- BHI4=bwmorph( BHI4,'erode',1); %將邊緣檢測后的圖像腐蝕
- BHI4(:,(n4)/2:end)=bwmorph( BHI4(:,(n4)/2:end),'erode',4); %將邊緣檢測后的圖像腐蝕
- figure,imshow(BHI4)
- I44(:,:,1)=double((I44(:,:,1))*2).*BHI4;
- I44(:,:,2)=double((I44(:,:,2))*2).*BHI4;
- I44(:,:,3)=double((I44(:,:,3))*2).*BHI4;
- figure,imshow(I44)
-
- HH4=1-BHI4;
- for i=178:221
- for j=113:269
- I2(i,j,1)= double(I2(i,j,1)).*HH4(i-177,j-112);
- I2(i,j,2)= double(I2(i,j,2)).*HH4(i-177,j-112);
- I2(i,j,3)= double(I2(i,j,3)).*HH4(i-177,j-112);
- I2(i,j,1)=I2(i,j,1)+I44(i-177,j-112,1);
- I2(i,j,2)=I2(i,j,2)+I44(i-177,j-112,2);
- I2(i,j,3)=I2(i,j,3)+I44(i-177,j-112,3);
- rgbI2=rgb2gray(I2);
- if rgbI2(i,j)>175
- HD=(rgbI2(i,j)-50)/255;
- I2(i,j,1)=I2(i,j,1)*(1-HD)+I22(i,j,1)*HD;
- I2(i,j,2)=I2(i,j,2)*(1-HD)+I22(i,j,2)*HD;
- I2(i,j,3)=I2(i,j,3)*(1-HD)+I22(i,j,3)*HD;
- end
- end
- end
- figure,imshow(I2)
- I2(i,j,1)= medfilt2(I2(i,j,1),[5,5]); %中值濾波
- I2(i,j,2)= medfilt2(I2(i,j,2),[5,5]); %中值濾波
- I2(i,j,3)= medfilt2(I2(i,j,3),[5,5]); %中值濾波
-
- figure,imshow(I2)
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 胡子
- ERI5=im2bw(imresize(I5,10),0.44);
- ERI5= medfilt2(ERI5,[5,5]); %中值濾波
- %ERI1=edge(ERI1,'canny',[0.04 0.10],1.5); %canny算子邊緣檢測
- figure,imshow(ERI5)
- ERI5=bwmorph((1-ERI5),'dilate',5); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
- figure,imshow(ERI5)
- BHI5= bwfill(ERI5,'holes'); %將圖像中所有的封閉輪廓填充
- figure,imshow(BHI5)
-
- BHI5=bwmorph( BHI5,'erode',6); %將邊緣檢測后的圖像腐蝕
- BHI5=bwmorph(BHI5,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
- % BHI1=bwmorph(BHI1,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
-
- figure,imshow(BHI5)
- BHI5=imresize(BHI5,0.1);
- BHI5=bwmorph( BHI5,'erode',2); %將邊緣檢測后的圖像腐蝕
- BHI5=bwmorph(BHI5,'dilate',1); %將邊緣檢測后的圖像膨脹
- BHI5=bwmorph( BHI5,'erode',2); %將邊緣檢測后的圖像腐蝕
- figure,imshow(BHI5)
- I55(:,:,1)=double((I55(:,:,1))*2).*BHI5;
- I55(:,:,2)=double((I55(:,:,2))*2).*BHI5;
- I55(:,:,3)=double((I55(:,:,3))*2).*BHI5;
- figure,imshow(I55)
-
- HH5=1-BHI5;
- for i=226:322
- for j=143:239
- I2(i,j,1)= double(I2(i,j,1)).*HH5(i-225,j-142);
- I2(i,j,2)= double(I2(i,j,2)).*HH5(i-225,j-142);
- I2(i,j,3)= double(I2(i,j,3)).*HH5(i-225,j-142);
- I2(i,j,1)=I2(i,j,1)+I55(i-225,j-142,1);
- I2(i,j,2)=I2(i,j,2)+I55(i-225,j-142,2);
- I2(i,j,3)=I2(i,j,3)+I55(i-225,j-142,3);
- rgbI2=rgb2gray(I2);
- if rgbI2(i,j)>200
- HD=(rgbI2(i,j)-50)/255;
- I2(i,j,1)=I2(i,j,1)*(1-HD)+I22(i,j,1)*HD;
- I2(i,j,2)=I2(i,j,2)*(1-HD)+I22(i,j,2)*HD;
- I2(i,j,3)=I2(i,j,3)*(1-HD)+I22(i,j,3)*HD;
- end
- end
- end
- figure,imshow(I2)
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 頭發(fā)
- ERI6=im2bw(imresize(I6,30),0.44);
- ERI6= medfilt2(ERI6,[5,5]); %中值濾波
- %ERI1=edge(ERI1,'canny',[0.04 0.10],1.5); %canny算子邊緣檢測
- figure,imshow(ERI6)
- BHI6=bwmorph((1-ERI6),'dilate',1); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
- figure,imshow(BHI6)
- %BHI6= bwfill(BHI6,'holes'); %將圖像中所有的封閉輪廓填充
- %figure,imshow(BHI6)
-
- %BHI6=bwmorph( BHI6,'erode',6); %將邊緣檢測后的圖像腐蝕
- BHI6=bwmorph(BHI6,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
- % BHI1=bwmorph(BHI1,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
-
- %figure,imshow(BHI6)
- BHI6=imresize(BHI6,0.1);
- BHI6=bwmorph( BHI6,'erode',3); %將邊緣檢測后的圖像腐蝕
- BHI6=bwmorph(BHI6,'dilate',1); %將邊緣檢測后的圖像膨脹
- BHI6=bwmorph( BHI6,'erode',3); %將邊緣檢測后的圖像腐蝕
- figure,imshow(BHI6)
- I66(:,:,1)=double((I66(:,:,1))*2).*BHI6;
- I66(:,:,2)=double((I66(:,:,2))*2).*BHI6;
- I66(:,:,3)=double((I66(:,:,3))*2).*BHI6;
- figure,imshow(I66)
-
- HH6=1-BHI6;
- for i=6:296
- for j=46:336
- I2(i,j,1)= double(I2(i,j,1)).*HH6(i-5,j-45);
- I2(i,j,2)= double(I2(i,j,2)).*HH6(i-5,j-45);
- I2(i,j,3)= double(I2(i,j,3)).*HH6(i-5,j-45);
- I2(i,j,1)=I2(i,j,1)+I66(i-5,j-45,1);
- I2(i,j,2)=I2(i,j,2)+I66(i-5,j-45,2);
- I2(i,j,3)=I2(i,j,3)+I66(i-5,j-45,3);
- rgbI2=rgb2gray(I2);
- if rgbI2(i,j)>175
- HD=(rgbI2(i,j)-20)/255;
- I2(i,j,1)=I2(i,j,1)*(1-HD)+I22(i,j,1)*HD;
- I2(i,j,2)=I2(i,j,2)*(1-HD)+I22(i,j,2)*HD;
- I2(i,j,3)=I2(i,j,3)*(1-HD)+I22(i,j,3)*HD;
- end
- end
- end
- figure,imshow(I2)
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 帽子
- I5=I7;
- I55=I77;
- ERI5=im2bw(imresize(I5,35),0.44);
- Z=sum((1-ERI5),2);
- ZZ=find(Z~=0);
- ERI5=ERI5(ZZ(1):ZZ(end),:);
-
- ERI5= medfilt2(ERI5,[5,5]); %中值濾波
- %ERI1=edge(ERI1,'canny',[0.04 0.10],1.5); %canny算子邊緣檢測
- figure,imshow(ERI5)
- ERI5=bwmorph((1-ERI5),'dilate',5); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
- figure,imshow(ERI5)
- BHI5= bwfill(ERI5,'holes'); %將圖像中所有的封閉輪廓填充
- figure,imshow(BHI5)
-
- BHI5=bwmorph( BHI5,'erode',6); %將邊緣檢測后的圖像腐蝕
- BHI5=bwmorph(BHI5,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
- % BHI1=bwmorph(BHI1,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
-
- figure,imshow(BHI5)
- BHI5=imresize(BHI5,0.1);
- BHI5=bwmorph( BHI5,'erode',2); %將邊緣檢測后的圖像腐蝕
- BHI5=bwmorph(BHI5,'dilate',1); %將邊緣檢測后的圖像膨脹
- BHI5=bwmorph( BHI5,'erode',3); %將邊緣檢測后的圖像腐蝕
- figure,imshow(BHI5)
- I55=imresize(I5,35);
- I55=I55(ZZ(1):ZZ(end),:,:);
- % I55(:,:,2)=I55(ZZ(1):ZZ(end),:,2);
- % I55(:,:,3)=I55(ZZ(1):ZZ(end),:,3);
- I55=imresize(I55,0.1);
-
- I55(:,:,1)=double((I55(:,:,1))*2).*BHI5;
- I55(:,:,2)=double((I55(:,:,2))*2).*BHI5;
- I55(:,:,3)=double((I55(:,:,3))*2).*BHI5;
- figure,imshow(I55)
-
- HH5=1-BHI5;
- for i=18:175
- for j=21:314
- I2(i,j,1)= double(I2(i,j,1)).*HH5(i-17,j-20);
- I2(i,j,2)= double(I2(i,j,2)).*HH5(i-17,j-20);
- I2(i,j,3)= double(I2(i,j,3)).*HH5(i-17,j-20);
- I2(i,j,1)=I2(i,j,1)+I55(i-17,j-20,1);
- I2(i,j,2)=I2(i,j,2)+I55(i-17,j-20,1);
- I2(i,j,3)=I2(i,j,3)+I55(i-17,j-20,1);
- end
- end
- figure,imshow(I2)
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 眉毛
- ERI8=im2bw(imresize(I8,10),0.44);
- ERI8= medfilt2(ERI8,[5,5]); %中值濾波
- %ERI1=edge(ERI1,'canny',[0.04 0.10],1.5); %canny算子邊緣檢測
- figure,imshow(ERI8)
- ERI8=bwmorph((1-ERI8),'dilate',5); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
- figure,imshow(ERI8)
- BHI8= bwfill(ERI8,'holes'); %將圖像中所有的封閉輪廓填充
- figure,imshow(BHI8)
-
- BHI8=bwmorph( BHI8,'erode',6); %將邊緣檢測后的圖像腐蝕
- BHI8=bwmorph(BHI8,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
- % BHI1=bwmorph(BHI1,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴(kuò)充
-
- figure,imshow(BHI8)
- BHI8=imresize(BHI8,0.1);
- BHI8=bwmorph( BHI8,'erode',3); %將邊緣檢測后的圖像腐蝕
- BHI8=bwmorph(BHI8,'dilate',1); %將邊緣檢測后的圖像膨脹
- BHI8=bwmorph( BHI8,'erode',3); %將邊緣檢測后的圖像腐蝕
- %BHI8(:,(n8)/2:end)=bwmorph( BHI8(:,(n8)/2:end),'erode',4); %將邊緣檢測后的圖像腐蝕
- figure,imshow(BHI8)
- I88(:,:,1)=double((I88(:,:,1))*2).*BHI8;
- I88(:,:,2)=double((I88(:,:,2))*2).*BHI8;
- I88(:,:,3)=double((I88(:,:,3))*2).*BHI8;
- figure,imshow(I88)
-
- HH8=1-BHI8;
- for i=158:201
- for j=113:269
- I2(i,j,1)= double(I2(i,j,1)).*HH8(i-157,j-112);
- I2(i,j,2)= double(I2(i,j,2)).*HH8(i-157,j-112);
- I2(i,j,3)= double(I2(i,j,3)).*HH8(i-157,j-112);
- I2(i,j,1)=I2(i,j,1)+I88(i-157,j-112,1);
- I2(i,j,2)=I2(i,j,2)+I88(i-157,j-112,2);
- I2(i,j,3)=I2(i,j,3)+I88(i-157,j-112,3);
- rgbI2=rgb2gray(I2);
-
- if rgbI2(i,j)>165
- HD=(rgbI2(i,j)-30)/255;
- I2(i,j,1)=I2(i,j,1)*(1-HD)+I22(i,j,1)*HD;
- I2(i,j,2)=I2(i,j,2)*(1-HD)+I22(i,j,2)*HD;
- I2(i,j,3)=I2(i,j,3)*(1-HD)+I22(i,j,3)*HD;
- end
- end
- end
- figure,imshow(I2)
- I2(i,j,1)= medfilt2(I2(i,j,1),[5,5]); %中值濾波
- I2(i,j,2)= medfilt2(I2(i,j,2),[5,5]); %中值濾波
- I2(i,j,3)= medfilt2(I2(i,j,3),[5,5]); %中值濾波
-
- figure,imshow(I2)
復(fù)制代碼
完整的Word格式文檔51黑下載地址:
頭像無痕組合技術(shù)實(shí)現(xiàn).doc
(227 KB, 下載次數(shù): 22)
2018-6-30 04:17 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5