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

下載本文檔

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

文檔簡介

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

課程設(shè)計說明書

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

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

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

專業(yè):

班級:

學生姓名:

學號:

指導教師:

完成日期:2013年12月

目錄

摘要

3

1設(shè)計目的

3

2設(shè)計要求

3

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

3

3.1當前現(xiàn)狀

3

3.2系統(tǒng)概述

3

3.3人臉識別的常用方法

3

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

3

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

3

4.2軟件模塊設(shè)計

3

4.2.1圖像輸入設(shè)計

3

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

3

4.2.3對膚色圖進行修補處理設(shè)計

3

4.2.4網(wǎng)格標記圖像設(shè)計

3

4.2.5人臉識別標記

3

4.2.6對原圖像進行臉部模糊處理

3

總結(jié)與致謝

3

參考文獻

3

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

3

摘要

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

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

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

1設(shè)計目的

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

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

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

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

2設(shè)計要求

讀取人物圖像。

對圖像進行數(shù)字圖像處理。

3、對人臉識別。

4、對人臉進行模糊或者馬賽克處理。

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

3.1當前現(xiàn)狀

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

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

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

3.2系統(tǒng)概述

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

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

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

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

3.3人臉識別的常用方法

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

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

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

2、基于統(tǒng)計的人臉正面自動識別方法

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

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

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

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

讀取圖像

字圖像處理

圖像進行數(shù)

面部特征定位

人臉識別

人臉模糊處理

標出臉部

輸出處理后的圖像

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

4.2軟件模塊設(shè)計

4.2.1圖像輸入設(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對應(yīng)矩陣

Cb=YCbCr(:,:,2);

Cr=YCbCr(:,:,3);

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

figure,imshow(YCbCr);

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

如圖2所示:

原始圖像

YCbCr圖

圖2原圖像與YCbCr圖

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

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

1)

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

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

(5)

式中

M為均值;C為方差。

2)

選擇適當?shù)拈撝?,對圖像中的待檢測區(qū)域進行二值化處理。

3)

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

4)

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

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

代碼:

I=RGB;

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

H=size(YCbCr,2);%y對應(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)這是閾值,這個閾值應(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ū)分后的圖像');%進行將膚色識別后的黑白圖像

如圖3所示:

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

4.2.3對膚色圖進行修補處理設(shè)計

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

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

figure,imshow(f0);

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

如圖4所示:

圖4修補漏洞后的人臉圖

4.2.4網(wǎng)格標記圖像設(shè)計

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

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

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

figure,imshow(RGB);

title('網(wǎng)格標記圖像','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)格標記圖像圖

4.2.5人臉識別標記

[n1,n2]=size(BW);

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

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

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

s=r*c;%塊面積

fori=1:10

y1=1;y2=c;%對應(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ū)域標記

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('標記圖像','FontWeight','Bold');

如圖6所示:

圖6人臉識別標記圖

4.2.6對原圖像進行臉部模糊處理

h1=ones(40,40)/1600;

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

%figure,imshow(I2);

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

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人臉模糊隱私保護圖

總結(jié)與致謝

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

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

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

參考文獻

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

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

[3]周杰,盧春雨,張長水,等.人臉自動識別方法綜述[J].電子學報,2004(4):102-106.

[4]簡(JainA.K.)[美],韓博,徐楓著.數(shù)字圖像處理基礎(chǔ)[M].北京:清華大學出版社,2006.

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

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

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

[8]劉志敏,揚杰,施鵬飛.數(shù)學形態(tài)學的圖像分割算法[D].計算機工程與科學,1998,20(4):21.

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

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

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

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

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

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

Cb=YCbCr(:,:,2);

Cr=YCbCr(:,:,3);

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

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

I=RGB;

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

H=size(YCbCr,2);%y對應(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)這是閾值,這個閾值應(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ū)分后的圖像');%進行將膚色識別后的黑白圖像

%%%1111111111111111111

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

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

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

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

%%%44444444444444444444444444444

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

figure,imshow(RGB);

title('網(wǎng)格標記圖像','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;%對應(yīng)行初始化

s=r*c;%塊面積

fori=1:10

y1=1;y2=c;%對應(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ū)域標記

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('標記圖像','FontWeight','Bold');

%%%44444444444444444444444444444

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

h1=ones(40,40)/1600;

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

%figure,imshow(I2);

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

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語言圖形模式速成

第一節(jié)

圖形模式的初始化

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

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

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

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

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

圖形驅(qū)動程序由TurboC出版商提供,文件擴展名為.BGI。根據(jù)不同的圖形適配器有不同的圖形驅(qū)動程序。例如對于EGA、VGA圖形適配器就調(diào)用驅(qū)動程序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);/*畫一長方體*/

getch();

closegraph();

return0;

}

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

voidfardetectgraph(int*gdriver,*gmode);

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

自動進行硬件測試后進行圖形初始化:

#include"stdio.h"

#include"graphics.h"

intmain()

{

intgdriver,gmode;

detectgraph(&gdriver,&gmode);/*自動測試硬件*/

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

getch();

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

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

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

getch();

closegraph();

return0;

}

上例程序中先對圖形顯示器自動檢測,然后再用圖形初始化函數(shù)進行初始化設(shè)置,但TurboC提供了一種更簡單的方法,即用gdriver=DETECT語句后再跟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ù)

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

