計算機應用基礎畢業(yè)論文---簡單幾何圖形的識別和編輯_第1頁
已閱讀1頁,還剩30頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  第一章 概述…………………………………………………………4</p><p>  第(一)節(jié) 引言………………………………………………4</p><p>  犯得上法境………………………………6</p><p>  第(一)節(jié) 數(shù)字圖像處理技術…………………………………6</p><p>  1. 圖像全 處理的基

2、本內A ………………………………………6</p><p>  2. 主要的圖像處理技術 ………………………………………… 6</p><p>  第(二)節(jié) 圖像格式-BMP格式………………………… 7</p><p>  第三節(jié) 算法及數(shù)學基礎……………………………………………8</p><p>  1. 霍夫變換(Hough Tr

3、ansform)……………………………… 8</p><p>  2. 基于單義域的直線及圓識別算法……………………………11</p><p>  3. 主要技術………………………………………………………14</p><p>  第三章 直線和圓的識別和編輯的實現(xiàn)……………………………15</p><p>  第(一)節(jié) 系統(tǒng)的層次結構

4、的圖示……………………………15</p><p>  第(二)節(jié) 系統(tǒng)數(shù)據(jù)結構及類的設計…………………………16</p><p>  1. 主要類的層次結構………………………………………………16</p><p>  2. 圖形基類(CShape)…………………………………………17</p><p>  3. 圖形類(CLine、CC

5、ircle)…………………………………18</p><p>  4. 圖形容器類(CShapes)………………………………………20</p><p>  5. 點類(CPoint)………………………………………………21</p><p>  6. 單義域類(CSegment)………………………………………21</p><p>  7.

6、 基于單義域識別類(CSegments)……………………………22</p><p>  8. 霍夫變換識別直線類(CHTLine)……………………………23</p><p>  9. 霍夫變換識別圓類(CHTCircle)…………………………… 23</p><p>  第(三)節(jié) 系統(tǒng)功能介紹……………………………………… 24</p><

7、;p>  第四章 總結及展望…………………………………………………29</p><p>  附錄1:參考文獻……………………………………………………30</p><p>  附錄2: 結束語……………………………………………………32</p><p><b>  概述</b></p><p><b>

8、  引言</b></p><p>  本論文實現(xiàn)的是基礎的圖形識別,bmp圖像文件格式中對圖形的矢量化。識別基本的圖元直線和圓。直線和圓是二值圖像中最基本的組成元素,也是最常見的圖形元素。在工程圖的數(shù)字化識別中有很大的應用。</p><p>  關于理想情況的幾點說明:</p><p>  所識別的bmp圖像文件是經(jīng)過處理的,沒有“噪音”等,在本論文中直

9、接采用的是用Windows中的畫圖軟件畫出的圖像。</p><p>  本論文中圖像中的圖元都是單一的線性,即線寬是一個象素的情況。</p><p>  在工程圖的識別中常用的方法</p><p>  圖形的識別最主要的是圖形特征的提取,在這個階段,常用的方法是全局特征方法(包括:不變距,自回歸模型、傅立葉描述符、霍夫變換等),全局特征的特征提取方法是理論比較完善的

10、,計算過程比較清楚。針對不同的特征提取處理,采用相對應的模式匹配方法來將圖形分類,模式識別迄今已有很多方法,有模板匹配、統(tǒng)計模式識別、句法模式識別、模糊識別和神經(jīng)網(wǎng)絡識別等。</p><p>  在二值圖像的處理中,人們常用的數(shù)據(jù)結果有游程編碼-考慮了掃描行上相鄰象素間的相關性;行相鄰圖法(Line Adjeceney Gragh),是由Pavlidis提出的一種二值圖的數(shù)據(jù)結構,LAG還考慮了相鄰行黑游程之間的

11、相鄰關系,遍歷時很方便;BAG(Bloek Adjeceney Gragh)是由余斌提出的,它是相鄰圖LAG在兩個方向上的推廣。在本論文中就是利用了LAG的數(shù)據(jù)結構思想與c++ builder的數(shù)據(jù)結構相結合的方法即:用下一個象素點是與鏈表頭相鄰還是和尾相鄰來描述其相鄰的關系。</p><p>  本論文中對交點的處理。目前對交點的處理有下面幾類算法:</p><p>  基于網(wǎng)格算法,該

12、算法是通過網(wǎng)格加大搜索步長來跳過交點。</p><p>  基于圖段合并的算法,是根據(jù)交點處行程段的連通性,以交點為界將圖線分割成圖段,記錄各段之間的連接及從屬關系,然后連接或延長各分支圖段,然后得到整條圖線。</p><p>  在本論文中采用了第二種方法,基于圖段合并的算法。</p><p>  當然現(xiàn)下有很多更好的算法和數(shù)據(jù)結構,但是大部分是針對具體的結構或者

13、研究方向不具有一般性,所以本論文的實現(xiàn)用了上述的數(shù)據(jù)結構和方法。</p><p>  論文的工作基礎和工作環(huán)境</p><p><b>  數(shù)字圖像處理技術</b></p><p>  將客觀世界實體或圖片等通過不同的量化(數(shù)字化)手段送入計算機,由計算機按使用要求進行圖像的平滑、增強、復原、分割、重建、編碼、存儲、傳輸?shù)确N種不同的處理,需要時

