數字圖像處理課程設計報告 題目:頭像無痕組合技術實現 摘 要 圖像信息是人類獲取信息的重要來源及利用信息的重要手段,圖像處理科學技術是科學研究、社會生產及人類生活中不可缺少的強有力工具。在信息社會中,數字圖像處理科學在理論或實踐上都存在著巨大的潛力。 數字圖像處理是一種通過計算機采用一定的算法對圖形圖像進行處理的技術。數字圖像處理技術已經在各個領域上都有了比較廣泛的應用。圖像處理的信息量很大,對處理速度的要求也比較高。MATLAB強大的運算和圖形展示功能,使圖像處理變得更加的簡單和直觀。 圖像合成又稱圖像融合,就是將一幅圖像中的目標提取出來與另一幅圖像融合成為一幅新的圖像。圖像合成在軍事,醫學,藝術,生活等很多領域都有著廣泛的應用。 本文討論人臉部位元素和人臉圖像的合成,并應用MATLAB軟件編程實現。針對該問題分成以下三步。 第一步,目標提取。通過對元素圖像進行銳化,二值化,邊緣檢測處理,提取出所需人臉部位元素;第二步,圖像合成。找出人臉元素指定位置坐標,將截取元素融合入人臉中;第三步,圖像修復。對融合元素采用兩種圖像像素加權的方法進行修復,使圖像更自然,達到頭像無痕組合技術實現
目錄 第1部分目標提取 1.1臉部元素與背景的分離 1.2臉部元素的處理 1.2.1合理腐蝕法 1.2.2二值化邊界判別法 第2部分圖像合成 2.1確定坐標 2.2放置臉部元素 第3部分圖像修復 3.1問題分析 3.2邊緣加權法 3.2.1方法思路 3.2.2具體過程 3.3灰度閾值加權法 第4部分總結 參考文獻資料 第5部分附錄
一、目標提取 1.1臉部元素與背景的分離 圖像邊緣對圖像識別和計算機分析十分有用,邊緣能勾畫出目標 物體,使觀察者—目了然; 邊緣蘊含了豐富的內在信息,是圖像識別中重要的圖像特征之一。從本質上說,圖像邊緣是圖像局部特性不連續的反映,它標志著一個區域的終結和另一個區域的開始。它存在于目標 與背景、 目標與目標、區域與區域、基元與基元之間,因此它是圖像分割所依賴的重要特征。 考慮目標圖像中的對應臉部元素邊界處過渡較明顯,我們先將圖像放大——為了減小檢測邊緣的鋸齒影響,銳化——使圖像的邊緣更加明顯,再將圖像縮小以更好的得到目標元素的邊緣輪廓。接著將圖像二值化,并簡單的濾波將無關緊要的雜質濾去,防止對邊緣檢測產生影響。為了找出最好的邊緣檢測方法,我們先后嘗試了Robert算子,Sobel算子,Prewitt算子,拉普拉斯算子,以及Canny算子,最終得出Canny算子是效果最好的一種算法,所以我們最終采用Canny算子邊緣檢測,其具體算法如下: 該檢測方法是尋找圖像梯度的局部極大值,梯度是用高斯濾波器的導數計算的。該方法使用兩個閾值來分別檢測強邊緣和弱邊緣,而且僅當弱邊緣與強邊緣相連時,弱邊緣才會包含在輸出中。此方法不容易受噪聲的干擾,能夠檢測到真正的弱邊緣。因此,Canny算子在圖像處理中應用越來越廣泛。它依據圖像邊緣檢測最優準則設計算法: ①用高斯濾波模板進行卷積以消除噪聲; ②利用導數算子找到圖像灰度沿著兩個(x,y)方向的偏導數,并求出梯度的大小; ③利用②的結果計算出梯度的方向; ④知道邊緣的方向,就可以把邊緣的梯度方向大致分四種:0°、45°、90°、135°方向。通過梯度的方向,就可以找到這個像素梯度方向的鄰接像素; ⑤遍歷圖像,若某個像素的灰度值與其梯度方向上前后兩個像素的灰度值相比不是最大的,那么這個像素值為零,即不是邊緣; ⑥使用累計直方圖計算兩個閾值,大于高閾值的一定是邊緣,小于低閾值的一定不是邊緣,介于之間的,看這個像素的鄰接像素中有沒有超過高閾值的邊緣像素,如果有的話那么它就是邊緣了,否則它就不是邊緣。 Canny檢測方法不容易受噪聲干擾,能夠檢測到真正的弱邊緣,原因是它使用兩種不同的閾值分別檢測強邊緣和弱邊緣,并且當弱邊緣和強邊緣相連時,可以將弱邊緣包含在輸出圖像中,但是與原始圖像比較,所提取的邊緣仍然存在不完整,且有不連貫的現象,因此將邊緣檢測后的圖像
膨脹處理,用于將目標元素輪廓的擴充,接著對輪廓內部填充,得到與目標矩陣等大且元素所在位置像素值為1,其他位置像素值為0的模板矩陣。如下圖1。
圖1 之后將得到模板矩陣與目標矩陣相乘,便得到只剩下相應元素,其他為黑色的圖像。如圖2。
圖2 1.2臉部元素的處理 由于圖像是連續信號,對于提取的臉部元素圖像,其邊界點含有背景色成分。如果直接將它與人臉合成,會出現輪廓線、鋸齒狀等不自然的現象,所以在合成前有必要對元素部分進行處理,消除其邊緣點含有的背景色成分。 1.2.1方案一:合理腐蝕法 對得到的元素圖像,進行適當腐蝕膨脹,得到邊緣被抹除的臉部元素,至此該元素不含背景顏色。如圖3。 圖3
1.2.2方案二:二值化邊界判別法 根據區分元素和背景的二值圖像,可以確定邊界點。對于該二值圖像, “0”對應背景點,“1”對應元素點。當值為“1”時,如果該點周圍的8個點構成的鄰域內含有“0”值點,則該點以及對應于原圖像中的像素點就是邊界點,否則為內點。 確定出邊界點后,從該邊界點的鄰域中尋找出內點,用該點內的顏色替代該邊界點的顏色。將所有邊界點的顏色替換完畢,臉部元素的處理結束。如圖4。 圖4
二、圖像合成 2.1確定坐標 用1與上面提取臉部元素的模板矩陣每一個像素點值相減,即使得原來元素所在位置像素點為0,背景為1的模板矩陣。根據臉部圖像的矩陣的大小,先大概確定元素應該放置的位置坐標,然后利用剛才得到的模板矩陣與大概確定的位置同維度的矩陣卷積,以鼻子為例得到的結果如圖5所示。 
圖5 模板為0的部分被去掉,為1的部分被保留,被去掉的地方就是等會兒要放的臉部元素,然后根據去掉的位置去調整坐標,使得元素安放的位置合理即可。 2.2放置臉部元素 將如圖4所示提取得到的臉部元素矩陣在2.1中確定的臉部放置元素的位置坐標下與對應的臉部矩陣像素值相加,這樣就可以把提取出來的臉部元素放置到臉部的相應位置,效果如圖6所示:
圖6 
將臉部上的所有元素都進行這樣的操作就可以基本實現頭像的組合,但是從圖6中我們可以明顯的發現鼻子周圍有白色的分界線,所以下一步要對這里進行修復處理。 三、圖像修復 3.1問題分析:利用邊緣檢測技術可以很好地提取保留我們想要的臉部元素,但是由于所給的元素如嘴巴的顏色和臉部的顏色不一致,如果將提取出來的元素直接貼到臉部相應位置會出現明顯的分界線,所以我們有必要建立一種算法使得元素和臉部的顏色有一個漸變的過程。 3.2方案一:邊緣加權法 3.2.1方法思路:所給元素的背景是白色的,在元素內部和背景之間也有一個漸變的過程,在這里我們可以利用這種漸變,提取邊界的像素值,經過一定處理得到每個像素點對應的加權系數,將加權系數處理元素和臉部接觸處,可以使得元素顏色向臉部顏色過渡。 3.2.2具體過程:首先讀取一張臉部和一張元素的彩色圖片,將彩色圖片分解為RGB三個矩陣,再對彩色圖片灰度化,然后利用現有函數graythresh自動確定二值化閾值thresh 并用函數im2bw對圖像進行二值化。由于圖像中可能存在噪聲,不利于對元素的邊緣檢測,所以邊緣檢測前先進行低通濾波,這里選用高斯濾波。邊緣檢測的算子有很多種,比如Sobel、Prewitt和Canny算子等,可以說各具優點和缺點,在這里經過我們多次嘗試對比這些算子最終選用了Canny算子檢測邊緣。邊緣檢測后用函數bwmorph 進行膨脹,這樣有利于是邊緣封閉起來,然后用函數bwfill對元素邊緣內進行填充,到這里我們可以初步利用填充后的邊緣范圍去提取元素,但是提取出來的元素大小可能不是我們想要的,所以之后我們還有進行多次腐蝕、膨脹已達到我們想要的邊緣范圍。在本方法中,我們需要兩種邊緣范圍,一種是完全包含元素并且有點白色背景的外部邊緣,另一種是比元素范圍稍小一點的內部邊緣,可以通過腐蝕膨脹次數的不同來得到。將內、外部邊緣分別去提取元素,然后將外部減去內部的像素點就可以得到元素向背景過渡的邊界部分,為了讓邊緣更加規則平滑這里再次進行高斯濾波。我們知道元素過渡邊界部分像素點的值從里向外是由小到變化的,白色部分的值接近255,將這些像素值全部除以255并將得到的數值變換到0~1之間,即像素除得的最小值對應0、最大值對應1,每一個像素點對應一個加權系數,為了表述方便我們把這個矩陣稱記為K1。由于我們在內部要更多地保留元素的像素值,所以要用1減去這些值使它們在元素邊界部分從內到外、由大到小的變化,將這時的加權系數矩陣記為K2。將K2與提取的元素外部進行卷積得到具有過渡性的元素邊緣矩陣。回到我們用來保留元素內部的邊緣范圍,將它的值反相,并在臉部要安放元素的位置進行卷積運算,可以挖去那一部分。然后用我們提取出來元素內部進行填充,這時可以看到元素和臉部會有明顯的色差,在先接觸會有分界線。這時,我們用K1去和臉部對應位置進行卷積,相當于把臉部和元素銜接處去掉一層以用來過渡顏色,然后將剛才用K2與元素外部卷積得到的矩陣填充到這里去掉的一層的位置,這樣可以很好的實現從元素顏色到臉部顏色的過渡。最終的成果圖如下圖所示:
圖7 3.3方案二:灰度加權法 將得到的元素圖像I灰度處理得到圖像HI,設定一個合適的閾值a,將圖像HI中所有超過a的像素值所在坐標提取出來,記為HI(i,j)。記原始臉部圖像為F,添加元素后的臉部圖像為FI,復原處理后的臉部圖像為FFI, 建立加權模型如下: 設權值為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邊緣過渡處,隨著向外的擴張越大,矩陣的像素值也越大,表現在圖像I中即為越趨于白色。故,建立權值c的關系式如下: c=(FI(i,j,:)-K)/255 (K值根據部位不同可做適當調整) 這樣便得到隨著圖像顏色的變淺,權值c越大,原始臉部顏色的比例就越大,緩沖了顏色的嚴重過渡,使圖像顯示更加自然。如圖1。 圖1 四、總結
在信息化時代,圖像處理是必不可少的,本文討論的是人臉部位圖像和人臉圖像的合成。這種技術多用于照片合成,把圖像中的一部分轉移到另一張圖像上,我們可以想到的是影視上面的特效。
本文主要應用了數字圖像處理的圖像融合,在提取人臉部位的時候主要采取了銳化,二值化,邊緣檢測,腐蝕,膨脹。圖像融合的時候應用的更多的是基礎的坐標定位和鑲嵌。最后是對融合圖像的人臉部位的背景殘余消除,主要是兩種像素加權的辦法。正是這些圖像處理技術的共同作用,使我們小組完成了這次課程設計。
通過幾天的課程設計,讓我們明確了分工合作的方法,也讓我更多的學習到了MATLAB在圖像處理上的應用,在這次課程設計中,我們查閱了許多資料,這些資料補足了我們在各方面的欠缺,同時提高了我們的圖像處理知識。
附錄: - clear
- clc
- close all
- I1=imread('G:\數字圖像處理\2016課程設計\35頭像無痕組合技術實現\鷹鉤鼻3.bmp');
- I2=imread('G:\數字圖像處理\2016課程設計\35頭像無痕組合技術實現\圓臉.bmp');
- I3=imread('G:\數字圖像處理\2016課程設計\35頭像無痕組合技術實現\凸嘴.bmp');
- I4=imread('G:\數字圖像處理\2016課程設計\35頭像無痕組合技術實現\小眼睛.bmp');
- I5=imread('G:\數字圖像處理\2016課程設計\35頭像無痕組合技術實現\八字胡1.bmp');
- I6=imread('G:\數字圖像處理\2016課程設計\35頭像無痕組合技術實現\時尚發.bmp');
- I7=imread('G:\數字圖像處理\2016課程設計\35頭像無痕組合技術實現\1.bmp');
- I8=imread('G:\數字圖像處理\2016課程設計\35頭像無痕組合技術實現\短眉毛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); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
- % figure,imshow(ERI33)
- % BHI33 = bwfill((1-ERI33),'holes'); %將圖像中所有的封閉輪廓填充
- % figure,imshow(BHI33)
- % BHI33=bwmorph(BHI33,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
- % BHI33=bwmorph( BHI33,'erode',3); %將邊緣檢測后的圖像腐蝕
- % BHI33=bwmorph(BHI33,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
- % 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); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充,擴充次數隨Mumd值變化
- figure,imshow(BH)
- %title('對獲得邊緣的圖像進行膨脹'); %保證卡片的輪廓完整
-
- BH = bwfill(BH,'holes'); %將圖像中所有的封閉輪廓填充
- % BH=bwmorph(BH,'erode',Numd); %將邊緣檢測后的圖像腐蝕
- BH = medfilt2(BH,[5,5]); %中值濾波
- figure,imshow(BH);
- %title('膨脹后進行填充,再腐蝕和濾波'); %消除噪點影響
- 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); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
- figure,imshow(ERI1)
- BHI1= bwfill(ERI1,'holes'); %將圖像中所有的封閉輪廓填充
- figure,imshow(BHI1)
-
- BHI1=bwmorph( BHI1,'erode',6); %將邊緣檢測后的圖像腐蝕
- BHI1=bwmorph(BHI1,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
- % BHI1=bwmorph(BHI1,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
- 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); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
- figure,imshow(ERI3)
- BHI3= bwfill(ERI3,'holes'); %將圖像中所有的封閉輪廓填充
- figure,imshow(BHI3)
-
- BHI3=bwmorph( BHI3,'erode',6); %將邊緣檢測后的圖像腐蝕
- BHI3=bwmorph(BHI3,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
- % BHI1=bwmorph(BHI1,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
-
- 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); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
- figure,imshow(ERI4)
- BHI4= bwfill(ERI4,'holes'); %將圖像中所有的封閉輪廓填充
- figure,imshow(BHI4)
-
- BHI4=bwmorph( BHI4,'erode',4); %將邊緣檢測后的圖像腐蝕
- BHI4=bwmorph(BHI4,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
- % BHI1=bwmorph(BHI1,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
-
- 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); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
- figure,imshow(ERI5)
- BHI5= bwfill(ERI5,'holes'); %將圖像中所有的封閉輪廓填充
- figure,imshow(BHI5)
-
- BHI5=bwmorph( BHI5,'erode',6); %將邊緣檢測后的圖像腐蝕
- BHI5=bwmorph(BHI5,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
- % BHI1=bwmorph(BHI1,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
-
- 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)
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 頭發
- 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); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
- figure,imshow(BHI6)
- %BHI6= bwfill(BHI6,'holes'); %將圖像中所有的封閉輪廓填充
- %figure,imshow(BHI6)
-
- %BHI6=bwmorph( BHI6,'erode',6); %將邊緣檢測后的圖像腐蝕
- BHI6=bwmorph(BHI6,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
- % BHI1=bwmorph(BHI1,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
-
- %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); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
- figure,imshow(ERI5)
- BHI5= bwfill(ERI5,'holes'); %將圖像中所有的封閉輪廓填充
- figure,imshow(BHI5)
-
- BHI5=bwmorph( BHI5,'erode',6); %將邊緣檢測后的圖像腐蝕
- BHI5=bwmorph(BHI5,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
- % BHI1=bwmorph(BHI1,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
-
- 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); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
- figure,imshow(ERI8)
- BHI8= bwfill(ERI8,'holes'); %將圖像中所有的封閉輪廓填充
- figure,imshow(BHI8)
-
- BHI8=bwmorph( BHI8,'erode',6); %將邊緣檢測后的圖像腐蝕
- BHI8=bwmorph(BHI8,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
- % BHI1=bwmorph(BHI1,'dilate',3); %將邊緣檢測后的圖像膨脹一次,用于將卡片輪廓的擴充
-
- 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)
復制代碼
完整的Word格式文檔51黑下載地址:
頭像無痕組合技術實現.doc
(227 KB, 下載次數: 22)
2018-6-30 04:17 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|