摘 要: 許多領(lǐng)域在進(jìn)行圖片處理時(shí)都需要識(shí)別出圖片中的幾何圖形,,傳統(tǒng)的霍夫變換,、不變矩等識(shí)別方法都存在著耗費(fèi)大量系統(tǒng)內(nèi)存、計(jì)算速度慢等缺點(diǎn),?;诖耍岢鲆环N新的幾何圖形的識(shí)別方法,。介紹了該方法的實(shí)現(xiàn)原理和實(shí)現(xiàn)過程,。最后利用C++Builder編寫軟件對(duì)這種方法進(jìn)行了測(cè)試,證明了該方法的正確性和可靠性,。
關(guān)鍵詞: 幾何圖形,;識(shí)別;像素
在計(jì)算機(jī)視覺領(lǐng)域中,,如何從當(dāng)前的圖像中提取出所需要的特征信息是圖像識(shí)別的關(guān)鍵所在,。在許多應(yīng)用場(chǎng)合中需要快速準(zhǔn)確地識(shí)別出圖像中的幾何圖形(如圓、矩形,、三角形等),,從而進(jìn)行更深一步的操作。例如:在基于圖像處理的自動(dòng)報(bào)靶系統(tǒng)中,,對(duì)靶環(huán)的識(shí)別就屬于這一類應(yīng)用[1],。在這些應(yīng)用領(lǐng)域,許多學(xué)者提出了多種方法,,如霍夫變換,、不變矩、骨架構(gòu)造識(shí)別等,。這些傳統(tǒng)的識(shí)別方法雖然檢測(cè)的準(zhǔn)確性很高而且算法成熟,,但在進(jìn)行幾何圖形識(shí)別時(shí)都存在需要耗費(fèi)大量系統(tǒng)內(nèi)存、計(jì)算速度較慢等缺點(diǎn),,并不適合要求對(duì)幾何圖形進(jìn)行快速檢測(cè)的領(lǐng)域[2-3],。因此,本文提出了一種全新的基于幾何圖形(周長(zhǎng),、面積以及頂點(diǎn)個(gè)數(shù))的圖形識(shí)別方法,。經(jīng)過測(cè)試,該方法可以快速有效地檢測(cè)出一幅圖片中的幾何圖形并給出該圖形的周長(zhǎng),、面積等參數(shù),。
1 圖形識(shí)別的基本原理
一般情況下,從客觀景物得到的圖像是二維的,,可以用一個(gè)二維數(shù)組f(x,,y)來表示,。x、y表示二維空間中一個(gè)坐標(biāo)點(diǎn)的位置,,而f(x,,y)則是代表圖像在點(diǎn)(x,y)的某種性質(zhì)的數(shù)值,。為了能用計(jì)算機(jī)對(duì)圖像進(jìn)行加工,,需要把連續(xù)的圖像在坐標(biāo)空間(x,y)和性質(zhì)空間F都離散化,,這種離散化的圖像是數(shù)字圖像,可以用I(x,,c)來表示,。I(x,c)代表離散后的f(x,,y),。為了方便,本方法仍用f(x,,y)代表數(shù)字圖像,,圖像中每個(gè)基本單元稱為圖像元素(簡(jiǎn)稱像素)。一幅圖像必須在空間和灰度上都離散化才能被計(jì)算機(jī)處理,??臻g坐標(biāo)的離散化稱為空間采樣。假設(shè)用一個(gè)m×n維的數(shù)組中等距地采樣來近似表示一幅連續(xù)圖像f(x,,y),,即[4]:
式中,每個(gè)元素都是一個(gè)離散變量,,其右邊的矩陣代表數(shù)字圖像,,數(shù)組的每個(gè)元素即對(duì)應(yīng)像素。由此可見,,對(duì)圖片的處理實(shí)際上是對(duì)組成圖片的像素進(jìn)行操作,。在實(shí)際的檢測(cè)中,一般是根據(jù)幾何圖形所在區(qū)域的像素點(diǎn)的灰度級(jí)別與圖片背景的像素點(diǎn)的灰度級(jí)別存在的差異,,將屬于幾何圖形的像素點(diǎn)檢測(cè)出來,。對(duì)于規(guī)則幾何圖形的識(shí)別,本文所提出的算法是根據(jù)幾何圖形的周長(zhǎng),、面積以及頂點(diǎn)個(gè)數(shù)來判斷,。下面介紹圓形、矩形(其他普通四邊形也適用),、三角形的識(shí)別原理,。
由灰度比值可知,該比值只有一個(gè)確定的下限,而無確定的上限,,因此,,不能利用周長(zhǎng)的平方與面積的比對(duì)矩形進(jìn)行識(shí)別。但矩形也有其特殊的地方,,即它有4個(gè)頂點(diǎn),,而且只有4個(gè)頂點(diǎn)。只要對(duì)所檢測(cè)的圖形的邊界點(diǎn)進(jìn)行判斷并計(jì)算頂點(diǎn)的個(gè)數(shù),,如果個(gè)數(shù)等于4,,則為矩形(或其他四邊形);否則就為其他幾何圖形,。與圓形的識(shí)別相類似,,在對(duì)矩形的實(shí)際檢測(cè)過程中也可能會(huì)出現(xiàn)頂點(diǎn)個(gè)數(shù)不為4的現(xiàn)象,這是由于圖形繪制不規(guī)范所造成的,。但只要對(duì)已經(jīng)檢測(cè)出來的頂點(diǎn)再進(jìn)行一次“同鄰域”判斷,,看其中是否有些頂點(diǎn)屬于同一個(gè)鄰域范圍(一般為8鄰域),如果有,,只留下一個(gè)而將其他的去除,,這樣就可以對(duì)結(jié)果進(jìn)行很好的修正,從而可避免錯(cuò)誤檢測(cè)的出現(xiàn),。利用這種方法就可以很好地識(shí)別出所檢測(cè)的圖形為矩形,。
(3)三角形:三角形的識(shí)別與矩形的識(shí)別方法相類似,也是利用頂點(diǎn)的個(gè)數(shù)來判斷圖形所屬的幾何形狀,,這里不再贅述,。
2 圖形識(shí)別的實(shí)現(xiàn)過程
利用計(jì)算機(jī)進(jìn)行圖形識(shí)別的過程如圖1所示。
2.1 預(yù)處理
從圖1可以看出,,對(duì)一幅圖片進(jìn)行操作之前需進(jìn)行必要的預(yù)處理,,這是因?yàn)閳D片在繪制過程中或輸入到計(jì)算機(jī)的過程中可能引入噪聲。通常的預(yù)處理過程包括灰度化處理,、二值化處理,、平滑、濾波等,。其步驟如下:
(1)灰度化:圖片實(shí)際上是一個(gè)像素的二維數(shù)組,,其中每個(gè)像素的顏色由構(gòu)成這種顏色的紅(R)、綠(G),、藍(lán)(B)三種基本色的分量來表示,。以真彩圖片為例,典型情況下,,顏色的每個(gè)組分都用一個(gè)字節(jié)來表示,,因此為每種顏色組分提供了256個(gè)級(jí)別,。這種方法為每個(gè)像素使用3 B,允許達(dá)到256×256×256=16 777 216或1 600萬種RGB值(顏色),。由于彩色信息的區(qū)分度不高,,如果直接對(duì)彩色圖片的像素進(jìn)行操作,所得到的檢測(cè)結(jié)果精度也不高,。而將圖片進(jìn)行灰度處理后,,圖片以亮度信息為主要信息,彩色信息為次要信息,,則可以在很大程度上提高檢測(cè)精度,,因此需將圖片進(jìn)行灰度處理,把彩色圖片轉(zhuǎn)換成為灰度圖,?;叶葓D形處理采用的方法有:最大值轉(zhuǎn)換法、平均值轉(zhuǎn)換法,、黃金權(quán)重轉(zhuǎn)換法等,本文在進(jìn)行灰度處理時(shí)采用的是最大值(亮度)轉(zhuǎn)換法,。經(jīng)過這種方法處理后的圖片每一個(gè)像素的RGB值都是相同的,,即RGB值的范圍從(0,0,,0),、(1,1,,1)一直到(255,,255,255),。其中,,(0,0,,0)是全黑色,,(255,255,,255)是全白色,,中間的是灰色[5]。實(shí)現(xiàn)這個(gè)過程的部分源代碼為:
//利用GetxValue取出每一個(gè)點(diǎn)的像素的RGB值
r=GetRValue(color1),;
g=GetGValue(color1),;
b=GetBValue(color1);
//找出RGB值中最大的值
np=r>g,?r:g,;
np=np>b,?np:b;
//將圖片變?yōu)榱炼茸罡叩幕叶葓D
Image1->Picture->Bitmap->Canvas->Pixels[i][j]=
TColor(RGB(np,,np,,np));
(2)二值化:雖然經(jīng)過灰度處理后圖片的主要信息僅為亮度信息,,但有效檢測(cè)區(qū)域的像素點(diǎn)的灰度級(jí)別并不統(tǒng)一,。因此,灰度處理后往往還需要對(duì)圖片再進(jìn)行二值化處理,,以使所要檢測(cè)的幾何圖形的區(qū)域變?yōu)檩^深的顏色,,背景的部分變?yōu)檩^淺的顏色。這樣可以更進(jìn)一步加強(qiáng)區(qū)分度,,提高檢測(cè)的精度[6],。本文所使用的二值化方法為大律法,大律法又稱最大類間方差法,,其處理原理為:取某個(gè)灰度值,,以它為分界點(diǎn)將圖像分為灰度值大小的兩類,分別計(jì)算這兩類中的像素點(diǎn)數(shù)及灰度平均值,;然后,,計(jì)算它們的類間方差;最后取所有灰度的類間方差中的最大值對(duì)應(yīng)的灰度為閾值,。類間方差的計(jì)算公式如下:
w(i)=n1(i)n2(i)(v1(i)-v2(i))2
其中,,n1(i)、n2(i)分別為灰度小于i的像素以及大于等于i的像素的個(gè)數(shù),,v1(i),、v2(i)分別為灰度的平均值。
實(shí)現(xiàn)這個(gè)過程的部分源代碼為:
//二值化處理
for(i=0,;i<w,;i++)
{ for(j=0;j<h,;j++)
{
color=Image1->Picture->Bitmap->Canvas->
Pixels[i][j],;
ave=Dalu(gray);
if(GetRValue(color)>ave)
//將背景點(diǎn)變?yōu)榘咨?br />
Image1->Picture->Bitmap->Canvas->Pixels[i][j]=
TColor(RGB(255,,255,,255));
Else
//將幾何圖形區(qū)域變?yōu)楹谏?br />
Image1->Picture->Bitmap->Canvas->Pixels[i][j]=
TColor(RGB(0,,0,,0));
}
}
(3)平滑和濾波,。在進(jìn)行完步驟(1),、(2)的預(yù)處理后,,如果幾何圖形還是不十分明顯,可以用高斯平滑濾波器和拉普拉斯銳化濾波器結(jié)合計(jì)算即可得到幾何圖形突出的圖片[7],。
2.2 特征提取
完成圖片的預(yù)處理后,,即可進(jìn)行圖片的特征提取。由于是規(guī)則的幾何圖形,,因此所要提取的特征信息即為幾何圖形的周長(zhǎng),、面積和頂點(diǎn)的個(gè)數(shù)。計(jì)算圖形周長(zhǎng)和頂點(diǎn)個(gè)數(shù)時(shí)用的是Laplace邊緣檢測(cè)算法,。Laplace算法有兩類:正相Laplace算法和反相Laplace算法,,兩者都反映了一類邊緣,但其所用模板和參數(shù)不同[8],。假設(shè)一個(gè)3×3鄰域內(nèi)的像素分布如圖2所示,,設(shè)LP、LN分別為正相Laplace算法和反相Laplace算法的處理結(jié)果,,其計(jì)算公式如下:
LP=[f(A0)+f(A1)+…+f(A7)]-8f(C)
LN=8f(C)-[f(A0)+f(A1)+…+f(A7)]
這兩個(gè)公式也可用卷積模板來表示,,如圖3(b)、(c)所示,。由圖可知,,邊緣檢測(cè)模板中各因子之和為0,其物理意義是:在圖像的均勻區(qū)域處理輸出為0,,在像素?cái)?shù)據(jù)有突變的地方則輸出較大的值。以此來檢測(cè)圖像中的邊緣,。
用Laplace邊緣檢測(cè)算法對(duì)幾何圖形進(jìn)行檢測(cè)完成后,,累加邊界點(diǎn)的個(gè)數(shù)即為幾何圖形的周長(zhǎng)。然后再對(duì)這些邊界點(diǎn)進(jìn)行進(jìn)一步區(qū)分,,找出頂點(diǎn),。檢測(cè)幾何圖形的面積則要簡(jiǎn)單得多,只要統(tǒng)計(jì)出有效檢測(cè)區(qū)域內(nèi)所有符合條件的點(diǎn)即為幾何圖形的面積,。實(shí)現(xiàn)這個(gè)過程的部分源代碼為:
//計(jì)算周長(zhǎng),、面積和頂點(diǎn)
int x,y,,sum=0,;
for(i=0;i<w,;i++)
{ for(j=0,;j<h;j++)
{
color=Image1->Picture->Bitmap->Canvas->
Pixels[i][j],;
if(GetRValue(color)==0)
{ mianji++,; //計(jì)算面積
if(Laplace(GetRValue(color)))
zhouchang++,; //計(jì)算周長(zhǎng)
if(Dingdian(GetRValue(color)))
dingdian++; //計(jì)算頂點(diǎn)
}
}
}
2.3 分析判斷
在完成圖像的預(yù)處理和特征提取之后,,便可以開始根據(jù)特征信息對(duì)幾何圖形的形狀進(jìn)行判斷,。在這個(gè)過程中首先判斷幾何圖形是否為圓形,即判斷這個(gè)圖形周長(zhǎng)的平方與面積的比是否在規(guī)定的范圍內(nèi),。如果在,,則為圓形;否則,,再判斷頂點(diǎn)的個(gè)數(shù),,等于3即為三角形,等于4即為矩形,。在識(shí)別幾何圖形形狀的同時(shí)還可輸出這個(gè)圖形的周長(zhǎng)和面積,。因?yàn)橐?guī)則幾何圖形的周長(zhǎng)、面積和頂點(diǎn)坐標(biāo)已知,,故可計(jì)算出邊長(zhǎng),、形心等參數(shù)。實(shí)現(xiàn)這個(gè)過程的部分源代碼為:
//根據(jù)周長(zhǎng)的平方與面積的比以及頂點(diǎn)的個(gè)數(shù)確定圖形的形狀
float ratio,;
ratio=(zhouchang*1.0*zhouchang*1.0)/mianji*1.0,;
//判斷是否為圓形
if(ratio>=9&&ratio<=15)
Edit1->Text="圓形或橢圓";
else
{
//判斷是否為三角形
if(dingdian==3)
Edit1->Text="三角形",;
//判斷是否為矩形
if(dingdian==4)
Edit1->Text="矩形",;
}
//輸出面積和周長(zhǎng)
Edit2->Text=mianji;
Edit3->Text=zhouchang,;
基于上述的基本原理和實(shí)現(xiàn)過程,,利用C++ Builder6.0編寫軟件,幾何圖形識(shí)別結(jié)果如圖4所示[9],。從識(shí)別結(jié)果可知,,本文所述的方法可以快速而準(zhǔn)確地識(shí)別出圖像中的規(guī)則幾何圖形,從而證明了該法的可行性和正確性,。
與傳統(tǒng)的檢測(cè)方法相比,,本文提出的基于幾何圖形周長(zhǎng)、面積和頂點(diǎn)個(gè)數(shù)的檢測(cè)方法可以很好地識(shí)別出幾何圖形的形狀,,并能給出邊長(zhǎng),、形心等其他參數(shù),且識(shí)別速度快,、準(zhǔn)確率高,。但這種識(shí)別方法也存在一些不足,它的識(shí)別對(duì)象只是幾種簡(jiǎn)單的規(guī)則幾何圖形,,無法識(shí)別復(fù)雜的不規(guī)則幾何圖形,。這些不足還有待于在日后的研究中不斷克服,,以使這種檢測(cè)方法能夠更加穩(wěn)定實(shí)用。
參考文獻(xiàn)
[1] 顧筠.基于霍夫變換和幾何特性的圖像識(shí)別方法[J].自動(dòng)化博覽,,2002,,8(1):86-88.
[2] 邱桑敏.一種快速霍夫變換算法[J].計(jì)算機(jī)工程,2004,,1(2):148-150.
[3] 李海軍,,寧玉富.規(guī)則幾何圖形的識(shí)別分析與算法實(shí)現(xiàn)[J].常熟理工學(xué)院學(xué)報(bào),2007,,4(4):111-115.
[4] 董莉,,王玲,江沸波.一種基于醫(yī)學(xué)圖像中感興趣區(qū)域的數(shù)字水印算法[J].電子技術(shù)應(yīng)用,,2007,,33(1):136-139.
[5] 高士忠,盧易楓,,蔡振偉,,等.基于灰度共生矩陣的簾子布疵點(diǎn)檢測(cè)研究[J].電子技術(shù)應(yīng)用,2008,,34(1):117-119.
[6] 劉玉紅,,熊興良.圖像的帶參二值化理論和技術(shù)及其應(yīng)用[J].計(jì)算機(jī)應(yīng)用研究,2008,,25(1):277-280.
[7] 魯志波,,王鑫,胡國恩.結(jié)合結(jié)構(gòu)張量和Wiener濾波的圖像去噪算法[J].計(jì)算機(jī)科學(xué),,2007,,34(7):229-231.
[8] 劉佳,肖曉明,,彭駿馳.基于改進(jìn)的Laplacian算子的圖像邊緣檢測(cè)[J].電子技術(shù)應(yīng)用,2006,,32(11):31-32.
[9] 蒙祖強(qiáng),,龔濤.C++ Builder程序員成長(zhǎng)攻略[M].北京:中國水利水電出版社,2007.