14、把加工處理后的圖像重新輸出,這個過程稱為圖像處理。因此,圖像處理的含義是用計算機對圖像進行加工處理以得到某種預期的效果,它本質上是一種二維數(shù)字信號處理技術。</p><p><b>  圖像處理的基本內容</b></p><p>  圖像處理的基本內容可以歸結為:</p><p>  對圖像進行增強或修改。</p><p&g

15、t;  以改變或強調圖像信息的某些特點(增強有用信息,無用信息),改善圖像的視覺質量;</p><p>  描述圖像的特征并進行特征抽取和分析。</p><p>  例如提取圖像的紋理特征、頻譜特征、邊界特征和顏色特征等;對像素用某個標準衡量并進行分類比較,將抽取的特征歸結為一定的模式,這屬于模式識別的范圍;</p><p>  圖像的重建(Reconstructi

16、on)。</p><p>  對圖像的某些部分合并或進行重新組織,這種技術是從N—1維的信息用某種算法得到N維的圖像,例如計算機視覺就是這樣的一種技術。</p><p><b>  主要的圖像處理技術</b></p><p><b>  圖像的增強和恢復</b></p><p>  圖像增強所追求的

17、目標是改善圖像的視覺質量,符合人們的主觀要求,它不追究圖像客觀質量的降低原因。圖像的視覺質量是因人而異的,其質量的高低和好壞受觀看者的心理、愛好和文化素質等因素的影響。圖像的恢復則致力于探索圖像質量降低的原因,并盡可能消除圖像質量的降低,恢復圖像的本來面目。</p><p><b>  圖像的壓縮編碼</b></p><p>  彩色數(shù)字圖像通常是由三個二維數(shù)組組成的

18、,其信息量相當大,這給圖像的傳輸、處理、存儲和顯示等帶來很大的負擔。但問題的另一方面是圖像中又往往存在很多冗余信息,在傳輸和存儲時可以對數(shù)字圖像進行一定方式的編碼,刪除圖像中的冗余信息,以提高圖像傳輸和存儲的效率。</p><p><b>  圖像重建</b></p><p>  在醫(yī)學和工程應用中,利用超聲波、x射線等技術取得物體的多幅來自不同角度的投影圖,通過計算

19、可得到物缽內部的圖像,這種技術稱為投影重建,例如CT就是圖像重建的一個應用。</p><p><b>  圖像的分割和描述</b></p><p>  計算機按照一定的客觀測度(例如灰度、顏色和幾何性質等)將圖像中包含的物體和區(qū)域從圖像中區(qū)分出來,稱為圖像的分割。用適當?shù)臄?shù)學語言來表示被分割出來的物體或區(qū)域的結構和統(tǒng)計特性,或用數(shù)學語言表示區(qū)域問的關系,稱為描述。圖像

20、經(jīng)分別和描述后,可較為容易地分類和識別。</p><p>  圖像格式-BMP格式</p><p>  BMP(Bitmap-File)圖形文件是Windows采用的圖形文件格式,在Windows環(huán)境下運行的所有圖像處理軟件都支持BMP圖像文件格式。Windows系統(tǒng)內部各圖像繪制操作都是以BMP為基礎的。Windows 3.0以前的BMP圖文件格式與顯示設備有關,因此把這種BMP圖像文件

21、格式稱為設備相關位圖DDB(device-dependent bitmap)文件格式。Windows 3.0以后的BMP圖像文件與顯示設備無關,因此把這種BMP圖像文件格式稱為設備無關位圖DIB(device-independent bitmap)格式,目的是為了讓Windows能夠在任何類型的顯示設備上顯示所存儲的圖像。BMP位圖文件默認的文件擴展名是BMP或者bmp(有時它也會以.DIB或.RLE作擴展名)。</p>

22、<p><b>  文件結構</b></p><p>  位圖文件可看成由4個部分組成:位圖文件頭(bitmap-file header)、位圖信息頭(bitmap-information header)、彩色表(color table)和定義位圖的字節(jié)陣列,它具有如下所示的形式。 </p><p><b>  算法及數(shù)學基礎</b>&

23、lt;/p><p>  霍夫變換(Hough Transform)</p><p>  霍夫變換是圖像處理中從圖像中識別幾何形狀的基本方法之一。其基本思想就是把圖像平面上的點對應到參數(shù)平面上的曲線,最后通過統(tǒng)計特性來解決問題。自1962年Hough公布了該算法以來,由于其良好的抗噪聲性能和對部分遮蓋的不敏感等特性,霍夫變換在模式識別領域得到廣泛的應用,如直線、圓、橢圓、矩形等幾何圖形檢測,任意

24、形狀區(qū)域的邊界提取,二維或三維運動的參數(shù)估計等。</p><p>  下面就于本論文相關的直線和圓的識別進行簡單的介紹。</p><p><b>  霍夫變換識別直線</b></p><p>  霍夫變換識別直線,是將圖像空間中的一點變換為參數(shù)空間中的一條直線。圖像空間中同一直線上的點,經(jīng)霍夫變換所形成的直線相交于參數(shù)空間中的一點,該點坐標代表

