數(shù)字圖像處理課程設(shè)計(jì)_第1頁(yè)
數(shù)字圖像處理課程設(shè)計(jì)_第2頁(yè)
數(shù)字圖像處理課程設(shè)計(jì)_第3頁(yè)
數(shù)字圖像處理課程設(shè)計(jì)_第4頁(yè)
數(shù)字圖像處理課程設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩51頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

山東建筑大學(xué)信息與電氣工程學(xué)院課程設(shè)計(jì)說(shuō)明書

課程設(shè)計(jì)說(shuō)明書

題目:圖像人臉區(qū)域隱私保護(hù)系統(tǒng)設(shè)計(jì)

課程:數(shù)字圖像處理課程設(shè)計(jì)

院(部):信息與電氣工程學(xué)院

專業(yè):

班級(jí):

學(xué)生姓名:

學(xué)號(hào):

指導(dǎo)教師:

完成日期:2013年12月

目錄

摘要

3

1設(shè)計(jì)目的

3

2設(shè)計(jì)要求

3

3人臉識(shí)別系統(tǒng)概述

3

3.1當(dāng)前現(xiàn)狀

3

3.2系統(tǒng)概述

3

3.3人臉識(shí)別的常用方法

3

4設(shè)計(jì)內(nèi)容

3

4.1系統(tǒng)方案設(shè)計(jì)

3

4.2軟件模塊設(shè)計(jì)

3

4.2.1圖像輸入設(shè)計(jì)

3

4.2.2圖像膚色區(qū)分設(shè)計(jì)

3

4.2.3對(duì)膚色圖進(jìn)行修補(bǔ)處理設(shè)計(jì)

3

4.2.4網(wǎng)格標(biāo)記圖像設(shè)計(jì)

3

4.2.5人臉識(shí)別標(biāo)記

3

4.2.6對(duì)原圖像進(jìn)行臉部模糊處理

3

總結(jié)與致謝

3

參考文獻(xiàn)

3

附錄:系統(tǒng)設(shè)計(jì)程序

3

摘要

人臉是準(zhǔn)確鑒定一個(gè)人的身份,推斷出一個(gè)人的種族、地域,地位等信息的重要依據(jù)??茖W(xué)界從圖像處理、計(jì)算機(jī)視覺等多個(gè)學(xué)科對(duì)人臉進(jìn)行研究。人臉識(shí)別在滿足人工智能應(yīng)用和保護(hù)信息安全方面都有重要的意義,是當(dāng)今信息化時(shí)代必須解決的問題。

本設(shè)計(jì)用MATLAB對(duì)圖像的讀取,在識(shí)別前,先對(duì)圖像進(jìn)行處理,再通過膚色獲得可能的臉部區(qū)域,最后根據(jù)人臉固有眼睛的對(duì)稱性來(lái)確定是否就是人臉,同時(shí)采用高斯平滑來(lái)消除圖像的噪聲,再進(jìn)行二值化,二值化主要采用局域取閾值方法,接下來(lái)就進(jìn)行定位、提取特征值和識(shí)別等操作。經(jīng)過測(cè)試,圖像預(yù)處理模塊對(duì)圖像的處理達(dá)到了較好的效果,提高了定位和識(shí)別的正確率。為保護(hù)當(dāng)事人或行人的隱私權(quán),需要將圖像中當(dāng)事人的人臉區(qū)域作模糊,實(shí)現(xiàn)圖像中人臉區(qū)域隱私保護(hù)。

關(guān)鍵詞:人臉識(shí)別;圖像處理;圖像模糊

1設(shè)計(jì)目的

近年來(lái)隨著科技和人們的生活水平的提高,生物特征識(shí)別技術(shù)在近幾十年中飛速發(fā)展。隨著社會(huì)的發(fā)展和技術(shù)的進(jìn)步,特別是近年來(lái)計(jì)算機(jī)在軟硬件方面性能的飛速提升,各應(yīng)用領(lǐng)域?qū)焖俑咝У纳矸蒡?yàn)證的要求日益迫切。由于生物特征是人的內(nèi)在屬性,具有很強(qiáng)的自身穩(wěn)定性和個(gè)體差異性,因此成為身份驗(yàn)證的最理想依據(jù)。其中,利用人臉特征進(jìn)行身份驗(yàn)證又是最自然最直接的手段。人臉識(shí)別系統(tǒng)與指紋、虹膜、掌紋等其他人體生物特征識(shí)別系統(tǒng)相比,更加友好、方便,更易于為用戶所接受。

作為人的一種內(nèi)在屬性,并且具有很強(qiáng)的自身穩(wěn)定性及個(gè)體差異性,生物特征成為了自動(dòng)身份驗(yàn)證的最理想依據(jù)。人臉識(shí)別由于具有直接,友好,方便的特點(diǎn),使用者易于為用戶所接受,從而得到了廣泛的研究與應(yīng)用。除此之外,我們還能夠?qū)θ四樧R(shí)別的結(jié)果作進(jìn)一步的分析,得到有關(guān)人的性別,表情,年齡等諸多額外的豐富信息,擴(kuò)展了人臉識(shí)別的應(yīng)用前景。

所謂人臉識(shí)別(FaceRecognition),分析人臉圖像,從中提取有效的識(shí)別信息,用來(lái)辨別身份的一門技術(shù)。即,對(duì)己知人臉進(jìn)行標(biāo)準(zhǔn)化處理后,通過某種方法和數(shù)據(jù)庫(kù)中的人臉標(biāo)本進(jìn)行匹配,尋找?guī)熘袑?duì)應(yīng)人臉及該人臉的相關(guān)信息。人臉識(shí)別技術(shù)應(yīng)用背景十分廣泛,可用于公安系統(tǒng)刑偵破案的罪犯身份識(shí)別、身份證及駕駛執(zhí)照等證件驗(yàn)證、銀行及海關(guān)的監(jiān)控、自動(dòng)門衛(wèi)系統(tǒng)、視頻會(huì)議、機(jī)器人的智能化研究以及醫(yī)學(xué)等方面。

人身辨別方法主要是通過人身標(biāo)識(shí)物品和人身標(biāo)識(shí)知識(shí)兩種方式來(lái)實(shí)現(xiàn)的。常見的人身標(biāo)示物品有鑰匙、證件等各種標(biāo)識(shí),人身標(biāo)示知識(shí)有用戶名、密碼等。眾周知,像鑰匙、證件標(biāo)識(shí)等人身標(biāo)識(shí)物品很容易丟失或被偽造,而標(biāo)識(shí)知識(shí)容易遺忘或記錯(cuò),更為嚴(yán)重的是傳統(tǒng)身份識(shí)別系統(tǒng)往往無(wú)法區(qū)分標(biāo)識(shí)物品真正的擁有者和取得標(biāo)識(shí)物品的冒充者,一旦他人獲得標(biāo)識(shí)物品,也可以擁有相同的權(quán)力,電視采訪、街景地圖等應(yīng)用中,為保護(hù)當(dāng)事人或行人的隱私權(quán),需要將圖像中當(dāng)事人的人臉區(qū)域作模糊或馬賽克處理。因此具有廣闊的應(yīng)用前景和商業(yè)價(jià)值。

2設(shè)計(jì)要求

讀取人物圖像。

對(duì)圖像進(jìn)行數(shù)字圖像處理。

3、對(duì)人臉識(shí)別。

4、對(duì)人臉進(jìn)行模糊或者馬賽克處理。

3人臉識(shí)別系統(tǒng)概述

3.1當(dāng)前現(xiàn)狀