設(shè)置背景色:

voidfarsetbkcolor(intcolor);

設(shè)置作圖色:

voidfarsetcolor(intcolor);

其中color為圖形方式下顏色的規(guī)定數(shù)值,對EGA,VGA顯示器適配器,有關(guān)顏色的符號常數(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也提供了幾個獲得現(xiàn)行顏色設(shè)置情況的函數(shù)。

intfargetbkcolor(void);

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

intfargetcolor(void);

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

intfargetmaxcolor(void);

返回最高可用的顏色值。

第三節(jié)

基本畫圖函數(shù)

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

1、畫點

I.畫點函數(shù)

voidfarputpixel(intx,inty,intcolor);

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

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

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

intfargetpixel(intx,inty);

它獲得當前點(x,y)的顏色值。

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

intfargetmaxx(void);

返回x軸的最大值。

intfargetmaxy(void);

返回y軸的最大值。

intfargetx(void);

返回游標在x軸的位置。

voidfargety(void);

返回游標有y軸的位置。

voidfarmoveto(intx,inty);

移動游標到(x,y)點,不是畫點,在移動過程中亦畫點。

voidfarmoverel(intdx,intdy);

移動游標從現(xiàn)行位置(x,y)移動到(x+dx,y+dy)的位置,移動過程中不畫點。

2、畫線

I.畫線函數(shù)

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

voidfarline(intx0,inty0,intx1,inty1);

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

voidfarlineto(intx,inty);

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

voidfarlinerel(intdx,intdy);

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

voidfarcircle(intx,inty,intradius);

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

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

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

在TURBOC中規(guī)定x軸正向為0度,逆時針方向旋轉(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é)束畫一段橢圓線,當stangle=0,endangle=360時,畫出一個完整的橢圓。

voidfarrectangle(intx1,inty1,intx2,inty2);

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

voidfardrawpoly(intnumpoints,intfar*polypoints);

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

下面舉一個用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ù)

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

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

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

voidfarsetlinestyle(intlinestyle,unsignedupattern,intthickness);

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

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

voidfargetlinesettings(structlinesettingstypefar*lineinfo);

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

structlinesettingstype{

intlinestyle;

unsignedupattern;

intthickness;

}

例如下面兩句程序可以讀出當前線的特性

structlinesettingstype*info;

getlinesettings(info);

voidfarsetwritemode(intmode);

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

有關(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è)置三點寬實線*/

setcolor(2);

rectangle(220,140,420,340);

setcolor(WHITE);

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

line(220,240,420,240);

line(320,140,320,340);

getch();

closegraph();

return0;

}

第四節(jié)

基本圖形的填充

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

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

voidfarbar(intx1,inty1,intx2,inty2);

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

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

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

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

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

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

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

第五節(jié)

設(shè)定填充方式

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

voidfarsetfillstyle(intpattern,intcolor);

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

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

voidfarsetfillpattern(char*upattern,intcolor);

設(shè)置用戶定義的填充圖模的顏色以供對封閉圖形填充。其中upattern是一個指向8個字節(jié)的指針。這8個字節(jié)定義了8x8點陣的圖形。每個字節(jié)的8位二進制數(shù)表示水平8點,8個字節(jié)表示8行,然后以此為模型向個封閉區(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)圖形填充圖模的顏色的選擇,請看下面例程。

#include"stdio.h"

#include"graphics.h"

main()

{

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

intgdriver,gmode,i;

structfillsettingstypesave;

/*定義一個用來存儲填充信息的結(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);/*畫長方體并填充*/

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é)

任意封閉圖形的填充

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

voidfarfloodfill(intx,inty,intborder);

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

注意:

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

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

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

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

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

#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);/*畫長方體并填充*/

floodfill(450,300,LIGHTRED);

/*填充長方體另外兩個面*/

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);

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

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

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

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

unsinedfarimagesize(intxl,intyl,intx2,inty2);

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

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

下面程序模擬兩個小球動態(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é)用戶對文本字符大小的設(shè)置

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

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

voidfarsetusercharsize(intmulx,intdivx,intmuly,intdivy);

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

調(diào)用函數(shù)setusercharsize()后,每個顯示在屏幕上的字符都以其缺省大小乘以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);

/*無襯字筆劃,放大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ù)用于定位輸出字符串。對使用outtextxy(intx,inty,charfar*strtextstring)函數(shù)所輸出的字符串,其中哪個點對應(yīng)于定位坐標(x,y)在TurboC2.0中是有規(guī)定的。如果把一個字符串看成一個長方形的圖形,在水平方向顯示時,字符串長方形按垂直方向可分為頂部,中部和底部三個位置,水平方向可分為左,中,右三個位置,兩者結(jié)合就有9個位置。settextjustify()函數(shù)的第一個參數(shù)horiz指出水平方向三個位置中的一個,第二個參數(shù)vert指出垂直方向三個位置中的一個,二者就確定了其中一個位置。當規(guī)定了這個位置后,用outtextxy()函數(shù)輸出字符串時,字符串長方形的這個規(guī)定位置就對準函數(shù)中的(x,y)位置。而對用uttext()函數(shù)輸出字符串時,這個規(guī)定的位置就位

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論