25、圖像空間中直線的斜率及截距。利用累加數(shù)組累計參數(shù)空間中通過該點的直線條數(shù),即代表圖像空間中直線上的點數(shù)。</p><p>  圖1.1 霍夫變換識別直線(1)</p><p>  設已知一黑白圖像上畫了一條直線,要求出這條直線所在的位置。我們知道,直線的方程可以用來表示,其中k和b是參數(shù),分別是斜率和截距。過某一點的所有直線的參數(shù)都會滿足方程。即圖像空間中的一點確定了參數(shù)空間中的一族直線。

26、方程在參數(shù)k--b平面上是一條直線。這樣,圖像x--y平面上的一個前景像素點就對應到參數(shù)平面上的一條直線。</p><p>  霍夫變換識別直線的算法描述如下:</p><p>  Step1. 初始化一塊緩沖區(qū),對應于參數(shù)平面,將其所有數(shù)據(jù)置為0。</p><p>  Step2. 對于圖像上每一前景點,求出參數(shù)平面對應的直線,把這直線上的所有點的值都加1。<

27、;/p><p>  Step3. 找到參數(shù)平面上峰值點的位置,這些位置的坐標就是原圖像上直線的參數(shù),每個位置對應于原圖像上的一條直線。</p><p>  上面是霍夫變換識別直線的基本思想。在實際應用中,形式的直線方程沒有辦法表示x=c形式的直線(這時候,直線的斜率為無窮大)。所以實際應用中,是采用參數(shù)方程:</p><p>  這樣,圖像平面(x, y)空間上的一個點

28、就對應到參數(shù)空間中的一條正弦曲線上。在變換后的空間中這條正弦曲線上的任意一點對應于原始圖像平面(x, y)空間的一條直線,這條直線必通過這個點,而(x, y)空間中所有共線的點經(jīng)過變換后所對應的各正弦曲線都相交于一點。</p><p>  圖1.2 霍夫變換識別直線(2)</p><p><b>  霍夫變換識別圓</b></p><p>  

29、1) 半徑已知的圓的識別</p><p>  利用霍夫變換檢測出半徑已知的圓形,是將圖像平面上的每一點對應到參數(shù)平面上的一個以已知半徑為半徑的圓。經(jīng)過霍夫變換,在參數(shù)平面上得到圓相交于一點,這個點的坐標即為原圖形坐標平面上待識別的圓心坐標。</p><p>  算法可以簡單描述為:取和圖像平面一樣的參數(shù)平面,以圖像上每一個前景點為圓心,以已知的半徑在參數(shù)平面上畫圓,并把結果進行累加。最后找

30、出參數(shù)平面上的峰值點,這個位置就對應了圖像上的圓心。</p><p>  2) 未知半徑的圓的識別</p><p>  在第一個問題基礎上,把參數(shù)平面擴大稱為三維空間,即x--y--R三維,對應圓的圓心和半徑。圖像平面上的每一點就對應于參數(shù)空間中每個半徑下的一個圓,在參數(shù)的三維空間中得到一個圓錐。最后找出參數(shù)空間中的峰值點,即得到待識別的圓的圓心和半徑。</p><p&

31、gt;  由于霍夫變換具有良好的抗噪聲性能和對部分遮蓋的不敏感等特性,又不受圖像旋轉的影響,在很多領域都有廣泛的應用,有關霍夫變換的研究和改進也很多。例如廣義霍夫變換、隨機霍夫變換、快速霍夫變換等等,就是針對直線的霍夫變換也有很多改進算法。由于時間的原因,在本軟件中,只是使用了標準的霍夫變換算法。</p><p>  基于單義域的直線及圓識別算法</p><p>  霍夫變換為幾何圖形的識

32、別的一個重要算法,但是由于該標準算法的時間復雜度和空間復雜度都是,其中m是參數(shù)坐標的維數(shù),雖然有不少針對具體問題(例如直線識別)的改進算法,其在實際使用中也存在計算量大的問題。針對本論文的工作的實際情況,參考文獻【1】,并進行了適當?shù)暮喕?,完成了論文的識別部分。下面就對這個基于單義域的識別算法進行簡單的介紹。</p><p><b>  多義域的獲得</b></p><p