自動(dòng)人臉識(shí)別技術(shù)的研究開始于20世紀(jì)60年代末期。20世紀(jì)90年代后期以來(lái),一些商業(yè)性的人臉識(shí)別系統(tǒng)逐漸進(jìn)入市場(chǎng)。近幾年,人臉識(shí)別作為計(jì)算機(jī)安全技術(shù)在全球范圍內(nèi)迅速發(fā)展起來(lái),特別是美國(guó)遭遇恐怖襲擊后,這一技術(shù)引起廣泛關(guān)注。人臉識(shí)別技術(shù)具有廣泛的應(yīng)用前景,在國(guó)家安全、軍事安全和公共安全領(lǐng)域,智能門禁、智能視頻監(jiān)控、公安布控、海關(guān)身份驗(yàn)證、司機(jī)駕照驗(yàn)證等是典型的應(yīng)用;在民事和經(jīng)濟(jì)領(lǐng)域,各類銀行卡、金融卡、信用卡、儲(chǔ)蓄卡的持卡人的身份驗(yàn)證、社會(huì)保險(xiǎn)人的身份驗(yàn)證等具有重要的應(yīng)用價(jià)值;在家庭娛樂等領(lǐng)域,人臉識(shí)別也具有一些有趣有益的應(yīng)用,比如能夠識(shí)別主人身份的智能玩具、家政機(jī)器人、具有真實(shí)面像的虛擬游戲玩家等等。

人臉識(shí)別作為一種人體生物特征識(shí)別技術(shù),它涉及人工智能、模式識(shí)別、計(jì)算機(jī)視覺、圖像處理和分析、圖像編碼、計(jì)算機(jī)圖形學(xué)等眾多學(xué)科領(lǐng)域,依據(jù)視覺通道的輸入信息,在人臉檢測(cè)和跟蹤得到輸入人臉圖像

模式的基礎(chǔ)上,定位人面的主要生理特征區(qū)域(眼睛、鼻子、下巴等)并給出其形狀特征,實(shí)現(xiàn)輸入人臉模式的識(shí)別,達(dá)到確定使用者身份的目的。

3.2系統(tǒng)概述

人臉識(shí)別包括人臉檢測(cè)、人臉圖像預(yù)處理、人臉特征提取和人臉識(shí)別等過程。人臉檢測(cè)是指在輸入圖

像中確定人臉的位置與大小。人臉檢測(cè)的質(zhì)量影響人臉識(shí)別的其他過程以及整個(gè)人臉識(shí)別的效果,在人臉識(shí)別過程中顯得尤為重要。近年來(lái),電子商務(wù)等網(wǎng)絡(luò)資源的利用使得可視電話、視頻會(huì)議、多媒體教學(xué)等快捷便利的交流方式成為時(shí)尚,如何實(shí)時(shí)實(shí)現(xiàn)復(fù)雜背景下對(duì)人臉檢測(cè)和識(shí)別已成為人臉識(shí)別研究的熱點(diǎn)[1]。目前,已有神經(jīng)網(wǎng)絡(luò)算法、基于Hough變換或可適應(yīng)的Hough變換逼近、小波變換、鑲嵌圖方法、顏色紋理

規(guī)則等多種人臉檢測(cè)方法[2~

6]。這些方法是針對(duì)靜態(tài)圖像的基于人臉特征的統(tǒng)計(jì)與結(jié)構(gòu)分析方法,雖具有一般性,但分析計(jì)算量大,對(duì)噪聲敏感,性能不穩(wěn)定,難以實(shí)時(shí)檢測(cè)。

3.3人臉識(shí)別的常用方法

1、基于幾何特征的人臉正面圖像識(shí)別方法

通過人臉面部拓?fù)浣Y(jié)構(gòu)幾何關(guān)系的先驗(yàn)知識(shí),利用基于結(jié)構(gòu)的方法在知識(shí)的層次上提取人臉面部主要

器官特征,將人臉用一組幾何特征矢量來(lái)表示,識(shí)別歸結(jié)為特征矢量之間的匹配,基于歐氏距離的判決是最常用的識(shí)別方法。

2、基于統(tǒng)計(jì)的人臉正面自動(dòng)識(shí)別方法

基于統(tǒng)計(jì)的人臉正面自動(dòng)識(shí)別方法包括特征臉方法和隱馬爾科夫模型方法。統(tǒng)計(jì)的識(shí)別方法將人臉用代數(shù)特征矢量來(lái)表示。代數(shù)特征是由Hong等首先提出的,由圖像本身的灰度分布決定,它描述了圖像的內(nèi)存信息,它是通過對(duì)圖像灰度進(jìn)行各種代數(shù)變換和矩陣分解提出的。

將人臉看作一個(gè)二維的灰度變化的模板,從整體上捕捉和描述人臉的特征,所運(yùn)用的主要是一些標(biāo)準(zhǔn)的數(shù)據(jù)統(tǒng)計(jì)技巧,運(yùn)算比較復(fù)雜

4設(shè)計(jì)內(nèi)容

4.1系統(tǒng)方案設(shè)計(jì)

讀取圖像

字圖像處理

圖像進(jìn)行數(shù)

面部特征定位

人臉識(shí)別

人臉模糊處理

標(biāo)出臉部

輸出處理后的圖像

圖1系統(tǒng)總設(shè)計(jì)方框圖

4.2軟件模塊設(shè)計(jì)

4.2.1圖像輸入設(shè)計(jì)

可以通過攝像頭來(lái)獲取,也可以通過圖像庫(kù)來(lái)獲取。在圖像獲取以后,將圖像顯示出來(lái),同時(shí)記錄下圖像在內(nèi)存的地址,以便在圖像處理中使用。

RGB=imread('face06.jpg');%face02,04,06

YCbCr=rgb2ycbcr(RGB);%將RGB色彩值變換為YcbCr色彩空間(將RGB真彩色圖像轉(zhuǎn)化為YcbCr色彩空間中相等的圖像)

Y=YCbCr(:,:,1);%這三行分別是Ycbcr空間的y,cb,cr對(duì)應(yīng)矩陣

Cb=YCbCr(:,:,2);

Cr=YCbCr(:,:,3);

imshow(RGB);title('原始圖像RGB');%原始圖像

figure,imshow(YCbCr);

title('YcbCr色彩空間的圖像');%進(jìn)行將RGB色彩值變換為YcbCr色彩空間的圖像

如圖2所示:

原始圖像

YCbCr圖

圖2原圖像與YCbCr圖

4.2.2圖像膚色區(qū)分設(shè)計(jì)

人臉定位是完成對(duì)需定位的人臉運(yùn)動(dòng)區(qū)域進(jìn)行膚色檢測(cè)。在膚色分割階段,采用YCrCb色度空間,能較好地獲取膚色區(qū)域,排除一些類似人臉膚色的非人臉區(qū)域,并使用投影法正確標(biāo)記人臉。人臉定位過程包括5個(gè)步驟。

1)

相似度計(jì)算,方法是定義)/(BGRRr++=和)/(BGRBb++=,把三維RGB降為二維,在二維平面上,膚色的區(qū)域相對(duì)集中,根據(jù)膚色在色度空間的高斯(Gauss)分布,將彩色圖像中的某個(gè)像素從RGB色彩空間變換到Y(jié)CbCr空間,可以計(jì)算出該像素點(diǎn)屬于膚色區(qū)域的概率,即根據(jù)該像素點(diǎn)離高斯分布中心的遠(yuǎn)近程度得到一個(gè)與膚色的相似度(圖2a是待檢測(cè)區(qū)域的相似度),相似度計(jì)算公式為:

)]()(5.0exp[),(1mxCmxbrPT???=?

(5)

式中

M為均值;C為方差。

2)

選擇適當(dāng)?shù)拈撝担瑢?duì)圖像中的待檢測(cè)區(qū)域進(jìn)行二值化處理。

