版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 課 程 設(shè) 計 報 告</p><p> 課程名稱 數(shù) 字 圖 像 處 理 </p><p> 課題名稱 圖像特征提取軟件設(shè)計 </p><p> 專 業(yè) </p><p> 班 級
2、 </p><p> 學(xué) 號 </p><p> 姓 名 </p><p> 指導(dǎo)教師 </p><p>
3、 2011年 1 月 20 日</p><p> 課 程 設(shè) 計 任 務(wù) 書</p><p> 課程名稱 數(shù)字圖像處理 </p><p> 課 題 圖像特征提取軟件設(shè)計 </p><p> 專業(yè)班級 計算機(jī)0781 </p><p> 學(xué)生姓名
4、 </p><p> 學(xué) 號 </p><p> 指導(dǎo)老師 </p><p> 審 批 </p><p> 任務(wù)書下達(dá)日期 2011年 1 月 5 日&
5、lt;/p><p> 任務(wù)完成日期 2011 年 1 月 20 日</p><p> 一、設(shè)計內(nèi)容與設(shè)計要求</p><p><b> 1.設(shè)計內(nèi)容</b></p><p> ?。?)圖像分割、邊緣檢測、邊界跟蹤、模板匹配、幾何形狀特征等圖像特征提取方法集成為一個完整的圖像特征提取軟件。</p>&l
6、t;p> ?。?)針對一幅人臉圖像,利用所設(shè)計的軟件實(shí)現(xiàn)人臉特征的提取(瞳孔中心、鼻孔、鼻尖、嘴角等特征點(diǎn)的抽取,以及嘴形輪廓、頭部輪廓的提取等);</p><p><b> 2.設(shè)計要求</b></p><p><b> 1)總體要求</b></p><p> ?。?)充分認(rèn)識課程設(shè)計的重要性,認(rèn)真做好準(zhǔn)備工作
7、,尤其是對編程軟件的使用有基本的認(rèn)識。</p><p> (2)虛心接受老師的指導(dǎo),充分發(fā)揮主觀能動性。結(jié)合課題,獨(dú)立思考,努力鉆研,勤于實(shí)踐,勇于創(chuàng)新。</p><p> ?。?)獨(dú)立按時完成規(guī)定的工作任務(wù),不得弄虛作假,不準(zhǔn)抄襲他人內(nèi)容。</p><p><b> 2)實(shí)施要求</b></p><p> ?。?)
8、理解各種圖像處理方法確切意義。</p><p> (2)獨(dú)立進(jìn)行方案的制定,系統(tǒng)結(jié)構(gòu)設(shè)計要合理。</p><p> ?。?)在程序開發(fā)時,則必須清楚主要實(shí)現(xiàn)函數(shù)的目的和作用,需要在程序書寫時說明做適當(dāng)?shù)淖⑨?。在寫課設(shè)報告時,必須要將主要函數(shù)的功能和參數(shù)做詳細(xì)的說明。</p><p> ?。?)通過多幅不同形式的圖像來檢測該系統(tǒng)的穩(wěn)定性和正確性。</p>
9、<p> 3)課程設(shè)計報告的內(nèi)容及要求</p><p> 在完成課題驗(yàn)收后,學(xué)生應(yīng)在規(guī)定的時間內(nèi)完成課程設(shè)計報告一份(不少于2000字)。</p><p><b> 二、進(jìn)度安排</b></p><p> 第 19 周 星期一 8時:00分——12時:00分</p><p> 星期二 8時:
10、00分——12時:00分</p><p> 星期三 8時:30分——12時:00分</p><p> 星期四 14時:00分——18時:00分</p><p> 星期五 14時:00分——18時:00分</p><p> 第 20 周 星期一 8時:00分——12時:00分</p><p><b
11、> 附:</b></p><p> 課程設(shè)計報告裝訂順序:封面、任務(wù)書、目錄、正文、評分表、附件(A4大小的圖紙及程序清單)。 </p><p> 正文的格式:一級標(biāo)題用3號黑體,二級標(biāo)題用四號宋體加粗,正文用小四號宋體;行距為22。</p><p> 正文的內(nèi)容:一、課題的主要功能;二、課題的功能模塊的劃分(要求畫出模塊圖);三、主要功
12、能的實(shí)現(xiàn)(至少要有一個主要模塊的流程圖);四、程序調(diào)試;五、總結(jié);六、附件(所有程序的原代碼,要求對程序?qū)懗霰匾淖⑨專?lt;/p><p> 正文總字?jǐn)?shù)要求在5000字以上(不含程序原代碼)。</p><p><b> 目錄</b></p><p> 一、課題的主要功能5</p><p> 1、圖像獲取功能5
13、</p><p> 2、圖像預(yù)處理功能5</p><p> 3、人臉定位功能5</p><p> 4、特征提取功能5</p><p> 二、 課題的功能模塊的劃分6</p><p> 一、功能模塊流程圖6</p><p> 二、各模塊的功能6</p><
14、;p> 1、圖像獲取模塊6</p><p> 2、人臉區(qū)域獲取7</p><p> 3、圖像預(yù)處理模塊7</p><p> 4、人臉定位模塊8</p><p> 5、特征提取模塊8</p><p> 三、主要功能的實(shí)現(xiàn)9</p><p> 一、 Gabor變換人臉
15、提取特征的流程圖9</p><p> 二、 功能的實(shí)現(xiàn)9</p><p><b> 1、光線補(bǔ)償9</b></p><p> 2、圖像灰度化10</p><p><b> 3、高斯平滑10</b></p><p><b> 4、灰度均衡11&l
16、t;/b></p><p> 5、圖像對比度增強(qiáng)12</p><p><b> 四、程序調(diào)試13</b></p><p><b> 五、總結(jié)16</b></p><p><b> 六、附錄17</b></p><p><b&g
17、t; 一、課題的主要功能</b></p><p> 1、圖像獲取功能: </p><p> 該模塊主要是從攝像頭拍照后進(jìn)行獲取圖片,也可以從圖片庫中獲取,獲取后的圖片可以在軟件的界面中顯示出來。</p><p> 2、圖像預(yù)處理功能:</p><p> 該模塊主要包括圖像光線補(bǔ)償、圖像變成灰色、高斯平滑、均衡直方圖、實(shí)現(xiàn)
18、圖像對比度增強(qiáng)、二值化變換等。</p><p> 3、人臉定位功能: </p><p> 該模塊主要是將處理后的人臉圖片進(jìn)行定位,將眼睛、鼻子、嘴巴標(biāo)記出來,以便進(jìn)行特征提取。</p><p> 4、特征提取功能: </p><p> 該模塊是在定位后的人臉圖片中將眼睛、鼻子、嘴巴的特征值提取出來。</p><p&
19、gt; 課題的功能模塊的劃分 </p><p> 一、功能模塊流程圖 </p><p><b> 圖 2.1</b></p><p><b> 二、各模塊的功能</b></p><p><b> 1、圖像獲取模塊</b></p><
20、p> 該模塊主要是從攝像頭拍照后進(jìn)行獲取圖片,也可以從圖片庫中獲取,獲取后的圖片可以在軟件的界面中顯示出來以便進(jìn)行識別。</p><p><b> 2、人臉區(qū)域獲取</b></p><p> 該系統(tǒng)中圖像里人臉區(qū)域的獲取,主要是根據(jù)膚色來進(jìn)行獲取,通過膚色非線形分段色彩變換來實(shí)現(xiàn)。這一非線性分段色彩變換得到的膚色模型屬于色彩空間中的聚類模型,這一類膚色模型
21、的建立首先要選取一種合適的色彩空間。</p><p><b> 3、圖像預(yù)處理模塊</b></p><p> 圖像預(yù)處理就是對獲取得來的圖像進(jìn)行適當(dāng)?shù)奶幚?,使它具有的特征能夠在圖像中明顯的表現(xiàn)出來。該模塊中的子模塊有如下5個,下面對它們進(jìn)行概述:</p><p><b> ·光線補(bǔ)償[3]</b></
22、p><p> 因?yàn)橄到y(tǒng)得到的圖片可能會存在光線不平衡的情況,這會影響我們對特征的提取,同時系統(tǒng)中要用到Y(jié)crCB色彩空間,所以有必要對圖像進(jìn)行光線補(bǔ)償。盡可能將它的特征在圖像中表現(xiàn)出來。YcrCB是一種色彩空間,它用于視頻系統(tǒng)中,在該色彩空間中,Y分量表示像素的亮度,Cr表示紅色分量,Cb表示藍(lán)色分量,通常把Cr和Cb稱為色度。YcrCB色彩空間是以演播室質(zhì)量標(biāo)準(zhǔn)為目標(biāo)的CC601編碼方案中采用的彩色表示模型。&l
23、t;/p><p><b> ·灰度變化[4]</b></p><p> 圖像灰度化的過程就是把彩色圖像轉(zhuǎn)換為黑白色圖像的過程,它也是為了將圖像的信息更加具體、簡單的表現(xiàn)出來,但是,這樣做也將會丟失圖像信息。因此,盡可能在轉(zhuǎn)化的過程中用簡單的方式表現(xiàn)圖像復(fù)雜的信息。</p><p> ·高斯平滑處理[5]</p>
24、<p> 高斯平滑將對圖像進(jìn)行平滑處理,在圖像采集過程中,由于各種因素的影響,圖像往往會出現(xiàn)一些不規(guī)則的噪聲,入圖像在傳輸、存儲等都有可能產(chǎn)生數(shù)據(jù)的丟失。從而影響圖像的質(zhì)量。處理噪聲的過程稱為平滑。平滑可以降低圖像的視覺噪聲,同時出去圖像中的高頻部分后,那些本來不明顯的低頻成分更容易識別。平滑可以通過卷積來實(shí)現(xiàn)。經(jīng)過卷積平滑后的水平投影后,二值化提供了較好的圖像效果。</p><p><b&
25、gt; ·對比度增強(qiáng)[6]</b></p><p> 對比度增強(qiáng),就是對圖像的進(jìn)一步處理,將對比度再一次拉開。它針對原始圖像的每一個像素直接對其灰度進(jìn)行處理的,其處理過程主要是通過增強(qiáng)函數(shù)對像素的灰度級進(jìn)行運(yùn)算并將運(yùn)算結(jié)果作為該像素的新灰度值來實(shí)現(xiàn)的。通過改變選用的增強(qiáng)函數(shù)的解析表達(dá)式就可以得到不同的處理效果。</p><p><b> ·二
26、值化[7]</b></p><p> 二值化的目的是將采集獲得的多層次灰度圖像處理成二值圖像,以便于分析理解和識別并減少計算量。二值化就是通過一些算法,通過一個閾值改變圖像中的像素顏色,令整幅圖像畫面內(nèi)僅有黑白二值,該圖像一般由黑色區(qū)域和白色區(qū)域組成,可以用一個比特表示一個像素,“1”表示黑色,“0”表示白色,當(dāng)然也可以倒過來表示,這種圖像稱之為二值圖像。這便有利于我們對特征的提取。該設(shè)計中采用組內(nèi)
27、方差和組外方差來實(shí)現(xiàn)二值化。</p><p><b> ·直方圖均衡[8]</b></p><p> 直方圖均衡化的目的是使一輸入圖像轉(zhuǎn)換為在每一灰度級上都有相同的象素點(diǎn)數(shù),它的處理的中心思想是把原始圖像的灰度直方圖從比較集中的某個灰度區(qū)間變成在全部灰度范圍內(nèi)的均勻分布,它的研究思路是:通過直方圖變換式來進(jìn)行直方圖的均衡處理,直方圖變換式是</p&
28、gt;<p> 但是直方圖均衡化存在著兩個缺點(diǎn): 1)變換后圖像的灰度級減少,某些細(xì)節(jié)消失; 2)某些圖像,如直方圖有高峰,經(jīng)處理后對比度不自然的過分增強(qiáng)。</p><p><b> 4、人臉定位模塊</b></p><p> 人臉定位是將典型的臉部特征(如眼睛,鼻尖,嘴唇等等)標(biāo)記出來,在本系統(tǒng)中,定位的特征是眼睛,鼻尖和嘴巴
29、三個。由于眼睛具有對稱性,因此可以很快就能標(biāo)記出來,而鼻子是在眼睛下面,且嘴巴在鼻子下面,所以只要眼睛標(biāo)記好,鼻子和嘴巴也能相應(yīng)的標(biāo)記出來。</p><p><b> 5、特征提取模塊</b></p><p> 特征提取按以下4個步驟進(jìn)行:</p><p> ?。?)、提取兩只眼睛的距離</p><p> (2)、
30、眼睛的傾角度</p><p> ?。?)、眼睛、嘴巴的重心</p><p> (4)、用一個矩形標(biāo)出每一個特征</p><p> 在特征提取完之后將會得到相應(yīng)的特征值以便存入后臺數(shù)據(jù)庫。</p><p><b> 三、主要功能的實(shí)現(xiàn)</b></p><p> Gabor變換人臉提取特征的流
31、程圖</p><p><b> 圖3.1</b></p><p><b> 功能的實(shí)現(xiàn)</b></p><p><b> 1、光線補(bǔ)償</b></p><p> 光線補(bǔ)償功能實(shí)質(zhì)上是用上段代碼中的LightingCompensate()函數(shù)來進(jìn)行實(shí)現(xiàn)。函數(shù)Lightin
32、gCompensate()是類DIB的一個成員函數(shù)。其核心代碼如下所述:</p><p> //下面的循環(huán)對圖像進(jìn)行光線補(bǔ)償</p><p> for(i =0;i<height;i++)</p><p> for(int j=0;j<width;j++)</p><p><b> {</b><
33、;/p><p><b> //獲取像素偏移</b></p><p> lOffset = this->PixelOffset(i,j,wBytesPerLine); </p><p><b> //得到藍(lán)色分量</b></p><p> *(lpData+lOffset) = colorb
34、;</p><p><b> //綠色分量</b></p><p> colorb = *(lpData+lOffset+1);</p><p> colorb *=co;</p><p> if(colorb >255)</p><p> colorb = 255;</p&
35、gt;<p> *(lpData+lOffset+1) = colorb;</p><p><b> //紅色分量</b></p><p> colorb = *(lpData+lOffset+2);</p><p> colorb *=co;</p><p> if(colorb >255
36、)</p><p> colorb = 255;</p><p> *(lpData+lOffset+2) = colorb;}</p><p><b> 2、圖像灰度化</b></p><p> ?、?彩色轉(zhuǎn)換成灰度</p><p> 將彩色圖像轉(zhuǎn)化為灰階圖像常采用如下的經(jīng)驗(yàn)式:&l
37、t;/p><p> gray=0.39×R+0.50×G+0.11×B(式3)</p><p> 其中,gray為灰度值,R、G、B分別為紅色、綠色和藍(lán)色分量值。</p><p> ② 灰度比例變換</p><p> 灰度比例變換是把原像素的灰度乘以一個縮放因子,并最后截至[0,255]。</p&g
38、t;<p> ?、?灰度線性變換</p><p> 當(dāng)圖像由于成像時曝光不足或曝光過度,會產(chǎn)生對比度不足的弊病,從而使圖像中的細(xì)節(jié)分辨不清。將圖像灰度進(jìn)行線性擴(kuò)展,常能顯著地改善圖像的外觀。</p><p><b> 3、高斯平滑</b></p><p> 在類CFaceDetectView中添加“高斯平滑”菜單項的事件
39、處理程序,其代碼如下:</p><p> Template(tem ,3,3, xishu); </p><p> Invalidate(TRUE); </p><p> 其中tem是模板參數(shù),xishu是模板系數(shù);Template()函數(shù)是實(shí)現(xiàn)高斯平滑的主要函數(shù),其核心代碼是:</p><p> for(m=i-((tem_h-
40、1)/2);m<=i+((tem_h-1)/2);m++)</p><p><b> {</b></p><p> for(n=j-((tem_w-1)/2);n<=j+((tem_w-1)/2);n++)</p><p> 注: 將以點(diǎn)(i,j)為中心,與模板大小相同的范圍內(nèi)的象素與模板對用位置的系數(shù)進(jìn)行相乘并線形疊加
41、 </p><p> sum+=Gray[m][n]* tem[(m-i+((tem_h-1)/2))*tem_w+n-j+((tem_w-1)/2)];</p><p> } </p><p> 將結(jié)果乘上總的模板系數(shù)</p><p> sum=(int)sum*xishu;</p><p>
42、;<b> 計算絕對值</b></p><p> sum = fabs(sum);</p><p> 如果小于0,強(qiáng)制賦值為0</p><p> if(sum<0) </p><p><b> sum=0;</b></p><p> 如果大于255,
43、強(qiáng)制賦值為255</p><p> if(sum>255)</p><p><b> sum=255;</b></p><p> HeightTemplate[i][j] = sum;</p><p><b> 4、灰度均衡</b></p><p> 在灰
44、度均衡操作同樣不需要改變DIB的調(diào)色板和文件夾,只要把指向DIB像素起始位置的指針和DIB高度、寬度信息傳遞給子函數(shù)就可以完成灰度均衡變換工作,其核心代碼如下: </p><p> *(lpData + lOffset)=state ; //顯示灰度均衡</p><p> *(lpData + lOffset+1)=state ;</p><p> *(lpD
45、ata + lOffset+2)=state ;</p><p><b> 5、圖像對比度增強(qiáng)</b></p><p> 類CFaceDetectView中添加“實(shí)現(xiàn)圖像對比度增強(qiáng)”菜單項的事件處理程序,其代碼如下;</p><p> lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);<
46、;/p><p> 獲取圖像灰度增強(qiáng)函數(shù)</p><p> int state=IncreaseContrast(ZFT[k][k1], 100); </p><p> 顯示灰度增強(qiáng)后的圖像</p><p> *(lpData + lOffset ) = state ;</p><p> *(lpData
47、+ lOffset+1) = state ;</p><p> *(lpData + lOffset+2) = state ;</p><p> 其中IncreaseContras()函數(shù)是實(shí)現(xiàn)圖像對比度增強(qiáng)的關(guān)鍵函數(shù),該根據(jù)參數(shù)n來調(diào)節(jié)對比度,n越大,對比越強(qiáng)烈,其核心是:</p><p> 如果數(shù)據(jù)很小,設(shè)置為0</p><p>
48、 if(pByte<=Low)</p><p><b> return 0;</b></p><p> 獲得中間數(shù)據(jù),并進(jìn)行對比增強(qiáng)處理</p><p> else if ((Low<pByte)&&(pByte<High))</p><p> return int(((pByt
49、e-Low)/Grad));</p><p> 如果數(shù)據(jù)很大,設(shè)置為255</p><p><b> else</b></p><p> return 255</p><p><b> 四、程序調(diào)試</b></p><p> 本系統(tǒng)主要由圖像處理、人臉定位、特征提
50、取三個部分組成,而圖像處理對于后面的工作結(jié)果好壞起著至關(guān)重要的作用,因此從軟件開發(fā)的最初階段我們就要對軟件進(jìn)行不斷的測試,對圖像處理模塊中的各個子模塊進(jìn)行測試以便檢測經(jīng)過處理后的圖像效果是否達(dá)到預(yù)期的效果</p><p><b> 圖4.1 編譯成功</b></p><p> 編譯成功后進(jìn)入操作界面:</p><p> 圖 4..2運(yùn)行
51、界面</p><p> 當(dāng)輸入的圖片不符合規(guī)格時,程序會發(fā)出警告提示,終止程序的運(yùn)行</p><p><b> 圖 4.3錯誤提示</b></p><p> 成功載入圖片,準(zhǔn)備進(jìn)行圖片的編輯:</p><p> 圖 4.4 載入圖片</p><p> 編譯圖片嘴角的匹配,勾勒出人物輪廓:
52、</p><p><b> 圖 臉部輪廓</b></p><p><b> 五、總結(jié) </b></p><p> 經(jīng)過兩個禮拜的課程設(shè)計,又重新溫故了本學(xué)期數(shù)字圖像處理的課本知識,同時鍛煉了C++的編程能力。面對著諸多的問題和考驗(yàn),我一次又一次享受了難題解決前的困惑和難題解決后的興奮。 兩個星期的數(shù)字圖像處理的課程
53、設(shè)計在充滿緊張的氛圍中結(jié)束了,這次操作系統(tǒng)課程設(shè)計讓我收獲很多。課程設(shè)計目的不僅是對所學(xué)知識的運(yùn)用和擴(kuò)展,也是在大學(xué)期間培養(yǎng)學(xué)生動手、分析問題和解決問題的能力。通過這一周的課程設(shè)計實(shí)踐讓我重新溫習(xí)了過去學(xué)過的知識。</p><p> 通過資料的查詢發(fā)現(xiàn)圖像的處理方法很多,我們可以根據(jù)需要,有選擇地使用各種方法。在確定臉部區(qū)域上,通常使用的方法有膚色提取。膚色提取,則對臉部區(qū)域的獲取則比較準(zhǔn)確,成功率達(dá)到95%以
54、上,并且速度快,減少很多工作。圖像的亮度變化,由于圖像的亮度在不同環(huán)境的當(dāng)中,必然受到不同光線的影響,圖像就變得太暗或太亮,我們就要對它的亮度進(jìn)行調(diào)整,主要采取的措施是對圖像進(jìn)行光線補(bǔ)償。進(jìn)行灰度處理,我們要保證圖像信息盡可能少的丟失。在圖像的采集過程中,由于各種因素的影響,圖像中往往會出現(xiàn)一些不規(guī)則的隨機(jī)噪聲,如數(shù)據(jù)在傳輸、存儲時發(fā)生的數(shù)據(jù)丟失和損壞等,這些都會影響圖像的質(zhì)量,因此需要將圖片進(jìn)行平滑操作以此來消除噪聲。同樣在進(jìn)行灰度變
55、換前,我們也要對圖像的信息進(jìn)行統(tǒng)計,找出一個比較合理的灰度值,才能進(jìn)行灰度變換?;叶茸儞Q后,就要進(jìn)行灰度均衡,可以根據(jù)灰度分布來進(jìn)行灰度均衡。</p><p> 對于這次的課程設(shè)計,我們最重要的不是學(xué)會如何去編程,如何去實(shí)現(xiàn)算法,更重要的是我們學(xué)會怎樣通過自己去查閱資料掌握我們要懂的知識,學(xué)會自己分析,學(xué)會自己獨(dú)立去研究。提高我們自學(xué)的能力,使我們即使有一天出去社會,沒有老師在身邊,也可以自己獨(dú)立去研究我們的專
56、業(yè)知識。</p><p><b> 六、附錄</b></p><p> #include "stdafx.h"</p><p> #include "DIB.h"</p><p> #include"math.h"#define WIDTHBYTES(b
57、its) ((bits+31)/32*4)</p><p> #define RECTWIDTH(x) (x->right-x->left)</p><p> #define RECTHEIGHT(x) (x->bottom-x->top)</p><p> #define THRESHOLDCONTRAST 40</p>
58、;<p> #ifdef _DEBUG</p><p> #undef THIS_FILE</p><p> static char THIS_FILE[]=__FILE__;</p><p> #define new DEBUG_NEW</p><p><b> #endif</b></p
59、><p> #define PI 3.1415926</p><p> extern int locax,locay;</p><p> #define m_WIDTH 600</p><p> #define m_HEIGHT 600</p><p> HDIB DIB::ReadDIBFile(HANDLE
60、hFile)</p><p><b> {</b></p><p> BITMAPFILEHEADER bmfHeader;</p><p> DWORD dwBitsSize;</p><p> HANDLE hDIB;</p><p> HANDLE hDIBtmp;</p&g
61、t;<p> LPBITMAPINFOHEADER lpbi;</p><p> DWORD dwRead;</p><p><b> //得到文件大小</b></p><p> dwBitsSize = GetFileSize(hFile,NULL);</p><p> hDIB = Glob
62、alAlloc(GMEM_MOVEABLE,(DWORD)(sizeof(BITMAPINFOHEADER)));</p><p><b> if(!hDIB)</b></p><p> return NULL;</p><p> lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);</p>
63、<p><b> if(!lpbi)</b></p><p><b> {</b></p><p> GlobalFree(hDIB);</p><p> return NULL;</p><p><b> }</b></p><p&
64、gt; if(!ReadFile(hFile,(LPBYTE)&bmfHeader,sizeof(BITMAPFILEHEADER),&dwRead,NULL))</p><p> goto ErrExit;</p><p> if(sizeof(BITMAPFILEHEADER)!=dwRead)//讀取文件出錯</p><p> goto
65、 ErrExit;</p><p> if(bmfHeader.bfType != 0x4d42)//文件類型不匹配</p><p> goto ErrExit;</p><p> if(!ReadFile(hFile,(LPBYTE)lpbi,sizeof(BITMAPINFOHEADER),&dwRead,NULL))</p><
66、;p> goto ErrExit;</p><p> if(sizeof(BITMAPINFOHEADER)!= dwRead)//讀取數(shù)據(jù)出錯</p><p> goto ErrExit;</p><p> GlobalUnlock(hDIB);</p><p> if(lpbi->biSizeImage==0)<
67、;/p><p> lpbi->biSizeImage = (this->BytePerLine(hDIB))*lpbi->biHeight;</p><p> hDIBtmp = GlobalReAlloc(hDIB,lpbi->biSize+lpbi->biSizeImage,0);</p><p> if(!hDIBtmp)<
68、;/p><p> goto ErrExitNoUnlock;</p><p><b> else</b></p><p> hDIB = hDIBtmp;</p><p> lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);</p><p> //根據(jù)情
69、況設(shè)定文件指針</p><p> if(bmfHeader.bfOffBits != 0L)</p><p> SetFilePointer(hFile,bmfHeader.bfOffBits,NULL,FILE_BEGIN);</p><p> //讀取文件的象素顏色數(shù)據(jù)</p><p> if(ReadFile(hFile,(LP
70、BYTE)lpbi+lpbi->biSize,lpbi->biSizeImage,&dwRead,NULL))</p><p> goto OKExit;</p><p><b> ErrExit:</b></p><p> GlobalUnlock(hDIB);</p><p> ErrEx
71、itNoUnlock:</p><p> GlobalFree(hDIB); //釋放內(nèi)存</p><p> return NULL;</p><p><b> OKExit:</b></p><p> GlobalUnlock(hDIB);</p><p> return hDIB;&
72、lt;/p><p><b> }</b></p><p> HDIB DIB::ToGray(HANDLE hDIB)</p><p><b> {</b></p><p> HDIB hNewDIB = NULL;</p><p> LPBITMAPINFOHEADE
73、R lpSrc,lpDest;</p><p> LPBYTE lpS,lpD;</p><p> DWORD dwBytesPerLine;</p><p> DWORD dwImgSize;</p><p> WORD wBytesPerLine;</p><p> unsigned i ,j,heigh
74、t,width;</p><p><b> if(!hDIB)</b></p><p> return NULL;</p><p> lpSrc = (LPBITMAPINFOHEADER)GlobalLock(hDIB);</p><p> dwBytesPerLine = WIDTHBYTES(24*(lpS
75、rc->biWidth));</p><p> dwImgSize = lpSrc->biHeight * dwBytesPerLine;</p><p> //申請新的內(nèi)存,大小等于原來圖象的大小</p><p> hNewDIB = GlobalAlloc(GHND,sizeof(BITMAPINFOHEADER)+dwImgSize);<
76、;/p><p> lpDest = (LPBITMAPINFOHEADER)GlobalLock(hNewDIB);</p><p> //保存圖片的長寬、顏色深度等信息</p><p> memcpy((void*)lpDest,(void*)lpSrc,sizeof(BITMAPINFOHEADER));</p><p> DWORD
77、 dwSBytesPerLine;</p><p> dwSBytesPerLine = (24*(lpSrc->biWidth)+31)/32*4;</p><p> height = lpDest->biHeight;</p><p> width = lpDest->biWidth;</p><p> lpS
78、= (LPBYTE)lpSrc;</p><p> wBytesPerLine = this->BytePerLine(hDIB);</p><p> lpD = (LPBYTE)lpDest;</p><p> lpS = lpS + sizeof(BITMAPINFOHEADER);</p><p> lpD = lpD
79、+ sizeof(BITMAPINFOHEADER);</p><p> unsigned r , g ,b,gray ;</p><p> //掃描整個圖片,實(shí)現(xiàn)灰度化</p><p> for(i = 0 ;i<height; i++)</p><p><b> {</b></p>&l
80、t;p> for(j = 0 ;j<(unsigned )lpDest->biWidth;j++)</p><p><b> {</b></p><p> //獲得原來圖片的顏色值</p><p> r = *(lpS++);</p><p> g = *(lpS++);</p>
81、<p> b = *(lpS++);</p><p><b> //計算灰度值</b></p><p> gray = (g*50+r*39+b*11)/100;</p><p> //保存灰度值到目標(biāo)圖片</p><p> *(lpD++)=gray;</p><p>
82、 *(lpD++) = gray;</p><p> *(lpD++) = gray;</p><p><b> }</b></p><p> //處理四字節(jié)對齊問題</p><p> unsigned k ;</p><p> for(k=0;k<dwSBytesPerLine
83、-lpSrc->biWidth*3;k++)</p><p><b> {</b></p><p><b> lpS++;</b></p><p><b> lpD++;</b></p><p><b> }</b></p>&
84、lt;p><b> }</b></p><p> GlobalUnlock(hDIB);</p><p> GlobalUnlock(hNewDIB);</p><p> return hNewDIB;</p><p><b> }</b></p><p>
85、 void DIB::FaceLocate(HANDLE hDIB, CRect faceLocation[10], int &faceNum)</p><p><b> {</b></p><p> HANDLE hDIBTemp;</p><p><b> //保存當(dāng)前數(shù)據(jù)</b></p>
86、<p> hDIBTemp = this->CopyHandle(hDIB);</p><p> LPBITMAPINFOHEADER lpbi;</p><p> LPBYTE lpData;</p><p> WORD wBytesPerLine;</p><p> int height;</p>
87、<p> int width;</p><p> long lOffset;</p><p> //得到圖象的基本信息</p><p> lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);</p><p> height = lpbi->biHeight;</p>
88、<p> width = lpbi->biWidth;</p><p> lpData = FindDIBBits(hDIB);</p><p> wBytesPerLine = BytePerLine(hDIB);</p><p> //人臉數(shù)目初始化為0</p><p> faceNum =0;</p
89、><p> for(int k=0; k<10; k++)</p><p><b> {</b></p><p><b> //初始化區(qū)域</b></p><p> faceLocation[k].bottom = -1;</p><p> faceLocati
90、on[k].top = height;</p><p> faceLocation[k].right = -1;</p><p> faceLocation[k].left = width;</p><p><b> }</b></p><p> for(int i=0; i<height; i++)<
91、;/p><p> for (int j=0; j<width; j++)</p><p><b> {</b></p><p><b> //偏移</b></p><p> lOffset = PixelOffset(i,j,wBytesPerLine);</p><
92、p><b> int num;</b></p><p><b> //當(dāng)前點(diǎn)的數(shù)值</b></p><p> num = *(lpData + lOffset);</p><p> if (num !=0)//不是黑色</p><p><b> {</b>&l
93、t;/p><p><b> //遞歸計算</b></p><p> RecursiveLocateRect(lpData, wBytesPerLine, i, j, num, faceLocation[faceNum]);</p><p> faceNum++;</p><p><b> }</b&g
94、t;</p><p><b> }</b></p><p> GlobalUnlock(hDIB);</p><p> GlobalFree(hDIB);</p><p><b> //數(shù)值還原</b></p><p> hDIB = this->CopyHa
95、ndle(hDIBTemp);</p><p> lpData = FindDIBBits(hDIB);</p><p> wBytesPerLine = BytePerLine(hDIB);</p><p> for (i=0; i<faceNum; i++)</p><p> for (int j=faceLocation[
96、i].top; j<faceLocation[i].bottom; j++)</p><p><b> {</b></p><p> //把得到的人臉區(qū)域用綠色矩形標(biāo)注,處理豎直的兩條邊</p><p> lOffset = this->PixelOffset(j, faceLocation[i].left, wBytesP
97、erLine);</p><p> *(lpData + lOffset++) = 0;</p><p> *(lpData + lOffset++) = 255;</p><p> *(lpData + lOffset++) = 0;</p><p> lOffset = this->PixelOffset(j, faceLo
98、cation[i].right, wBytesPerLine);</p><p> *(lpData + lOffset++) = 0;</p><p> *(lpData + lOffset++) = 255;</p><p> *(lpData + lOffset++) = 0;</p><p><b> }</b
99、></p><p> for (i=0; i<faceNum; i++)</p><p> for (int j=faceLocation[i].left; j<faceLocation[i].right; j++)</p><p><b> {</b></p><p> //處理水平的兩天矩
100、形邊</p><p> lOffset = this->PixelOffset(faceLocation[i].top, j, wBytesPerLine);</p><p> *(lpData + lOffset++) = 0;</p><p> *(lpData + lOffset++) = 255;</p><p> *(
101、lpData + lOffset++) = 0;</p><p> lOffset = this->PixelOffset(faceLocation[i].bottom, j, wBytesPerLine);</p><p> *(lpData + lOffset++) = 0;</p><p> *(lpData + lOffset++) = 255;
102、</p><p> *(lpData + lOffset++) = 0;</p><p><b> }</b></p><p> GlobalFree(hDIBTemp);</p><p> GlobalUnlock(hDIB);</p><p><b> }</b&g
103、t;</p><p> void DIB::EyeMapC(LPBYTE lpRgb, const LPBYTE lpYcc, WORD wBytesPerLine, CRect faceLocation)</p><p><b> {</b></p><p> long lOffset;</p><p><
104、;b> int cr;</b></p><p><b> int cb;</b></p><p> //根據(jù)傳進(jìn)來的矩形區(qū)域進(jìn)行眼睛的色度匹配</p><p> for(int i=faceLocation.top; i<=faceLocation.bottom; i++)</p><p>
105、; for (int j=faceLocation.left; j<=faceLocation.right; j++)</p><p><b> {</b></p><p> //得到Cr,Cb數(shù)值</p><p> lOffset = PixelOffset(i, j, wBytesPerLine);</p>&
106、lt;p> cr = *(lpYcc + lOffset +1);</p><p> cb = *(lpYcc + lOffset +2);</p><p><b> //標(biāo)志</b></p><p><b> bool lab;</b></p><p> //判斷Cb分量的數(shù)值,并
107、修改標(biāo)志</p><p> int cmap = cb -116 ;</p><p> if(cmap >-1 && cmap <4)</p><p> lab = true;</p><p><b> else</b></p><p> lab = fals
108、e;</p><p> //判斷Cr分量的數(shù)值,并修改標(biāo)志</p><p> cmap = cr- 144 ;</p><p> if(cmap <=-2 || cmap>= 2)</p><p><b> {</b></p><p> lab = false;</
109、p><p><b> }</b></p><p> //根據(jù)標(biāo)志設(shè)定圖像顏色</p><p><b> if(lab)</b></p><p> cmap = 255;</p><p><b> else</b></p><p&
110、gt;<b> cmap = 0;</b></p><p><b> //保存圖象顏色</b></p><p> *(lpRgb + lOffset++) = cmap;</p><p> *(lpRgb + lOffset++) = cmap;</p><p> *(lpRgb + lO
111、ffset++) = cmap;</p><p><b> }</b></p><p> void DIB::FaceLocate(HANDLE hDIB, CRect faceLocation[10], int &faceNum)</p><p><b> {</b></p><p&
112、gt; HANDLE hDIBTemp;</p><p><b> //保存當(dāng)前數(shù)據(jù)</b></p><p> hDIBTemp = this->CopyHandle(hDIB);</p><p> LPBITMAPINFOHEADER lpbi;</p><p> LPBYTE lpData;</
113、p><p> WORD wBytesPerLine;</p><p> int height;</p><p> int width;</p><p> long lOffset;</p><p> //得到圖象的基本信息</p><p> lpbi = (LPBITMAPINFOHEA
114、DER)GlobalLock(hDIB);</p><p> height = lpbi->biHeight;</p><p> width = lpbi->biWidth;</p><p> lpData = FindDIBBits(hDIB);</p><p> wBytesPerLine = BytePerLine
115、(hDIB);</p><p> //人臉數(shù)目初始化為0</p><p> faceNum =0;</p><p> for(int k=0; k<10; k++)</p><p><b> {</b></p><p><b> //初始化區(qū)域</b><
116、;/p><p> faceLocation[k].bottom = -1;</p><p> faceLocation[k].top = height;</p><p> faceLocation[k].right = -1;</p><p> faceLocation[k].left = width;</p><p&
117、gt;<b> }</b></p><p> for(int i=0; i<height; i++)</p><p> for (int j=0; j<width; j++)</p><p><b> {</b></p><p><b> //偏移</b>
118、;</p><p> lOffset = PixelOffset(i,j,wBytesPerLine);</p><p><b> int num;</b></p><p><b> //當(dāng)前點(diǎn)的數(shù)值</b></p><p> num = *(lpData + lOffset);</p
119、><p> if (num !=0)//不是黑色</p><p><b> {</b></p><p><b> //遞歸計算</b></p><p> RecursiveLocateRect(lpData, wBytesPerLine, i, j, num, faceLocation[fac
120、eNum]);</p><p> faceNum++;</p><p><b> }</b></p><p><b> }</b></p><p> GlobalUnlock(hDIB);</p><p> GlobalFree(hDIB);</p>
121、<p><b> //數(shù)值還原</b></p><p> hDIB = this->CopyHandle(hDIBTemp);</p><p> lpData = FindDIBBits(hDIB);</p><p> wBytesPerLine = BytePerLine(hDIB);</p><p
122、> for (i=0; i<faceNum; i++)</p><p> for (int j=faceLocation[i].top; j<faceLocation[i].bottom; j++)</p><p><b> {</b></p><p> //把得到的人臉區(qū)域用綠色矩形標(biāo)注,處理豎直的兩條邊</
123、p><p> lOffset = this->PixelOffset(j, faceLocation[i].left, wBytesPerLine);</p><p> *(lpData + lOffset++) = 0;</p><p> *(lpData + lOffset++) = 255;</p><p> *(lpData
124、 + lOffset++) = 0;</p><p> lOffset = this->PixelOffset(j, faceLocation[i].right, wBytesPerLine);</p><p> *(lpData + lOffset++) = 0;</p><p> *(lpData + lOffset++) = 255;</p&
125、gt;<p> *(lpData + lOffset++) = 0;</p><p><b> }</b></p><p> for (i=0; i<faceNum; i++)</p><p> for (int j=faceLocation[i].left; j<faceLocation[i].right;
126、j++)</p><p><b> {</b></p><p> //處理水平的兩天矩形邊</p><p> lOffset = this->PixelOffset(faceLocation[i].top, j, wBytesPerLine);</p><p> *(lpData + lOffset++)
127、 = 0;</p><p> *(lpData + lOffset++) = 255;</p><p> *(lpData + lOffset++) = 0;</p><p> lOffset = this->PixelOffset(faceLocation[i].bottom, j, wBytesPerLine);</p><p&g
128、t; *(lpData + lOffset++) = 0;</p><p> *(lpData + lOffset++) = 255;</p><p> *(lpData + lOffset++) = 0;</p><p><b> }</b></p><p> void DIB::EyeMapC(LPBYTE
129、 lpRgb, const LPBYTE lpYcc, WORD wBytesPerLine, CRect faceLocation)</p><p><b> {</b></p><p> long lOffset;</p><p><b> int cr;</b></p><p><
130、;b> int cb;</b></p><p> //根據(jù)傳進(jìn)來的矩形區(qū)域進(jìn)行眼睛的色度匹配</p><p> for(int i=faceLocation.top; i<=faceLocation.bottom; i++)</p><p> for (int j=faceLocation.left; j<=faceLocati
131、on.right; j++)</p><p><b> {</b></p><p> //得到Cr,Cb數(shù)值</p><p> lOffset = PixelOffset(i, j, wBytesPerLine);</p><p> cr = *(lpYcc + lOffset +1);</p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 光電圖像處理課程設(shè)計--車牌提取設(shè)計
- matlab軟件課程設(shè)計-- 應(yīng)用圖像處理
- 數(shù)字圖像處理課程設(shè)計報告-- 彩色圖像增強(qiáng)軟件
- 圖像處理課程設(shè)計
- 圖像處理課程設(shè)計--應(yīng)用matlab語言編制圖像處理軟件
- 圖像處理課程設(shè)計
- 圖像分割和特征提取畢業(yè)設(shè)計
- matlab課程設(shè)計--圖像處理
- mtalab圖像處理課程設(shè)計
- 腫瘤細(xì)胞圖像預(yù)處理及特征提取.pdf
- matlab課程設(shè)計--圖像處理
- 投影柵圖像處理及軟件設(shè)計.pdf
- 軟件課程設(shè)計-bmp圖像顯示
- 指紋圖像預(yù)處理與特征提取.pdf
- c語言課程設(shè)計--圖像處理
- 數(shù)字圖像處理課程設(shè)計
- 數(shù)字圖像處理課程設(shè)計
- matlab課程設(shè)計圖像處理
- 數(shù)字圖像處理課程設(shè)計
- 數(shù)字圖像處理課程設(shè)計---數(shù)字圖像處理
評論
0/150
提交評論