33、>  單義域是指對待識別的圖形進行分割得到的具有單一的幾何意義(線段或圓?。c的集合。對圖片進行從上往下、從左往右的掃描,根據(jù)交點進行分割得到多義域,多義域中的點構成一個連通區(qū)域。對多義域進行識別并分割得到單義域。</p><p><b>  多義域由鏈表實現(xiàn)。</b></p><p><b>  算法描述如下:</b></p>

34、<p>  對圖形進行從上往下、從左往右的掃描;</p><p>  對每一個前景點,判斷其是否為交點;</p><p>  將該點與現(xiàn)有的多義域的頭(如果其頭節(jié)點不是交點)、尾(如果其尾節(jié)點不是交點)節(jié)點進行比較,如果與頭節(jié)點相鄰,將其插入到該多義域的頭節(jié)點之前;如果與尾節(jié)點相鄰,將其插入到該多義域的尾節(jié)點之后。</p><p>  如果該前景點不屬

35、于任何現(xiàn)有多義域,則以該點為頭節(jié)點生成新的多義域。</p><p><b>  直到圖形掃描完畢。</b></p><p><b>  注:交點的判斷。</b></p><p>  由此得到的多義域將是一個線段、一個圓弧或者線段和圓弧的組合。在后續(xù)的識別過程中將把不是單義域的進行分裂。</p><p&g

36、t;  最小二乘法擬合直線和圓</p><p>  最小二乘法首先由Karl Gauss為進行行星軌道預測的研究而提出的?,F(xiàn)在最小二乘法已經(jīng)變成從實驗數(shù)據(jù)來進行參數(shù)估計的主要手段。由最小二乘法獲得的估計在一定條件下有最佳的統(tǒng)計特性:一致、無偏、有效。它提供給我們一個數(shù)學程式,通過它能獲得一個在最小方差意義上與實驗數(shù)據(jù)最好擬合助模型。</p><p>  運用最小二乘法進行圓的擬合公式如下:

37、</p><p>  其中,為樣點,為所求圓心,為半徑,為平均徑向誤差, 為最大徑向誤差。</p><p>  多義域分裂和單義域的識別</p><p>  對2.1中得到的多義域,運用最小二乘法進行擬合,對于擬合不成功的多義域運用首尾相連最大距離法進行分裂,得到單義域,并記錄下各單義域的擬合結果,供全局考慮,識別直線和圓用。</p><p>

38、;<b>  算法描述如下:</b></p><p>  從2.1得到的多義域列表里取第一個多義域;</p><p>  對選中的多義域運用最小二乘法進行圓的擬合;如果得到的平均徑向誤差和最大徑向誤差小于指定閾值,則認為擬合成功,該多義域為一圓弧的單義域;記錄擬合的結果,作為總體識別的種子圓,轉向5執(zhí)行,否則執(zhí)行3。</p><p>  對選中

39、的多義域運用最小二乘法進行直線擬合;如果得到的平均距離誤差和最大距離誤差小于指定閾值,則認為擬合成功,該多義域為一線段的單義域;記錄擬合結果,作為總體識別的種子直線,轉向5執(zhí)行,否則執(zhí)行4。</p><p>  該多義域為多個線段或圓弧的組合。將該多義域的頭尾節(jié)點連接,計算該多義域中各點與頭尾節(jié)點連線的距離,取距離最大的點,對該多義域進行分裂,得到兩個新的多義域,取代原先的多義域;轉向2執(zhí)行。</p>

40、<p>  取多義域列表中的下一個,轉向2執(zhí)行。</p><p>  由此,所有的多義域都分裂為單義域,并對各單義域進行了擬合。</p><p>  總體整合,識別直線和圓</p><p>  對2.3得到的單義域列表進行總體的整合,得到直線和圓。</p><p>  選取單義域列表中的第一個單義域,將其擬合的圖形(直線或圓)作

41、為種子圖形;</p><p>  將列表中其他單義域的識別結果與種子圖形進行比較,如果誤差小于指定閾值,則屬于同一直線或同一圓,將其與選定單一域進行合并,從列表中刪除該單義域;</p><p>  計算選定單義域的幾何數(shù)據(jù),得到圖形;</p><p>  選取列表中的下一個單義域,轉動2執(zhí)行。</p><p><b>  主要技術&

42、lt;/b></p><p>  Borland C++ Builder</p><p>  本論文的編程環(huán)境之所以選用c++ builder 是因為他有以下的優(yōu)點:</p><p> ?、牛敵鋈虢涌谠O計簡單</p><p>  ⑵.提供一流的開發(fā)環(huán)境</p><p> ?、牵峁┳顦藴实腃/C++魯開發(fā)工具&

43、lt;/p><p> ?、龋峁┴S富的組件與最強勁的調試工具VCL類庫中封裝了Windows的圖形設備接口(GDI),使得用戶很方便地在應用程序添加圖像或處理圖像。</p><p>  圖像類主要有Tbitmap、TBrush、TCanves、TFont、TgraphakControl、Tgraphic、Ticon、TJPEGImage、TPen和Tpictur以Tmatifile類。<

44、/p><p><b>  虛類及虛方法的使用</b></p><p>  虛類和虛方法的使用在本論文中主要是Cshapes基類及虛方法的實現(xiàn)。</p><p>  直線和圓的識別和編輯的實現(xiàn)</p><p>  系統(tǒng)的層次結構的圖示</p><p>  系統(tǒng)數(shù)據(jù)結構及類的設計</p>&

45、lt;p><b>  主要類的層次結構</b></p><p><b>  圖形處理類:</b></p><p><b>  識別用類:</b></p><p>  圖形基類(CShape)</p><p><b>  描述</b></p>

46、;<p>  圖形基類,提供所有圖形的標準屬性和方法。其他圖形類(直線、圓)等都是該類的子類,繼承其所有的public屬性和方法,對其中的虛方法(virtual)進行重定義和實現(xiàn)。</p><p>  該類為虛類,其成員函數(shù)主要為虛函數(shù),為其所有子類提供統(tǒng)一的接口,但是沒有實現(xiàn)。其他模塊對圖形進行操作時,除非生成新的實例(Instance),都無須知道所操作的是哪個具體的圖形,而統(tǒng)一使用Cshape

47、類型,為程序的實現(xiàn)、擴充和維護提供很大方便。</p><p><b>  實現(xiàn)</b></p><p>  class CShape {</p><p><b>  public:</b></p><p>  /* 屬性定義 */</p><p>  //前景色(由于時間等的

48、限制,本系統(tǒng)暫時只定義該圖形的屬性,其</p><p>  // 他如:填充色,線條型,填充型等可擴充)</p><p>  TColor color;</p><p>  /* 編輯用屬性 */</p><p>  //編輯時標志該圖形是否被選擇</p><p>  bool isSelected;&l

49、t;/p><p>  //編輯操作所選中的點</p><p>  TPoint * editP</p><p>  /* 識別用屬性 */</p><p>  // 識別的效果描述,值越小說明識別效果越好</p><p>  // 最小二乘法的平均誤差;</p><p>  // 霍

50、夫變換:1 - 參數(shù)空間中該圖形的值/最大值</p><p>  double chance;</p><p><b>  //圖形上點的數(shù)量</b></p><p>  int pointCount;</p><p>  /* 成員函數(shù)定義 */</p><p>  /* 顯示和描述用方法 */

51、</p><p>  // 顯示圖形:在指定的位圖上顯示圖形 </p><p>  virtual void draw(Graphics::TBitmap * argDest);</p><p>  // 描述圖形:作為TtreeView的節(jié)點(主窗體使用)</p><p>  virtual void discript(int index,

52、 TTreeView * tree);</p><p>  // 描述圖形:返回描述圖形的字符串</p><p>  virtual String discript();</p><p><b>  /* 識別用 */</b></p><p>  // 比較兩個圖形,如果是同一個圖形,返回True,否則False。<

53、;/p><p>  // 直線上的兩個線段;圓上面的兩個圓弧</p><p>  virtual bool similarWith(CShape * argShape);</p><p><b>  // 合并兩個圖形</b></p><p>  // 經(jīng)過判斷為相同的圖形進行合并,返回True;否則返回Fa

54、lse。</p><p>  virtual bool mergeWith(CShape * argShape);</p><p>  // 判斷圖形存在的可能性(利用具體圖形的幾何規(guī)則)</p><p>  virtual bool checkPossible();</p><p><b>  /* 編輯用 */</b>

55、;</p><p>  // 判斷是否點擊該圖形,若選中則當前編輯的圖形改為當前圖形</p><p>  virtual bool isClickOnShape(int x, int y);</p><p>  // 取得鼠標形狀:鼠標移動到選中圖形的可操作點上時,顯示為編輯形狀</p><p>  virtual TCursor getCu

56、rsor(int x, int y);</p><p>  // 更新圖形:將編輯點移動到(x, y)點。更新成功返回True,否則False。</p><p>  virtual bool update(int x, int y);</p><p><b>  };</b></p><p>  圖形類(CLine、CC

57、ircle)</p><p><b>  描述</b></p><p>  圖形類是幾何圖形的具體實現(xiàn),實現(xiàn)對應幾何圖形的描述和相關操作。圖形類有共同的父類CShape,對父類中定義的虛方法根據(jù)本幾何圖形的特征進行實現(xiàn)。</p><p>  根據(jù)要求,本系統(tǒng)中實現(xiàn)了直線(CLine)和圓(CCircle)兩個圖形類。其他簡單的幾何圖形如橢圓、矩