3)

對(duì)二值圖像作形態(tài)學(xué)處理,利用圓形結(jié)構(gòu)元素作膨脹變換,抹掉細(xì)節(jié),使圖像平滑。

4)

用直方圖方式對(duì)二值圖像進(jìn)行垂直投影和水平投影,如圖2b和圖2c所示。

圖像中人臉區(qū)域的獲取,根據(jù)膚色來(lái)獲取,通過膚色非線形分段色彩變換來(lái)實(shí)現(xiàn)。對(duì)圖像進(jìn)行圖像灰度化、高斯平滑處理、對(duì)比度增強(qiáng)、二值化等一系列的圖像處理之后,可以根據(jù)人的兩個(gè)眼睛具有對(duì)稱、眼睛下面有鼻子、再往下有嘴巴的特點(diǎn),來(lái)確定劃分的區(qū)域是否就是人臉區(qū)域

代碼:

I=RGB;

W=size(YCbCr,1);%y對(duì)應(yīng)矩陣寬大小

H=size(YCbCr,2);%y對(duì)應(yīng)矩陣高大小

k=(2.53/180)*pi;

m=sin(k);n=cos(k);%正余弦噪聲

%%%111111111111111111111111111

cx=109.38;cy=152.02;ecx=1.60;

ecy=2.41;a=25.39;b=14.03;%(cb=(100,140),cr=(70,160)這是閾值,這個(gè)閾值應(yīng)該是人臉膚色的范圍

fori=1:W

forj=1:H

ifY(i,j)<110

I(i,j,:)=0;

elseif(Y(i,j)<=200&&Y(i,j)>=110)

x=(double(Cb(i,j))-cx)*n+(double(Cr(i,j))-cy)*m;

y=(double(Cr(i,j))-cy)*n-(double(Cb(i,j))-cx)*m;

if((x-ecx)^2/a^2+(y-ecy)^2/b^2)<=1

I(i,j,:)=255;

elseI(i,j,:)=0;

end

elseifY(i,j)>200

x=(double(Cb(i,j))-cx)*n+(double(Cr(i,j))-cy)*m;

y=(double(Cr(i,j))-cy)*n-(double(Cb(i,j))-cx)*m;

if((x-ecx)^2/(1.1*a)^2+(y-ecy)^2/(1.1*b)^2)<=1

I(i,j,:)=255;%膚色部分變?yōu)榘咨?/p>

elseI(i,j,:)=0;%其余轉(zhuǎn)成黑色

end

end

end

end

figure,imshow(I);title('膚色區(qū)分后的圖像');%進(jìn)行將膚色識(shí)別后的黑白圖像

如圖3所示:

圖3膚色區(qū)分后的圖像

4.2.3對(duì)膚色圖進(jìn)行修補(bǔ)處理設(shè)計(jì)

se1=strel('square',35);%這個(gè)函數(shù)可以創(chuàng)建邊長(zhǎng)35的方形元素

f0=imclose(I,se1);%利用上面創(chuàng)建的方形元素,彌補(bǔ)imshow(I)中人臉中以及其他部分殘留的小塊黑色

figure,imshow(f0);

title('修補(bǔ)漏洞后的人臉');%顯示修補(bǔ)漏洞后的人臉

如圖4所示:

圖4修補(bǔ)漏洞后的人臉圖

4.2.4網(wǎng)格標(biāo)記圖像設(shè)計(jì)

對(duì)人臉圖像打上網(wǎng)格,對(duì)區(qū)域塊圖像做二值分析,通過像素比例來(lái)做處理,進(jìn)而得到人臉區(qū)域。

在彩色圖像中,顏色是人臉表面最為顯著的特征之一,利用顏色檢測(cè)人臉是很自然的想法。研究人員在考察了不同種族、不同個(gè)體的膚色后,認(rèn)為人類的膚色能在顏色空間中聚成單獨(dú)的一類,而影響膚色值變化的最主要因素是亮度變化。因此他們采用廣泛使用的RGB顏色空間,在濾去亮度值的圖像中通過比較像素點(diǎn)的r、g值與膚色范圍來(lái)推斷該像素點(diǎn)及其鄰域是否屬于人臉區(qū)域。除了RGB顏色空間,還有諸如HIS,LUV,GLHS等其它顏色空間被使用。尋找到膚色區(qū)域后,必須進(jìn)行驗(yàn)證,排除類膚色區(qū)域。利用膚色像素的連通性分割出區(qū)域,使用橢圓擬合各個(gè)區(qū)域,根據(jù)橢圓長(zhǎng)短軸的比率判斷是否為人臉。

BW=im2bw(f0,graythresh(f0));%二值化

figure,imshow(RGB);

title('網(wǎng)格標(biāo)記圖像','FontWeight','Bold');

holdon;

[xt,yt]=meshgrid(round(linspace(1,size(I,1),10)),...

round(linspace(1,size(I,2),10)));

mesh(yt,xt,zeros(size(xt)),'FaceColor',...

'None','LineWidth',3,...

'EdgeColor','r');

如圖5所示:

圖5網(wǎng)格標(biāo)記圖像圖

4.2.5人臉識(shí)別標(biāo)記

[n1,n2]=size(BW);

r=floor(n1/10);%分成10塊,行

c=floor(n2/10);%分成10塊,列

x1=1;x2=r;%對(duì)應(yīng)行初始化

s=r*c;%塊面積

fori=1:10

y1=1;y2=c;%對(duì)應(yīng)列初始化

forj=1:10

if(y2<=c||y2>=9*c)||(x1==1||x2==r*10)

%如果是在四周區(qū)域

loc=find(BW(x1:x2,y1:y2)==0);

[p,q]=size(loc);

pr=p/s*100;%黑色像素所占的比例數(shù)

ifpr<=100

f1(x1:x2,y1:y2)=0;

end

end

y1=y1+c;%列跳躍

y2=y2+c;%列跳躍

end

x1=x1+r;%行跳躍

x2=x2+r;%行跳躍

end

[L,num]=bwlabel(BW,8);%區(qū)域標(biāo)記

stats=regionprops(L,'BoundingBox');%得到包圍矩形框

Bd=cat(1,stats.BoundingBox);

[s1,s2]=size(Bd);

mx=0;

fork=1:s1

p=Bd(k,3)*Bd(k,4);%寬*高

ifp>mx&&(Bd(k,3)/Bd(k,4))<1.8%%%如果滿足面積塊大,而且寬/高<1.8

mx=p;

j=k;

end

end

figure,imshow(RGB);holdon;

rectangle('Position',Bd(j,:),...

'EdgeColor','r','LineWidth',3);

title('標(biāo)記圖像','FontWeight','Bold');

如圖6所示:

圖6人臉識(shí)別標(biāo)記圖

4.2.6對(duì)原圖像進(jìn)行臉部模糊處理

h1=ones(40,40)/1600;

I2=imfilter(RGB,h1);%對(duì)原圖像進(jìn)行全部模糊

%figure,imshow(I2);

a=Bd(j,:);%臉部標(biāo)記的矩形框的四個(gè)坐標(biāo)

fori=a(2)-0.5:a(2)-0.5+a(4);

forj=a(1)-0.5:a(1)-0.5+a(3);

RGB(i,j,:)=I2(i,j,:);%部分模糊的替換

end

end

figure,imshow(RGB);title('模糊后的人臉圖像');%顯示模糊后的人臉

如圖7所示:

圖7人臉模糊隱私保護(hù)圖