58、形等也可以類似的方法實現(xiàn),作為本系統(tǒng)的一個擴充。</p><p>  本系統(tǒng)中,直線類采用直觀的的形式來描述直線(既避免點斜式不能描述豎直直線,也避免極坐標方程轉換的問題)。因為成比例的兩組和表示同一條直線,所以規(guī)定,如果B參數(shù)不為0,則,否則A必定不為0,則。由于要識別圖像中的線段,所以增加兩個端點進行限制。</p><p>  直線類有三個點可以編輯:1)兩個端點,選中一個端點并移動,

59、是以另一端點為軸進行旋轉;2)線段的中點,選中中點并移動,是平移整個直線。</p><p>  圓類采用的形式描述(其中為圓心,R為半徑),直觀方便。圓上有兩個點支持編輯操作:1)圓心,選中圓心并移動,是平移整個圓;2)圓上的一個點,選中該點并移動,是改變圓的半徑,圓心不變。</p><p><b>  實現(xiàn)</b></p><p>  直線類

60、(CLine)</p><p>  class CLine: public CShape {</p><p><b>  public:</b></p><p><b>  /* 初始化 */</b></p><p>  CLine(double argA, double argB, double

61、argC);</p><p>  /* 直線的屬性 */</p><p>  // 線段的兩個端點</p><p>  TPoint *startP, *endP;</p><p>  // 直線方程的參數(shù):A,B,C</p><p>  double A, B, C;</p><p>  /*

62、 對父類虛方法的實現(xiàn) */</p><p>  // 在目標位圖上畫出直線(本系統(tǒng)中的實現(xiàn)為畫線段)</p><p>  void draw(Graphics::TBitmap * argDest);</p><p>  // 在TTreeView中描述</p><p>  void discript(int index, TTreeView

63、 * tree);</p><p>  // 返回描述用字符串</p><p>  String discript();</p><p>  // 判斷該直線是否與指定圖形相同</p><p>  // 將指定圖形強制轉化為CLine類型,比較其參數(shù)A, B, C,</p><p>  // 若小