總結(jié)與致謝

通過本次設(shè)計(jì),培養(yǎng)了創(chuàng)新意識(shí)和綜合素質(zhì),更好地掌握了數(shù)字圖像處理設(shè)計(jì),提高個(gè)人基本能力、實(shí)驗(yàn)及設(shè)計(jì)能力和獨(dú)立工作能力,基本知識(shí)更加牢固,會(huì)編程調(diào)試、會(huì)查資料在設(shè)計(jì)的過程和設(shè)計(jì)說(shuō)明書的撰寫過程中,老師給予了我熱心的幫助和大力的支持,給我提了諸多的寶貴意見,拓寬了我的思路。

人臉檢測(cè)及識(shí)別算法研究近年來(lái)受到很大關(guān)注,同時(shí)也得到了很大的進(jìn)展。但是考慮到視頻處理的復(fù)雜程度,大多數(shù)檢測(cè)或識(shí)別率高的算法往往都要在計(jì)算上付出很大的代價(jià)而失去了使用價(jià)值。而本文提出的一種基于差分和膚色的人臉檢測(cè)算法,在計(jì)算量上大大減少,同時(shí)抑制背景噪聲。隨著硬件技術(shù)的進(jìn)步,采用攝像機(jī)的圖像系統(tǒng)的成本已經(jīng)不高,使得這種算法有大量應(yīng)用的條件,實(shí)驗(yàn)表明該算法具有可行性。

這一次做的圖像人臉區(qū)域隱私保護(hù)系統(tǒng)設(shè)計(jì)。原理看似簡(jiǎn)單,但過程讓我深深感受到再簡(jiǎn)單的圖像處理,理論與實(shí)際也會(huì)有一定的差入。在參考書設(shè)計(jì)原理的基礎(chǔ)上經(jīng)過了個(gè)人的改進(jìn),讓功能更完善,特別是程序的調(diào)試,花的時(shí)間最多,也是最難的一個(gè)地方。在此我向張運(yùn)楚、楊紅娟、張君捧老師致以崇高的敬意和衷心的感謝!

參考文獻(xiàn)

[1]王科俊,姚向輝.人臉圖像檢測(cè)與識(shí)別方法綜述[J].自動(dòng)化技術(shù)與應(yīng)用.2004,23(12).

[2]邢藏菊,曲延鋒,王守覺.靜態(tài)灰度圖像中的人臉快速檢測(cè)[J].計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)學(xué)報(bào).V01.14,No.May,2002.

[3]周杰,盧春雨,張長(zhǎng)水,等.人臉自動(dòng)識(shí)別方法綜述[J].電子學(xué)報(bào),2004(4):102-106.

[4]簡(jiǎn)(JainA.K.)[美],韓博,徐楓著.?dāng)?shù)字圖像處理基礎(chǔ)[M].北京:清華大學(xué)出版社,2006.

[5]岡薩雷斯.?dāng)?shù)字圖像處理(MATLAB)中文版[M].北京:電子工業(yè)出版社,2007.

[6]Castleman,K.R.[美]著,朱志剛等譯.?dāng)?shù)字圖像處理[M].北京:電子工業(yè)出版社,2002.

[7]朱虹.?dāng)?shù)字圖像處理基礎(chǔ)[M].北京:科學(xué)出版社,2005.

[8]劉志敏,揚(yáng)杰,施鵬飛.?dāng)?shù)學(xué)形態(tài)學(xué)的圖像分割算法[D].計(jì)算機(jī)工程與科學(xué),1998,20(4):21.

[9]章毓晉.圖像分割.北京:科學(xué)出版社,2001.

[10]王樹偉,楊鴝.Matlab6.5輔助圖像處理[M].電子工業(yè)出版社,2003.

附錄:系統(tǒng)設(shè)計(jì)程序

RGB=imread('face06.jpg');%face02,04,06

YCbCr=rgb2ycbcr(RGB);%將RGB色彩值變換為YcbCr色彩空間(將RGB真彩色圖像轉(zhuǎn)化為YcbCr色彩空間中相等的圖像)

Y=YCbCr(:,:,1);%這三行分別是Ycbcr空間的y,cb,cr對(duì)應(yīng)矩陣

Cb=YCbCr(:,:,2);

Cr=YCbCr(:,:,3);

imshow(RGB);title('原始圖像RGB');%原始圖像

figure,imshow(YCbCr);title('YcbCr色彩空間的圖像');%進(jìn)行將RGB色彩值變換為YcbCr色彩空間的圖像

I=RGB;

W=size(YCbCr,1);%y對(duì)應(yīng)矩陣寬大小

H=size(YCbCr,2);%y對(duì)應(yīng)矩陣高大小

k=(2.53/180)*pi;

m=sin(k);n=cos(k);%正余弦噪聲

%%%111111111111111111111111111

cx=109.38;cy=152.02;ecx=1.60;

ecy=2.41;a=25.39;b=14.03;%(cb=(100,140),cr=(70,160)這是閾值,這個(gè)閾值應(yīng)該是人臉膚色的范圍

fori=1:W

forj=1:H

ifY(i,j)<110

I(i,j,:)=0;

elseif(Y(i,j)<=200&&Y(i,j)>=110)

x=(double(Cb(i,j))-cx)*n+(double(Cr(i,j))-cy)*m;

y=(double(Cr(i,j))-cy)*n-(double(Cb(i,j))-cx)*m;

if((x-ecx)^2/a^2+(y-ecy)^2/b^2)<=1

I(i,j,:)=255;

elseI(i,j,:)=0;

end

elseifY(i,j)>200

x=(double(Cb(i,j))-cx)*n+(double(Cr(i,j))-cy)*m;

y=(double(Cr(i,j))-cy)*n-(double(Cb(i,j))-cx)*m;

if((x-ecx)^2/(1.1*a)^2+(y-ecy)^2/(1.1*b)^2)<=1

I(i,j,:)=255;%膚色部分變?yōu)榘咨?/p>

elseI(i,j,:)=0;%其余轉(zhuǎn)成黑色

end

end

end

end

figure,imshow(I);title('膚色區(qū)分后的圖像');%進(jìn)行將膚色識(shí)別后的黑白圖像

%%%1111111111111111111

%%%%%%%%%找到人臉區(qū)域并設(shè)為白色%%%%(r=35)

se1=strel('square',35);%這個(gè)函數(shù)可以創(chuàng)建邊長(zhǎng)35的方形元素

f0=imclose(I,se1);%利用上面創(chuàng)建的方形元素,彌補(bǔ)imshow(I)中人臉中以及其他部分殘留的小塊黑色

figure,imshow(f0);title('修補(bǔ)漏洞后的人臉');%顯示修補(bǔ)漏洞后的人臉

%%%44444444444444444444444444444

BW=im2bw(f0,graythresh(f0));%二值化

figure,imshow(RGB);

title('網(wǎng)格標(biāo)記圖像','FontWeight','Bold');

holdon;

[xt,yt]=meshgrid(round(linspace(1,size(I,1),10)),...

round(linspace(1,size(I,2),10)));

mesh(yt,xt,zeros(size(xt)),'FaceColor',...

'None','LineWidth',3,...

'EdgeColor','r');

[n1,n2]=size(BW);

r=floor(n1/10);%分成10塊,行

c=floor(n2/10);%分成10塊,列

x1=1;x2=r;%對(duì)應(yīng)行初始化

s=r*c;%塊面積

fori=1:10

y1=1;y2=c;%對(duì)應(yīng)列初始化

forj=1:10

if(y2<=c||y2>=9*c)||(x1==1||x2==r*10)

%如果是在四周區(qū)域

loc=find(BW(x1:x2,y1:y2)==0);

[p,q]=size(loc);

pr=p/s*100;%黑色像素所占的比例數(shù)

ifpr<=100

f1(x1:x2,y1:y2)=0;

end

end

y1=y1+c;%列跳躍

y2=y2+c;%列跳躍

end

x1=x1+r;%行跳躍

x2=x2+r;%行跳躍

end

[L,num]=bwlabel(BW,8);%區(qū)域標(biāo)記

stats=regionprops(L,'BoundingBox');%得到包圍矩形框

Bd=cat(1,stats.BoundingBox);

[s1,s2]=size(Bd);

mx=0;

fork=1:s1

p=Bd(k,3)*Bd(k,4);%寬*高

ifp>mx&&(Bd(k,3)/Bd(k,4))<1.8

%%%如果滿足面積塊大,而且寬/高<1.8

mx=p;

j=k;

end

end

figure,imshow(RGB);holdon;

rectangle('Position',Bd(j,:),...

'EdgeColor','r','LineWidth',3);

title('標(biāo)記圖像','FontWeight','Bold');

%%%44444444444444444444444444444

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%下面為圖像局部模糊

h1=ones(40,40)/1600;

I2=imfilter(RGB,h1);%對(duì)原圖像進(jìn)行全部模糊

%figure,imshow(I2);

a=Bd(j,:);%臉部標(biāo)記的矩形框的四個(gè)坐標(biāo)

fori=a(2)-0.5:a(2)-0.5+a(4);

forj=a(1)-0.5:a(1)-0.5+a(3);

%fori=60:233;%60:233

%forj=257:400;%257:400

RGB(i,j,:)=I2(i,j,:);%部分模糊的替換

end

end

figure,imshow(RGB);title('模糊后的人臉圖像');%顯示模糊后的人臉

附錄資料:不需要的可以自行刪除

C語(yǔ)言圖形模式速成

第一節(jié)

圖形模式的初始化

TurboC提供了非常豐富的圖形函數(shù),所有圖形函數(shù)的原型均在graphics.h中,本節(jié)主要介紹圖形模式的初始化、獨(dú)立圖形程序的建立、基本圖形功能、圖形窗口以及圖形模式下的文本輸出等函數(shù)。

另外,使用圖形函數(shù)時(shí)要確保有顯示器圖形驅(qū)動(dòng)程序*.BGI,同時(shí)將集成開發(fā)環(huán)境options/Linker中的Graphicslib選為on,只有這樣才能保證正確使用圖形函數(shù)。

不同的顯示器適配器有不同的圖形分辨率。即是同一顯示器適配器,在不同模式下也有不同分辨率。因此,在屏幕作圖之前,必須根據(jù)顯示器適配器種類將顯示器設(shè)置成為某種圖形模式,在未設(shè)置圖形模式之前,微機(jī)系統(tǒng)默認(rèn)屏幕為文本模式(80列,25行字符模式),此時(shí)所有圖形函數(shù)均不能工作。設(shè)置屏幕為圖形模式,可用下列圖形初始化函數(shù):

voidfarinitgraph(intfar*gdriver,intfar*gmode,char*path);

其中g(shù)driver和gmode分別表示圖形驅(qū)動(dòng)器和模式,path是指圖形驅(qū)動(dòng)程序所在的目錄路徑。有關(guān)圖形驅(qū)動(dòng)器、圖形模式的符號(hào)常數(shù)及對(duì)應(yīng)的分辨率見graphics.h。

圖形驅(qū)動(dòng)程序由TurboC出版商提供,文件擴(kuò)展名為.BGI。根據(jù)不同的圖形適配器有不同的圖形驅(qū)動(dòng)程序。例如對(duì)于EGA、VGA圖形適配器就調(diào)用驅(qū)動(dòng)程序EGAVGA.BGI。

#include"stdio.h"

#include"graphics.h"

intmain()

{

intgdriver,gmode;

gdriver=VGA;

gmode=VGAHI;

initgraph(&gdriver,&gmode,"C:\\TC2.0\\BGI");

bar3d(100,100,300,250,50,1);/*畫一長(zhǎng)方體*/

getch();

closegraph();

return0;

}

有時(shí)編程者并不知道所用的圖形顯示器適配器種類,或者需要將編寫的程序用于不同圖形驅(qū)動(dòng)器,TurboC提供了一個(gè)自動(dòng)檢測(cè)顯示器硬件的函數(shù),其調(diào)用格式為:

voidfardetectgraph(int*gdriver,*gmode);

其中g(shù)driver和gmode的意義與上面相同。

自動(dòng)進(jìn)行硬件測(cè)試后進(jìn)行圖形初始化:

#include"stdio.h"

#include"graphics.h"

intmain()

{

intgdriver,gmode;

detectgraph(&gdriver,&gmode);/*自動(dòng)測(cè)試硬件*/

printf("thegraphicsdriveris%d,modeis%d\n",gdriver,gmode);/*輸出測(cè)試結(jié)果*/

getch();

initgraph(&gdriver,&gmode,"C:\\TC2.0\\BGI");

/*根據(jù)測(cè)試結(jié)果初始化圖形*/

bar3d(100,100,300,250,50,1);/*畫一長(zhǎng)方體*/

getch();

closegraph();

return0;

}

上例程序中先對(duì)圖形顯示器自動(dòng)檢測(cè),然后再用圖形初始化函數(shù)進(jìn)行初始化設(shè)置,但TurboC提供了一種更簡(jiǎn)單的方法,即用gdriver=DETECT語(yǔ)句后再跟initgraph()函數(shù)就行了。

采用這種方法后,上例可改為:

#include"stdio.h"

#include"graphics.h"

intmain()

{

intgdriver=DETECT,gmode;

initgraph(&gdriver,&gmode,"C:\\TC2.0\\BGI");

bar3d(50,50,150,30,50,1);

getch();

closegraph();

return0;

}

另外,TurboC提供了退出圖形狀態(tài)的函數(shù)closegraph(),其調(diào)用格式為:

voidfarclosegraph(void);

第二節(jié)

屏幕顏色的設(shè)置和清屏函數(shù)

對(duì)于圖形模式的屏幕顏色設(shè)置,同樣分為背景色的設(shè)置和前景色的設(shè)置。在TurboC中分別用下面兩個(gè)函數(shù):

設(shè)置背景色:

voidfarsetbkcolor(intcolor);

設(shè)置作圖色:

voidfarsetcolor(intcolor);

其中color為圖形方式下顏色的規(guī)定數(shù)值,對(duì)EGA,VGA顯示器適配器,有關(guān)顏色的符號(hào)常數(shù)及數(shù)值見graphics.h。

清除圖形屏幕內(nèi)容但不清除圖形背景使用清屏函數(shù),其調(diào)用格式如下:

voidefarcleardevice(void);

#include"stdio.h"

#include"graphics.h"

intmain()

{

intgdriver,gmode,i,aa;

gdriver=DETECT;

initgraph(&gdriver,&gmode,"C:\\TC2.0\\BGI");/*圖形初始化*/

setbkcolor(0);/*設(shè)置圖形背景*/

cleardevice();

for(i=0;i<=15;i++)

{

setcolor(i);/*設(shè)置不同作圖色*/

circle(320,240,20+i*10);/*畫半徑不同的圓*/

getch();

}

for(i=0;i<=15;i++)

{

setbkcolor(i);/*設(shè)置不同背景色*/

cleardevice();

circle(320,240,20+i*10);

getch();

}

aa=getmaxcolor();

printf("maxcolor=%d",aa);

getch();

closegraph();

return0;

}