64、于指定閾值,則返回Ture,否則返回False。</p><p>  bool similarWith(CShape * argShape);</p><p>  // 合并同一直線上的兩個線段</p><p>  // 若目標圖形與該圖形屬同一直線,進行合并,返回True;</p><p>  // 否則返回False。&l

65、t;/p><p>  void mergeWith(CShape * argShape);</p><p>  // 判斷是否選擇該直線進行編輯。</p><p>  // 判斷指定點(x, y)到該直線的距離,</p><p>  // 如果小于指定閾值則返回True,否則False。</p><p> 

66、 bool isClickOnShape(int x, int y);</p><p>  // 取得鼠標形狀。</p><p>  // 端點時返回45度,135度的雙向箭頭形狀表示旋轉;</p><p>  // 中點時返回垂直的四個方向箭頭的形狀表示移動</p><p>  TCursor getCursor(int x

67、, int y);</p><p><b>  // 更新直線</b></p><p>  bool update(int x, int y);</p><p><b>  };</b></p><p>  圓類(CCircle)</p><p>  class CCircl

68、e: public CShape {</p><p><b>  public:</b></p><p><b>  /* 初始化 */</b></p><p>  CCircle(int argX, int argY, int argR);</p><p>  /* 圓的屬性 */</p&g

69、t;<p><b>  // 圓心</b></p><p>  TPoint * centerP;</p><p><b>  // 半徑</b></p><p><b>  int R;</b></p><p>  /* 對父類虛方法的實現(xiàn) */</p&g

70、t;<p>  // 在目標位圖上畫出圓</p><p>  void draw(Graphics::TBitmap * argDest);</p><p>  // 在TTreeView中描述</p><p>  void discript(int index, TTreeView * tree);</p><p>  //

71、返回描述用字符串</p><p>  String discript();</p><p>  // 判斷該圓是否與指定圖形相同</p><p>  // 將指定圖形強制轉化為CCircle類型,比較其參數(shù)圓心坐標和半徑,</p><p>  // 若小于指定閾值,則返回Ture,否則返回False。</p>

72、<p>  bool similarWith(CShape * argShape);</p><p>  // 合并同一圓上的兩個圓弧</p><p>  // 若目標圖形與該圖形屬同一圓,進行合并,返回True;</p><p>  // 否則返回False。</p><p>  void mergeWith(

73、CShape * argShape);</p><p>  // 判斷是否選擇該圓進行編輯。</p><p>  // 計算指定點(x, y)到圓心的距離,并與半徑比較,</p><p>  // 如果小于指定閾值則返回True,否則False。</p><p>  bool isClickOnShape(int x, int

74、 y);</p><p>  // 取得鼠標形狀。</p><p>  // 圓上點時返回水平的雙向箭頭形狀表示改變半徑;</p><p>  // 圓心時返回垂直的四個方向箭頭的形狀表示移動</p><p>  TCursor getCursor(int x, int y);</p><p><

75、b>  // 更新圓</b></p><p>  bool update(int x, int y);</p><p><b>  };</b></p><p>  圖形容器類(CShapes)</p><p><b>  描述</b></p><p>  