另外,TURBOC也提供了幾個(gè)獲得現(xiàn)行顏色設(shè)置情況的函數(shù)。

intfargetbkcolor(void);

返回現(xiàn)行背景顏色值。

intfargetcolor(void);

返回現(xiàn)行作圖顏色值。

intfargetmaxcolor(void);

返回最高可用的顏色值。

第三節(jié)

基本畫圖函數(shù)

基本圖形函數(shù)包括畫點(diǎn),線以及其它一些基本圖形的函數(shù)。本節(jié)對(duì)這些函數(shù)作一全面的介紹。

1、畫點(diǎn)

I.畫點(diǎn)函數(shù)

voidfarputpixel(intx,inty,intcolor);

該函數(shù)表示有指定的象元畫一個(gè)按color所確定顏色的點(diǎn)。對(duì)于顏色color的值可從表3中獲得而對(duì)x,y是指圖形象元的坐標(biāo)。

在圖形模式下,是按象元來(lái)定義坐標(biāo)的。對(duì)VGA適配器,它的最高分辨率為640x480,其中640為整個(gè)屏幕從左到右所有象元的個(gè)數(shù),480為整個(gè)屏幕從上到下所有象元的個(gè)數(shù)。屏幕的左上角坐標(biāo)為(0,0),右下角坐標(biāo)為(639,479),水平方向從左到右為x軸正向,垂直方向從上到下為y軸正向。TURBOC的圖形函數(shù)都是相對(duì)于圖形屏幕坐標(biāo),即象元來(lái)說(shuō)的。

關(guān)于點(diǎn)的另外一個(gè)函數(shù)是:

intfargetpixel(intx,inty);

它獲得當(dāng)前點(diǎn)(x,y)的顏色值。

II、有關(guān)坐標(biāo)位置的函數(shù)

intfargetmaxx(void);

返回x軸的最大值。

intfargetmaxy(void);

返回y軸的最大值。

intfargetx(void);

返回游標(biāo)在x軸的位置。

voidfargety(void);

返回游標(biāo)有y軸的位置。

voidfarmoveto(intx,inty);

移動(dòng)游標(biāo)到(x,y)點(diǎn),不是畫點(diǎn),在移動(dòng)過程中亦畫點(diǎn)。

voidfarmoverel(intdx,intdy);

移動(dòng)游標(biāo)從現(xiàn)行位置(x,y)移動(dòng)到(x+dx,y+dy)的位置,移動(dòng)過程中不畫點(diǎn)。

2、畫線

I.畫線函數(shù)

TURBOC提供了一系列畫線函數(shù):

voidfarline(intx0,inty0,intx1,inty1);

畫一條從點(diǎn)(x0,y0)到(x1,y1)的直線。

voidfarlineto(intx,inty);

畫一作從現(xiàn)行游標(biāo)到點(diǎn)(x,y)的直線。

voidfarlinerel(intdx,intdy);

畫一條從現(xiàn)行游標(biāo)(x,y)到按相對(duì)增量確定的點(diǎn)(x+dx,y+dy)的直線。

voidfarcircle(intx,inty,intradius);

以(x,y)為圓心,radius為半徑,畫一個(gè)圓。

voidfararc(intx,inty,intstangle,intendangle,intradius);

以(x,y)為圓心,radius為半徑,從stangle開始到endangle結(jié)束(用度表示)畫一段圓弧線。

在TURBOC中規(guī)定x軸正向?yàn)?度,逆時(shí)針方向旋轉(zhuǎn)一周,依次為90,180,270和360度(其它有關(guān)函數(shù)也按此規(guī)定,不再重述)。

voidellipse(intx,inty,intstangle,intendangle,intxradius,intyradius);

以(x,y)為中心,xradius,yradius為x軸和y軸半徑,從角stangle開始到endangle結(jié)束畫一段橢圓線,當(dāng)stangle=0,endangle=360時(shí),畫出一個(gè)完整的橢圓。

voidfarrectangle(intx1,inty1,intx2,inty2);

以(x1,y1)為左上角,(x2,y2)為右下角畫一個(gè)矩形框。

voidfardrawpoly(intnumpoints,intfar*polypoints);

畫一個(gè)頂點(diǎn)數(shù)為numpoints,各頂點(diǎn)坐標(biāo)由polypoints給出的多邊形。polypoints整型數(shù)組必須至少有2倍頂點(diǎn)數(shù)個(gè)無(wú)素。每一個(gè)頂點(diǎn)的坐標(biāo)都定義為x,y,并且x在前。值得注意的是當(dāng)畫一個(gè)封閉的多邊形時(shí),numpoints的值取實(shí)際多邊形的頂點(diǎn)數(shù)加一,并且數(shù)組polypoints中第一個(gè)和最后一個(gè)點(diǎn)的坐標(biāo)相同。

下面舉一個(gè)用drawpoly()函數(shù)畫箭頭的例子。

#include"stdio.h"

#include"graphics.h"

intmain()

{

intgdriver,gmode,i;

intarw[16]={200,102,300,102,300,107,330,

100,300,93,300,98,200,98,200,102};

gdriver=DETECT;

initgraph(&gdriver,&gmode,"C:\\TC2.0\\BGI");

setbkcolor(BLUE);

cleardevice();

setcolor(12);/*設(shè)置作圖顏色*/

drawpoly(8,arw);/*畫一箭頭*/

getch();

closegraph();

return0;

}

II、設(shè)定線型函數(shù)

在沒有對(duì)線的特性進(jìn)行設(shè)定之前,TURBOC用其默認(rèn)值,即一點(diǎn)寬的實(shí)線,但TURBOC也提供了可以改變線型的函數(shù)。

線型包括:寬度和形狀。其中寬度只有兩種選擇:一點(diǎn)寬和三點(diǎn)寬。而線的形狀則有五種。

下面介紹有關(guān)線型的設(shè)置函數(shù)。

voidfarsetlinestyle(intlinestyle,unsignedupattern,intthickness);

該函數(shù)用來(lái)設(shè)置線的有關(guān)信息,其中l(wèi)inestyle是線形狀的規(guī)定,見graphics.h。

對(duì)于upattern,只有l(wèi)inestyle選USERBIT_LINE時(shí)才有意義(選其它線型,uppattern取0即可)。此時(shí)uppattern的16位二進(jìn)制數(shù)的每一位代表一個(gè)象元,如果那位為1,則該象元打開,否則該象元關(guān)閉。

voidfargetlinesettings(structlinesettingstypefar*lineinfo);

該函數(shù)將有關(guān)線的信息存放到由lineinfo指向的結(jié)構(gòu)中,表中l(wèi)inesettingstype的結(jié)構(gòu)如下:

structlinesettingstype{

intlinestyle;

unsignedupattern;

intthickness;

}

例如下面兩句程序可以讀出當(dāng)前線的特性

structlinesettingstype*info;

getlinesettings(info);

voidfarsetwritemode(intmode);

該函數(shù)規(guī)定畫線的方式。如果mode=0,則表示畫線時(shí)將所畫位置的原來(lái)信息覆蓋了(這是TURBOC的默認(rèn)方式)。如果mode=1,則表示畫線時(shí)用現(xiàn)在特性的線與所畫之處原有的線進(jìn)行異或(XOR)操作,實(shí)際上畫出的線是原有線與現(xiàn)在規(guī)定的線進(jìn)行異或后的結(jié)果。因此,當(dāng)線的特性不變,進(jìn)行兩次畫線操作相當(dāng)于沒有畫線。

有關(guān)線型設(shè)定和畫線函數(shù)的例子如下所示。

#include"stdio.h"

#include"graphics.h"

intmain()

{

intgdriver,gmode,i;

gdriver=DETECT;

initgraph(&gdriver,&gmode,"C:\\TC2.0\\BGI");

setbkcolor(BLUE);

cleardevice();

setcolor(GREEN);

circle(320,240,98);

setlinestyle(0,0,3);/*設(shè)置三點(diǎn)寬實(shí)線*/

setcolor(2);

rectangle(220,140,420,340);

setcolor(WHITE);

setlinestyle(4,0xaaaa,1);/*設(shè)置一點(diǎn)寬用戶定義線*/

line(220,240,420,240);

line(320,140,320,340);

getch();

closegraph();

return0;

}

第四節(jié)

基本圖形的填充

填充就是用規(guī)定的顏色和圖模填滿一個(gè)封閉圖形。一般是先畫輪廓再填充。

TURBOC提供了一些先畫出基本圖形輪廓,再按規(guī)定圖模和顏色填充整個(gè)封閉圖形的函數(shù)。在沒有改變填充方式時(shí),TURBOC以默認(rèn)方式填充。

voidfarbar(intx1,inty1,intx2,inty2);

確定一個(gè)以(x1,y1)為左上角,(x2,y2)為右下角的矩形窗口,再按規(guī)定圖模和顏色填充。說(shuō)明:此函數(shù)不畫出邊框,所以填充色為邊框。

voidfarbar3d(intx1,inty1,intx2,inty2,intdepth,inttopflag);

當(dāng)topflag為非0時(shí),畫出一個(gè)三維的長(zhǎng)方體。當(dāng)topflag為0時(shí),三維圖形不封頂,實(shí)際上很少這樣使用。說(shuō)明:bar3d()函數(shù)中,長(zhǎng)方體第三維的方向不隨任何參數(shù)而變,即始終為45度的方向。

voidfarpieslice(intx,inty,intstangle,intendangle,intradius);

畫一個(gè)以(x,y)為圓心,radius為半徑,stangle為起始角度,endangle為終止角度的扇形,再按規(guī)定方式填充。當(dāng)stangle=0,endangle=360時(shí)變成一個(gè)實(shí)心圓,并在圓內(nèi)從圓點(diǎn)沿X軸正向畫一條半徑。

voidfarsector(intx,inty,intstanle,intendangle,intxradius,intyradius);

畫一個(gè)以(x,y)為圓心分別以xradius,yradius為x軸和y軸半徑,stangle為起始角,endangle為終止角的橢圓扇形,再按規(guī)定方式填充。

第五節(jié)

設(shè)定填充方式

TURBOC有四個(gè)與填充方式有關(guān)的函數(shù)。下面分別介紹:

voidfarsetfillstyle(intpattern,intcolor);

color的值是當(dāng)前屏幕圖形模式時(shí)顏色的有效值。pattern的值及與其等價(jià)的符號(hào)常數(shù)見graphics.h。

除USER_FILL(用戶定義填充式樣)以外,其它填充式樣均可由setfillstyle()函數(shù)設(shè)置。當(dāng)選用USER_FILL時(shí),該函數(shù)對(duì)填充圖模和顏色不作任何改變。之所以定義USER_FILL主要因?yàn)樵讷@得有關(guān)填充信息時(shí)用到此項(xiàng)。

voidfarsetfillpattern(char*upattern,intcolor);

設(shè)置用戶定義的填充圖模的顏色以供對(duì)封閉圖形填充。其中upattern是一個(gè)指向8個(gè)字節(jié)的指針。這8個(gè)字節(jié)定義了8x8點(diǎn)陣的圖形。每個(gè)字節(jié)的8位二進(jìn)制數(shù)表示水平8點(diǎn),8個(gè)字節(jié)表示8行,然后以此為模型向個(gè)封閉區(qū)域填充。

voidfargetfillpattern(char*upattern);

該函數(shù)將用戶定義的填充圖模存入upattern指針指向的內(nèi)存區(qū)域。

voidfargetfillsetings(structfillsettingstypefar*fillinfo);

獲得現(xiàn)行圖模的顏色并將存入結(jié)構(gòu)指針變量fillinfo中。其中fillsettingstype結(jié)構(gòu)定義如下:

structfillsettingstype{

intpattern;/*現(xiàn)行填充模式*/

intcolor;/*現(xiàn)行填充模式*/

};

有關(guān)圖形填充圖模的顏色的選擇,請(qǐng)看下面例程。

#include"stdio.h"

#include"graphics.h"

main()

{

charstr[8]={10,20,30,40,50,60,70,80};/*用戶定義圖模*/

intgdriver,gmode,i;

structfillsettingstypesave;

/*定義一個(gè)用來(lái)存儲(chǔ)填充信息的結(jié)構(gòu)變量*/

gdriver=DETECT;

initgraph(&gdriver,&gmode,"C:\\TC2.0\\BGI");

setbkcolor(BLUE);

cleardevice();

for(i=0;i<13;i++)

{

setcolor(i+3);

setfillstyle(i,2+i);/*設(shè)置填充類型*/

bar(100,150,200,50);/*畫矩形并填充*/

bar3d(300,100,500,200,70,1);/*畫長(zhǎng)方體并填充*/

pieslice(200,300,90,180,90);/*畫扇形并填充*/

sector(500,300,180,270,200,100);/*畫橢圓扇形并填充*/

getch();

}

cleardevice();

setcolor(14);

setfillpattern(str,RED);

bar(100,150,200,50);

bar3d(300,100,500,200,70,0);

pieslice(200,300,0,360,90);

sector(500,300,0,360,100,50);

getch();

getfillsettings(&save);

/*獲得用戶定義的填充模式信息*/

closegraph();

clrscr();

printf("Thepatternis%d,Thecoloroffillingis%d",

save.pattern,save.color);

/*輸出目前填充圖模和顏色值*/

getch();

}

第六節(jié)

任意封閉圖形的填充

截止目前為止,我們只能對(duì)一些特定形狀的封閉圖形進(jìn)行填充,但還不能對(duì)任意封閉圖形進(jìn)行填充。為此,TURBOC提供了一個(gè)可對(duì)任意封閉圖形填充的函數(shù),其調(diào)用格式如下:

voidfarfloodfill(intx,inty,intborder);

其中:x,y為封閉圖形內(nèi)的任意一點(diǎn),border為邊界的顏色,也就是封閉圖形輪廓的顏色。調(diào)用了該函數(shù)后,將用由函數(shù)setfillstyle()規(guī)定的顏色和模式填滿整個(gè)封閉圖形。

注意:

a.如果x或y取在邊界上,則不進(jìn)行填充。

b.如果不是封閉圖形則填充會(huì)從沒有封閉的地方溢出去,填滿其它地方。

c.如果x或y在圖形外面,則填充封閉圖形外的屏幕區(qū)域。

d.由border指定的顏色值必須與圖形輪廓的顏色值相同,但填充色可選任意顏色。

下例是有關(guān)floodfill()函數(shù)的用法,該程序填充了bar3d()所畫長(zhǎng)方體中其它兩個(gè)未填充的面。

#include"stdio.h"

#include"graphics.h"

main()

{

intgdriver,gmode;

structfillsettingstypesave;

gdriver=DETECT;

initgraph(&gdriver,&gmode,"C:\\TC2.0\\BGI");

setbkcolor(BLUE);

cleardevice();

setcolor(LIGHTRED);

setlinestyle(0,0,3);

setfillstyle(1,14);/*設(shè)置填充方式*/

bar3d(100,200,400,350,200,1);/*畫長(zhǎng)方體并填充*/

floodfill(450,300,LIGHTRED);

/*填充長(zhǎng)方體另外兩個(gè)面*/

floodfill(250,150,LIGHTRED);

rectangle(450,400,500,450);/*畫一矩形*/

floodfill(470,420,LIGHTRED);/*填充矩形*/

getch();

closegraph();

}