76、圖形容器類是圖形類的集合類,由C++ Builder的TList繼承得到。用來組織對圖像的識別結果、組織當前編輯工作的圖形對象集。提供添加圖形、刪除圖形、圖形編輯等接口。</p><p><b>  實現(xiàn)</b></p><p>  class CShapes : public TList {</p><p><b>  public

77、:</b></p><p><b>  /* 初始化 */</b></p><p>  CShapes();</p><p>  // 從TreeView得到Shapes</p><p>  CShapes(TTreeView * tree);</p><p>  //在目標位圖上畫出

78、所有的圖形</p><p>  void drawShapes(Graphics::TBitmap * argDest);</p><p><b>  //描述圖形</b></p><p>  void discript(TTreeView * tree);</p><p><b>  };</b>

79、</p><p>  點類(CPoint)</p><p><b>  描述</b></p><p>  點類對于與圖像上的前景點。由于識別時需要判斷是否為交點,在一般的點的基礎上增加是否為交點的屬性。由C++ Builder的TPoint繼承得到。</p><p><b>  實現(xiàn)</b><

80、/p><p>  class CPoint : public TPoint {</p><p><b>  public:</b></p><p><b>  /* 初始化 */</b></p><p>  CPoint() {isCrossPoint = false; };</p>&l

81、t;p>  CPoint(int argx, int argy, bool isCross);</p><p>  CPoint(int argx, int argy, Graphics::TBitmap * argImg);</p><p>  /* 屬性:是否為交點 */</p><p>  bool isCrossPoint;</p>&l

82、t;p><b>  };</b></p><p>  單義域類(CSegment)</p><p><b>  描述</b></p><p>  在“基于單義域的圖形識別算法”中,單義域和多義域的唯一區(qū)別就是多義域不是單一的幾何元素,其在存儲結構上是一樣的,在本系統(tǒng)中,都由CSegment類實現(xiàn),姑且命名為單義域類。

83、</p><p>  單義域類為點的集合類,由C++ Builder的TList類繼承得到。提供添加點、刪除點、判斷該單義域是否有識別價值、識別該單義域等接口和方法。</p><p><b>  實現(xiàn)</b></p><p>  class CSegment : public TList {</p><p><b&

84、gt;  public:</b></p><p><b>  /* 初始化 */</b></p><p>  CSegment(CPoint * p);</p><p>  /* 識別該單義域:實現(xiàn)算法中對單義域的識別部分 */</p><p>  // 如果識別成功(得到圓或線段)返回True,否則返回F

85、alse</p><p>  bool recognize();</p><p>  /* 嘗試添加新的點到該單義域 */</p><p>  // 判斷該點是否屬于該單義域并確定是在頭部還是在尾部,并將其插入到適當位置;如果該點為交點,則將相應的方向關閉增長;若加入成功返回True,否則返回False。</p><p>  bool ad

86、dNewPoint();</p><p>  /* 判斷該單義域是否有識別價值 */</p><p>  // 如果該單義域含有的點數(shù)太少,則沒有價值返回False,否則返回True。</p><p>  bool checkValue();</p><p>  /* 屬性:識別出的圖形 */</p><p>  CS

87、hape * shape;</p><p><b>  };</b></p><p>  基于單義域識別類(CSegments)</p><p><b>  描述</b></p><p>  基于單義域識別類是實現(xiàn)“基于單義域的直線和圓識別算法”的主要類。它實現(xiàn)了對目標圖像的分割、對分割結果的顯示、

88、對識別得到的多義域進行分割、對單義域識別結果的總體考慮,最終得到識別結果集。</p><p>  基于單義域識別類同時是單義域的集合類,由C++ Builder的TList類繼承得到。用來組織對圖像的單義域分割后的結果。。</p><p><b>  實現(xiàn)</b></p><p>  class CSegments : public TList

89、 {</p><p><b>  public:</b></p><p>  /* 構造和析構函數(shù) */</p><p>  CSegments();</p><p>  ~CSegments();</p><p>  /* 掃描圖像,得到多義域 */</p><p>  

90、// 從上往下,從左往右掃描圖像,對于每一個前景點</p><p>  // 1。生成新的CPoint實例</p><p>  // 2。對于本類中的所有單義域,將該點嘗試加入</p><p>  // 3。如果加入失敗,以該點為頭生成新的單義域并加入。</p><p>  void segmentize(Graphi

91、cs::TBitmap * argSrc);</p><p>  /* 在指定的位圖上顯示分割得到的多義域、單義域 */</p><p>  void displaySegments(Graphics::TBitmap * argDes);</p><p>  /* 識別該集合中的元素 */</p><p>  // 1。調用單義域的che

92、ckValue(),如果得到False,刪除該單義域;</p><p>  // 2。調用單義域的recognize(),如果返回False,對該單義域進行分割;</p><p>  // 將新得到的2個單義域取代當前的單義域,并進行識別</p><p>  // 3。所有的單義域識別完畢后,對各個單義域的識別結果進行合并</p><

93、p>  // 4。返回得到的圖形容器類。</p><p>  CShapes * recognize();</p><p>  /* 刪除集合中的指定位置的元素 */</p><p>  void removeItemOnly(int index);</p><p>  void removeItemAndFreePoints(int

94、 index);</p><p><b>  };</b></p><p>  霍夫變換識別直線類(CHTLine)</p><p><b>  描述</b></p><p>  實現(xiàn)霍夫變換識別直線算法。</p><p><b>  實現(xiàn)</b><

95、;/p><p>  class CHTLine {</p><p><b>  public:</b></p><p>  /* 構造和析構函數(shù) */</p><p>  CHTLine ();</p><p>  ~ CHTLine ();</p><p>  /* 對源位圖

96、按照直線識別算法進行霍夫變換 */</p><p>  // argRho, argTheta分別是對 ? 和 ? 的分割的份數(shù)。</p><p>  void recognize(Graphics::TBitmap * argSource, int argRho, int argTheta);</p><p>  /* 在目標位圖上顯示參數(shù)坐標的信息 */<

97、;/p><p>  // 以參數(shù)坐標的最大值為灰度最大值,按比例灰度在位圖上顯示。</p><p>  void displayPramater(Graphics::TBitmap * argDest);</p><p>  /* 按照argRate指定的概率取得識別出的直線列表 */</p><p>  void getLines(TList

98、 * argList, double argRate);</p><p><b>  };</b></p><p>  霍夫變換識別圓類(CHTCircle)</p><p><b>  描述</b></p><p>  實現(xiàn)霍夫變換識別圓算法。</p><p><b&

99、gt;  實現(xiàn)</b></p><p>  class CHTCircle {</p><p><b>  public:</b></p><p>  /* 構造和析構函數(shù) */</p><p>  CHTCircle ();</p><p>  ~ CHTCircle ();<

100、/p><p>  /* 對源位圖按照圓的識別算法進行霍夫變換 */</p><p>  void recognize(Graphics::TBitmap * argRes);</p><p>  /* 在目標位圖上顯示參數(shù)坐標的信息 */</p><p>  // 以參數(shù)坐標的最大值為灰度最大值,按比例灰度在位圖上顯示參數(shù)坐標中指定半徑的二維平

101、面的數(shù)據(jù)。</p><p>  void displayPramater(Graphics::TBitmap * argDest, int argR);</p><p>  /* 按照argRate指定的概率取得識別出的直線列表 */</p><p>  void getCircles(TList * argList, double argRate);</p&

102、gt;<p><b>  };</b></p><p><b>  系統(tǒng)功能介紹</b></p><p><b>  1.識別部分</b></p><p>  (1).基于霍夫變換下的識別</p><p>  啟動recognize.exe</p>