第七節(jié)屏幕操作函數(shù)

除了清屏函數(shù)以外,關(guān)于屏幕操作還有以下函數(shù):

voidfarsetactivepage(intpagenum);

voidfarsetvisualpage(intpagenum);

這兩個(gè)函數(shù)只用于EGA,VGA以及HERCULES圖形適配器。setctivepage()函數(shù)是為圖形輸出選擇激活頁(yè)。

所謂激活頁(yè)是指后續(xù)圖形的輸出被寫到函數(shù)選定的pagenum頁(yè)面,該頁(yè)面并不一定可見。setvisualpage()函數(shù)才使pagenum所指定的頁(yè)面變成可見頁(yè)。頁(yè)面從0開始(TurboC默認(rèn)頁(yè))。如果先用setactivepage()函數(shù)在不同頁(yè)面上畫出一幅幅圖像,再用setvisualpage()函數(shù)交替顯示,就可以實(shí)現(xiàn)一些動(dòng)畫的效果。

voidfargetimage(intxl,intyl,intx2,inty2,voidfar*mapbuf);

voidfarputimge(intx,int,y,void*mapbuf,intop);

unsinedfarimagesize(intxl,intyl,intx2,inty2);

這三個(gè)函數(shù)用于將屏幕上的圖像復(fù)制到內(nèi)存,然后再將內(nèi)存中的圖像送回到屏幕上。首先通過函數(shù)imagesize()測(cè)試要保存左上角為(xl,yl),右上角為(x2,y2)的圖形屏幕區(qū)域內(nèi)的全部?jī)?nèi)容需多少個(gè)字節(jié),然后再給mapbuf分配一個(gè)所測(cè)數(shù)字節(jié)內(nèi)存空間的指針。通過調(diào)用getimage()函數(shù)就可將該區(qū)域內(nèi)的圖像保存在內(nèi)存中,需要時(shí)可用putimage()函數(shù)將該圖像輸出到左上角為點(diǎn)(x,y)的位置上,其中g(shù)etimage()函數(shù)中的參數(shù)op規(guī)定如何釋放內(nèi)存中圖像。關(guān)于這個(gè)參數(shù)的定義參見下表。

對(duì)于imagesize()函數(shù),只能返回字節(jié)數(shù)小于64K字節(jié)的圖像區(qū)域,否則將會(huì)出錯(cuò),出錯(cuò)時(shí)返回-1。本節(jié)介紹的函數(shù)在圖像動(dòng)畫處理、菜單設(shè)計(jì)技巧中非常有用。

下面程序模擬兩個(gè)小球動(dòng)態(tài)碰撞過程。

#include"stdio.h"

#include"graphics.h"

#include"malloc.h"

intmain()

{

inti,gdriver,gmode,size;

void*buf;

gdriver=DETECT;

initgraph(&gdriver,&gmode,"C:\\TC2.0\\BGI");

setbkcolor(BLUE);

cleardevice();

setcolor(LIGHTRED);

setlinestyle(0,0,1);

setfillstyle(1,10);

circle(100,200,30);

floodfill(100,200,12);

size=imagesize(69,169,131,231);

buf=malloc(size);

if(!buf)return-1;

getimage(69,169,131,231,buf);

putimage(500,269,buf,COPY_PUT);

for(i=0;i<185;i++){

putimage(70+i,170,buf,COPY_PUT);

putimage(500-i,170,buf,COPY_PUT);

}

for(i=0;i<185;i++){

putimage(255-i,170,buf,COPY_PUT);

putimage(315+i,170,buf,COPY_PUT);

}

getch();

closegraph();

}

第八節(jié)用戶對(duì)文本字符大小的設(shè)置

前面介紹的settextstyle()函數(shù),可以設(shè)定圖形方式下輸出文本字符這字體和大小但對(duì)于筆劃型字體(除8*8點(diǎn)陣字以個(gè)的字體),只能在水平和垂直方向以相同的放大倍數(shù)放大。

為此TurboC2.0又提供了另外一個(gè)setusercharsize()函數(shù),對(duì)筆劃字體可以分別設(shè)置水平和垂直方向的放大倍數(shù)。該函數(shù)的調(diào)用格式為:

voidfarsetusercharsize(intmulx,intdivx,intmuly,intdivy);

該函數(shù)用來(lái)設(shè)置筆劃型字和放大系數(shù),它只有在settextstyle()函數(shù)中的charsize為0(或USER_CHAR_SIZE)時(shí)才起作用,并且字體為函數(shù)settextstyle()規(guī)定的字體。

調(diào)用函數(shù)setusercharsize()后,每個(gè)顯示在屏幕上的字符都以其缺省大小乘以mulx/divx為輸出字符寬,乘以muly/divy為輸出字符高。

#include"stdio.h"

#include"graphics.h"

intmain()

{

intgdriver,gmode;

gdriver=DETECT;

initgraph(&gdriver,&gmode,"C:\\TC2.0\\BGI");

setbkcolor(BLUE);

cleardevice();

setfillstyle(1,2);/*設(shè)置填充方式*/

setcolor(WHITE);/*設(shè)置白色作圖*/

rectangle(100,100,330,380);

floodfill(50,50,14);/*填充方框以外的區(qū)域*/

setcolor(12);/*作圖色為淡紅*/

settextstyle(1,0,8);/*三重筆劃字體,放大8倍*/

outtextxy(120,120,"VeryGood");

setusercharsize(2,1,4,1);

/*水平放大2倍,垂直放大4倍*/

setcolor(15);

settextstyle(3,0,5);

/*無(wú)襯字筆劃,放大5倍*/

outtextxy(220,220,"VeryGood");

setusercharsize(4,1,1,1);

settextstyle(3,0,0);

outtextxy(180,320,"Good");

getch();

closegraph();

return0;

}

第九節(jié)文本字體、字型和輸出方式的設(shè)置

有關(guān)圖形方式下的文本輸出函數(shù),可以通過setcolor()函數(shù)設(shè)置輸出文本的顏色。另外,也可以改變文本字體大小以及選擇是水平方向輸出還是垂直方向輸出。

voidfarsettexjustify(inthoriz,intvert);

該函數(shù)用于定位輸出字符串。對(duì)使用outtextxy(intx,inty,charfar*strtextstring)函數(shù)所輸出的字符串,其中哪個(gè)點(diǎn)對(duì)應(yīng)于定位坐標(biāo)(x,y)在TurboC2.0中是有規(guī)定的。如果把一個(gè)字符串看成一個(gè)長(zhǎng)方形的圖形,在水平方向顯示時(shí),字符串長(zhǎng)方形按垂直方向可分為頂部,中部和底部三個(gè)位置,水平方向可分為左,中,右三個(gè)位置,兩者結(jié)合就有9個(gè)位置。settextjustify()函數(shù)的第一個(gè)參數(shù)horiz指出水平方向三個(gè)位置中的一個(gè),第二個(gè)參數(shù)vert指出垂直方向三個(gè)位置中的一個(gè),二者就確定了其中一個(gè)位置。當(dāng)規(guī)定了這個(gè)位置后,用outtextxy()函數(shù)輸出字符串時(shí),字符串長(zhǎng)方形的這個(gè)規(guī)定位置就對(duì)準(zhǔn)函數(shù)中的(x,y)位置。而對(duì)用uttext()函數(shù)輸出字符串時(shí),這個(gè)規(guī)定的位置就位

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論