103、<p>  File->open 打開要識別的bmp文件</p><p>  Hough Trans->ling recognize得到識別出的直線的霍夫變換圖,圖中的每個亮點代表一條直線;</p><p>  識別的圓的概率圓,在下面的Edit控件中是你想要顯示的圓的直徑,輸入后點display后就可以看到霍夫變換的結果</p><p>  

104、注:由于霍夫變換是一個三維的循環(huán),消耗內存較多,速度較慢,所以圖像的原圖的大小直接影響到速度。</p><p>  下面是幾幅圖象的實驗結果:</p><p>  圖3.1 只含有直線的bpm文件</p><p>  圖3.2 圖4.1的Hough Trans->line recognize的結果</p><p><b>  

105、再如另一個例子:</b></p><p><b>  圖3.3 </b></p><p>  圖3.4 對上圖顯示直徑為30 圖3.5 對上圖顯示直徑為60</p><p>  (2). 基于分區(qū)-聯(lián)合下的識別</p><p><b>  1、2步如上</b></p

106、><p>  3,Segment->step1:Segmentize將整幅圖像分區(qū)的結果</p><p>  4,Segment->step2:Segment recognize識別分區(qū)后的各個部分</p><p>  5,Segment->step3:recognize shape 對step2的結果進行整體識別,得到我們想要的結果</p>

107、;<p>  6,Segment->step1-3:Segment recognize 如果不想看實現(xiàn)的過程只想得到結果時執(zhí)行此操作</p><p>  下面用幾個例子來說明</p><p><b>  圖3.1的識別過程</b></p><p>  圖3.6 圖3.1的Segment結果(第一步)</p>

108、<p>  圖3.7 圖3.1的Segment recognize結果(第二步)</p><p>  圖3.8 對上圖recognize shape的結果</p><p>  圖3.8也是step1-3的結果。在form右邊的Edit Box中是識別出的圖元的相關信息:</p><p>  直線時的A,B,C分別是方程Ax+By+C=0中的系數(shù);<

109、;/p><p>  圓的時候,X,Y是圓心的坐標,R是圓的半徑。</p><p>  再如圖3.3的識別過程:</p><p>  圖3.9 step1的執(zhí)行結果</p><p>  圖3.10 step2的識別結果 圖3.11 step3的識別結果</p><p><b> 

110、 圖3.12</b></p><p>  其中最下面的line:0,Circle:1,Circle:2,…,Circle:4就是識別出的直線和圓的相關信息。</p><p>  Line:0中的P1,P2是指直線的兩個端點坐標、chance和count是對點的總體統(tǒng)計參數(shù)</p><p>  Circle:1中的Center、r分別是圓的圓心和半徑坐標。

111、</p><p><b>  總結及展望</b></p><p>  計算機技術的發(fā)展,使人類社會進入了信息化和自動化,計算機智能識別也隨著計算機的發(fā)展得到了迅速的發(fā)展。特別是圖形圖像的計算機處理技術更是有了前所未有的進步和應用。計算機識別也逐漸的從圖形圖像處理的大環(huán)境下分離出來作為一門新的高科技研究領域出現(xiàn)。圖形圖像的識別涉及到的學科很多,包括數(shù)字信號處理、工程數(shù)學

112、、信息論、運籌學、等,它與計算機、自動化、生物學、關學、視覺心里和生理學、人工智能、智能信息處理等眾多領域交叉、綜合集成,有廣泛的應用。</p><p>  實現(xiàn)的是基礎的圖形識別,bmp圖像文件格式中對圖形的矢量化。識別基本的圖元直線和圓。直線和圓是二值圖像中最基本的組成元素,也是最常見的圖形元素。在工程圖的數(shù)字化識別中有很大的應用。</p><p><b>  附錄1:參考文

113、獻</b></p><p>  ·[1] 張習文、歐宗瑛.基于單義域鄰接圖的圓弧與圓識別[M].中國圖像圖形學報 2000版</p><p>  ·[2]王耀南、李書濤、毛建旭.計算機圖像處理與識別技術[M].高等教育出版社.2005年版.</p><p>  ·[3]阮球琦.數(shù)字圖像處理學[M].電子工業(yè)出版社. 2007

114、年版.</p><p>  ·[4]夏德深、傅德勝.現(xiàn)代圖像處理與應用[M].東南大學出版社. 2001年版.</p><p>  ·[5] 孫增圻. 計算機控制理論與應用系統(tǒng)辨識-最小二乘原理[M]. 清華大學出版社.2008版</p><p>  ·[6]朱時銀.c++ builder 編程實例與技巧[M].機械工業(yè)出版社. 200

115、1年版.</p><p><b>  附錄2:結束語</b></p><p>  在當今高科技發(fā)展的環(huán)境下,圖像處理的需求和應用愈來愈廣泛,技術亦愈來愈高,本人通過本論文的編寫及實現(xiàn)過程對圖像處理和模式識別有了很多的理解和更深刻的認識。</p><p>  綜上所述,本系統(tǒng)達到了預期的目標,并具有很大的擴展性。經(jīng)過必要的完善和補充,將可以成為一

溫馨提示

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

評論

0/150

提交評論