公路路面自動(dòng)檢測(cè)系統(tǒng)設(shè)計(jì)-畢業(yè)設(shè)計(jì)論文_第1頁
公路路面自動(dòng)檢測(cè)系統(tǒng)設(shè)計(jì)-畢業(yè)設(shè)計(jì)論文_第2頁
公路路面自動(dòng)檢測(cè)系統(tǒng)設(shè)計(jì)-畢業(yè)設(shè)計(jì)論文_第3頁
公路路面自動(dòng)檢測(cè)系統(tǒng)設(shè)計(jì)-畢業(yè)設(shè)計(jì)論文_第4頁
公路路面自動(dòng)檢測(cè)系統(tǒng)設(shè)計(jì)-畢業(yè)設(shè)計(jì)論文_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

┊┊┊┊┊┊┊┊┊┊┊┊┊裝┊┊┊┊┊訂┊┊┊┊┊線┊┊┊┊┊┊┊┊┊┊┊┊┊畢業(yè)設(shè)計(jì)(論文)報(bào)告紙共34頁第34頁目錄摘要 2ABSTRACT 2ABSTRACT 3第1章緒論 41.1課題背景與實(shí)際意義 41.2國內(nèi)外公路發(fā)展現(xiàn)狀 41.3本畢業(yè)設(shè)計(jì)的主要內(nèi)容 51.4本畢業(yè)設(shè)計(jì)的技術(shù)路線 61.4.1系統(tǒng)中用到的關(guān)鍵技術(shù) 61.4.2系統(tǒng)的硬件平臺(tái) 61.4.3系統(tǒng)的軟件平臺(tái) 61.4.4程序?qū)崿F(xiàn) 6第2章圖像的預(yù)處理 62.1圖像格式的識(shí)別 62.2相關(guān)函數(shù)介紹 92.3轉(zhuǎn)化成灰度圖 162.4灰度圖像二值化 162.5圖像的梯度銳化 162.6去除離散的雜點(diǎn)噪聲 172.7整體傾斜度調(diào)整 172.8字符分割 182.9圖像的歸一化處理 192.10圖像的緊縮重排 192.11特征提取 19第3章 進(jìn)行數(shù)字識(shí)別 233.1BP神經(jīng)網(wǎng)絡(luò)簡(jiǎn)介 233.2BP網(wǎng)絡(luò)的設(shè)計(jì)及其編程實(shí)現(xiàn) 27第4章“路面里程樁號(hào)識(shí)別系統(tǒng)”介紹 294.1總體邏輯結(jié)構(gòu) 304.2整體運(yùn)行界面及功能 30摘要本文的研究是公路路面自動(dòng)檢測(cè)系統(tǒng)的一部分,最終完成的任務(wù)是提取并識(shí)別出采集到的路面里程標(biāo)圖片上的號(hào)碼數(shù)字,研究了計(jì)算機(jī)圖像處理技術(shù)在公路路面自動(dòng)檢測(cè)中的應(yīng)用。本研究分析了對(duì)于公路路面圖像處理所需解決的主要問題,提出了提取公路路面圖像特征的技術(shù)方案;嘗試綜合多種圖像處理技術(shù)對(duì)里程樁圖片進(jìn)行適當(dāng)?shù)念A(yù)處理,包括灰度圖轉(zhuǎn)化,二值化,梯度銳化,去離散噪聲,整體傾斜調(diào)整,字符分割,尺寸標(biāo)準(zhǔn)歸一化和緊縮重排,最后對(duì)處理后的圖片中所含號(hào)碼進(jìn)行識(shí)別。整個(gè)軟件系統(tǒng)采用面向?qū)ο蟮木幊碳夹g(shù),用VC++6.0語言編寫而成,且界面簡(jiǎn)明,易于操作。本系統(tǒng)可望應(yīng)用于公路自動(dòng)檢測(cè)系統(tǒng)中對(duì)路標(biāo)號(hào)碼進(jìn)行識(shí)別,為公路管理和養(yǎng)護(hù)部門的決策提供依據(jù),同時(shí)對(duì)于類似的圖像處理任務(wù)有借鑒意義。關(guān)鍵詞公路路面,識(shí)別,圖像處理,圖像分割

ABSTRACTTheobjectivesofthisthesisaretorecognizethenumberonroad-surface-mileport.Inthispaper,themainproblemsofdigitalimageprocessingforhighwaysurfaceareanalyzedparticularly,andtheefficientandintegratedpreprocessingalgorithmofhighwaysurfaceimageisdescribed,finallyrecognizethenumberontheimage.Inthissoftwaresystem,whichiscompiledbyVC++6.0,theObjectOrientedProgramTechniquewasadopted.Theinterfaceissolaconicandeasytooperate.Inaddition,thesealgorithmsinthisresearchcanbeappliedtoanalyzetheroadsurfacedistressautomatically,alsobeusedforreferenceinothersimilarimageprocessingcases.KEYWORDS:highwaysurface,recognize,imageprocessing,imagesegmentation

第1章緒論1.1課題背景與實(shí)際意義改革開放的產(chǎn)物許多人對(duì)十幾年前的“出行難”仍記憶猶新。交通部1990年的有關(guān)統(tǒng)計(jì)數(shù)字顯示,因路況不好,車輛通行不暢,我國每年有上百億元的財(cái)富被白白地浪費(fèi)在汽車緩慢的行進(jìn)中。80年代統(tǒng)計(jì),全國公路汽車平均時(shí)速只有30多公里。交通滯后成為制約各地經(jīng)濟(jì)發(fā)展和對(duì)外開放的“瓶頸”。自1988年我國高速公路實(shí)現(xiàn)零的突破后,一條條以高速公路為軸線的各具特色的產(chǎn)業(yè)帶迅速出現(xiàn)在各地。便捷通達(dá)的高速公路給人們的生活和工作帶來了快節(jié)奏和高效率,加快了我國向現(xiàn)代文明社會(huì)發(fā)展的步伐。目前已建成的高速公路僅為需求里程的四分之一,我國高速公路建設(shè)仍處于滯后交通需求狀態(tài)。去年以來,我國實(shí)施積極的財(cái)政政策,加強(qiáng)基礎(chǔ)設(shè)施建設(shè),對(duì)公路的投資超過了歷史上任何時(shí)期。從高速公路上流過的不僅僅是人流物流,而且是商業(yè)流、金融流、信息流、文化流,高速公路促進(jìn)了沿線產(chǎn)業(yè)和經(jīng)濟(jì)帶的發(fā)展。綜上,公路的作用如此之大,因此后期的保養(yǎng)和維護(hù)工作也尤為重要,可應(yīng)用公路路面狀況自動(dòng)檢測(cè)系統(tǒng)來分析,路面里程樁號(hào)是公路位置的標(biāo)志,把采集到包含里程號(hào)的圖片信息輸入到該系統(tǒng)中經(jīng)自動(dòng)識(shí)別獲得所要的路段位置。1.2國內(nèi)外公路發(fā)展現(xiàn)狀歐盟及歐共體各國為了發(fā)展區(qū)域性經(jīng)濟(jì),更好地發(fā)揮高速公路的優(yōu)勢(shì),加強(qiáng)國際間的聯(lián)系,歐洲一些國家正在把高速公路連接起來,而構(gòu)成國際高速公路網(wǎng)。如橫貫全歐,東自奧地利的維也納,經(jīng)荷蘭、法國、西至西班牙的瓦倫西亞全長(zhǎng)3200km的高速公路;縱貫全歐,北至丹麥的哥本哈根,經(jīng)過德國和奧地利,南至意大利的羅馬全長(zhǎng)共有2100km的高速公路??梢哉f,每條高速公路都給歐洲乃至世界帶來了巨大的社會(huì)效益和經(jīng)濟(jì)效益。美國的大規(guī)模建設(shè)開始于20世紀(jì)40年代,特別是二戰(zhàn)后隨著美國汽車工業(yè)和交通運(yùn)輸業(yè)的迅猛發(fā)展,美國高速公路建設(shè)得到了長(zhǎng)足的發(fā)展,到今天為止,美國已經(jīng)成為世界上高速高路最多、路網(wǎng)最發(fā)達(dá)、設(shè)備最完善的國家。紐約至洛杉磯高速公路全長(zhǎng)4556km,堪稱世界之冠。美國的高速公路服務(wù)配套設(shè)施極為完善,通過開發(fā)和應(yīng)用交通監(jiān)控和信息系統(tǒng),可以對(duì)高速路上的車流量和車速等路況信息進(jìn)行連續(xù)的檢測(cè),并通過中心計(jì)算機(jī)系統(tǒng)對(duì)這些信息進(jìn)行處理,向公眾發(fā)布實(shí)時(shí)的交通信息和根據(jù)交通狀況對(duì)公路出入口的時(shí)間參數(shù)和路面交通信號(hào)燈作出相應(yīng)得調(diào)節(jié),控制車流量、緩解交通壓力避免塞車現(xiàn)象的發(fā)生,并在發(fā)生交通事故時(shí),該系統(tǒng)憑借先進(jìn)的通訊手段在極短的時(shí)間內(nèi)協(xié)調(diào)醫(yī)療救助、消防和警察等有關(guān)部門的工作,將損失降低到最低的限度。隨著已建成高速公路的投入使用和一些再建高速公路項(xiàng)目的陸續(xù)完工及投入使用,我國高速公路的運(yùn)輸規(guī)模正處于快速膨脹之中。如已經(jīng)建成的世界銀行批準(zhǔn)列為第三批公路貸款項(xiàng)目的濟(jì)青高速公路其路面汽車行駛速度可達(dá)120km/h,晝夜通行能力可達(dá)4~5萬車次,取得了顯著的經(jīng)濟(jì)效益和社會(huì)效益。近年來,交通部門在提高社會(huì)經(jīng)濟(jì)效益的同時(shí),使公路網(wǎng)規(guī)劃和設(shè)計(jì)工作步入了程序化、規(guī)范化及科學(xué)化的軌道。對(duì)解決我國公路混合交通的問題,提高道路通行能力,改善投資環(huán)境,促進(jìn)經(jīng)濟(jì)發(fā)展起到了積極的作用。1.3本畢業(yè)設(shè)計(jì)的主要內(nèi)容路面里程樁號(hào)識(shí)別系統(tǒng)從功能上可分為圖像采集、圖片預(yù)處理和數(shù)字識(shí)別三個(gè)子系統(tǒng)。系統(tǒng)總流程結(jié)構(gòu)如圖0-1所示:進(jìn)行識(shí)別圖片預(yù)處理進(jìn)行識(shí)別圖片預(yù)處理圖像采集圖0-1系統(tǒng)總流程圖其中圖像預(yù)處理的流程如圖0-2所示:圖像輸入灰度轉(zhuǎn)化圖像二值化圖像輸入灰度轉(zhuǎn)化圖像二值化 傾斜調(diào)整去離散噪聲梯度銳化傾斜調(diào)整去離散噪聲梯度銳化 緊縮重排歸一化調(diào)整圖像分割緊縮重排歸一化調(diào)整圖像分割特征提取特征提取圖0-2圖像預(yù)處理流程圖數(shù)字識(shí)別的具體流程如圖0-3所示:字符特征輸入識(shí)別并給出結(jié)果字符特征輸入識(shí)別并給出結(jié)果 該畢業(yè)設(shè)計(jì)主要是為了辨認(rèn)識(shí)別路標(biāo)圖像中的數(shù)字而設(shè)計(jì)的,它通過對(duì)圖片的一系列處理,最后識(shí)別得出圖片中顯示的數(shù)字。1.4本畢業(yè)設(shè)計(jì)的技術(shù)路線1.4.1系統(tǒng)中用到的關(guān)鍵技術(shù)本設(shè)計(jì)的理論基礎(chǔ)是數(shù)字圖像處理技術(shù),實(shí)現(xiàn)平臺(tái)是VisualC++6.0。1.4.2系統(tǒng)的硬件平臺(tái)因?yàn)橄到y(tǒng)運(yùn)行的過程當(dāng)中,主要進(jìn)行的都是圖像處理,在這個(gè)過程當(dāng)中要進(jìn)大量的數(shù)據(jù)處理,所以處理器和內(nèi)存要求比較高,CPU要求主頻在600hz以(含600Hz),內(nèi)存在128兆以上(含128兆)。1.4.3系統(tǒng)的軟件平臺(tái)系統(tǒng)可以運(yùn)行于任何一臺(tái)裝有Windows98、Windows2000或者WindowsXP的機(jī)子上。程序調(diào)試時(shí),需要使用MicrosoftVisualC++6.0(SP6)。1.4.4程序?qū)崿F(xiàn)整個(gè)系統(tǒng)的程序?qū)崿F(xiàn)分為圖像預(yù)處理和數(shù)字識(shí)別兩大模塊。在圖像預(yù)處理的過程當(dāng)中,我們采用了許多圖像處理的技術(shù),最后把每個(gè)數(shù)字的特征提取出來。這些技術(shù)包括圖像數(shù)據(jù)讀取、圖像的灰度化、二值化、圖像的調(diào)整、離散噪聲點(diǎn)的去除、字符的切分、圖像的縮放、字符的細(xì)化、字符的平滑、圖像的求梯度等圖像處理技術(shù),最后是數(shù)字字符特征的提取。其結(jié)果再利用神經(jīng)網(wǎng)絡(luò)(這里我們選用BP網(wǎng)絡(luò))進(jìn)行字符識(shí)別。利用神經(jīng)網(wǎng)絡(luò)進(jìn)行字符識(shí)別的過程主要包括網(wǎng)絡(luò)的訓(xùn)練、數(shù)據(jù)的讀取、字符的判定、結(jié)果的輸出。第2章圖像的預(yù)處理2.1圖像格式的識(shí)別要進(jìn)行圖像分析和處理首先就要得到圖像的數(shù)據(jù),這些數(shù)據(jù)包括圖像的寬、高、每個(gè)象素點(diǎn)的顏色值。因?yàn)槊糠N文件都有它自己的存放格式,本程序采用的輸入圖像即為bmp位圖。BMP(bitmap的縮寫)文件格式的圖像數(shù)據(jù)是未壓縮的,因?yàn)閳D像的數(shù)字化處理主要是對(duì)圖像中的各個(gè)像素進(jìn)行相應(yīng)的處理,而未壓縮的BMP圖像中的像素?cái)?shù)值正好與實(shí)際要處理的數(shù)字圖像相對(duì)應(yīng),是Windows本身可以直接提供讀取支持的位圖文件格式。BMP文件可用每象素1、4、8、16或24位來編碼顏色信息,這個(gè)位數(shù)稱作圖像的顏色深度,它決定了圖像所含的最大顏色數(shù)。一幅1-bpp(位每象素,bitperpixel)的圖像只能有兩種顏色。而一幅24-bpp的圖像可以有超過16兆種不同的顏色。一個(gè)典型BMP文件的結(jié)構(gòu)。以256色也就是8-bpp為例,文件被分成四個(gè)主要的部分:一個(gè)位圖文件頭BITMAPFILEHEADER,一個(gè)位圖信息頭BITMAPINFOHEADER,一個(gè)調(diào)色板Palette和實(shí)際的位圖數(shù)據(jù)ImageDate。第一部分為位圖文件頭BITMAPFILEHEADER,是一個(gè)結(jié)構(gòu),其定義如下:typedefstructtagBITMAPFILEHEADER{WORD

bfType;DWORDbfSize;WORD

bfReserved1;WORD

bfReserved2;DWORDbfOffBits;}BITMAPFILEHEADER;這個(gè)結(jié)構(gòu)的長(zhǎng)度是固定的,為14個(gè)字節(jié)(WORD為無符號(hào)16位整數(shù),DWORD為無符號(hào)32位整數(shù)),各個(gè)域的說明如下:bfType:指定文件類型,必須是0x424D,即字符串“BM”,也就是說所有.bmp文件的頭兩個(gè)字節(jié)都是“BM”。bfSize:指定文件大小,包括這14個(gè)字節(jié)。bfReserved1,bfReserved2:為保留字,不用考慮bfOffBits:為從文件頭到實(shí)際的位圖數(shù)據(jù)的偏移字節(jié)數(shù),即圖1.3中前三個(gè)部分的長(zhǎng)度之和。第二部分為位圖信息頭BITMAPINFOHEADER,也是一個(gè)結(jié)構(gòu),其定義如下:typedefstructtagBITMAPINFOHEADER{DWORD

biSize;LONG

biWidth;LONG

biHeight;WORD

biPlanes;WORD

biBitCountDWORD

biCompression;DWORD

biSizeImage;LONG

biXPelsPerMeter;LONG

biYPelsPerMeter;DWORD

biClrUsed;DWORD

biClrImportant;}BITMAPINFOHEADER;這個(gè)結(jié)構(gòu)的長(zhǎng)度是固定的,為40個(gè)字節(jié)(LONG為32位整數(shù)),各個(gè)域的說明如下:biSize:指定這個(gè)結(jié)構(gòu)的長(zhǎng)度,為40。biWidth:指定圖象的寬度,單位是象素。biHeight:指定圖象的高度,單位是象素。biPlanes:必須是1,不用考慮。biBitCount:指定表示顏色時(shí)要用到的位數(shù),常用的值為1(黑白二色圖),4(16色圖),8(256色),24(真彩色圖)。biCompression:指定位圖是否壓縮,有效的值為BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS(都是一些Windows定義好的常量)。要說明的是,Windows位圖可以采用RLE4,和RLE8的壓縮格式,但用的不多。我們所討論的只有第一種不壓縮的情況,即biCompression為BI_RGB的情況。biSizeImage:指定實(shí)際的位圖數(shù)據(jù)占用的字節(jié)數(shù),其實(shí)也可以從以下的公式中計(jì)算出來:biSizeImage=biWidth’×biHeight要注意的是:上述公式中的biWidth’必須是4的整倍數(shù)(所以不是biWidth,而是biWidth’,表示大于或等于biWidth的,最接近4的整倍數(shù)。舉個(gè)例子,如果biWidth=240,則biWidth’=240;如果biWidth=241,biWidth’=244)。如果biCompression為BI_RGB,則該項(xiàng)可能為零biXPelsPerMeter:指定目標(biāo)設(shè)備的水平分辨率,單位是每米的象素個(gè)數(shù)。biYPelsPerMeter:指定目標(biāo)設(shè)備的垂直分辨率,單位同上。biClrUsed:指定本圖象實(shí)際用到的顏色數(shù),如果該值為零,則用到的顏色數(shù)為2biBitCount。biClrImportant:指定本圖象中重要的顏色數(shù),如果該值為零,則認(rèn)為所有的顏色都是重要的。第三部分為調(diào)色板Palette,當(dāng)然,這里是對(duì)那些需要調(diào)色板的位圖文件而言的。有些位圖,如真彩色圖,是不需要調(diào)色板的,BITMAPINFOHEADER后直接是位圖數(shù)據(jù)。調(diào)色板實(shí)際上是一個(gè)數(shù)組,共有biClrUsed個(gè)元素(如果該值為零,則有2biBitCount個(gè)元素)。數(shù)組中每個(gè)元素的類型是一個(gè)RGBQUAD結(jié)構(gòu),占4個(gè)字節(jié),其定義如下:typedefstructtagRGBQUAD{BYTE

rgbBlue;//該顏色的藍(lán)色分量BYTE

rgbGreen;//該顏色的綠色分量BYTE

rgbRed;//該顏色的紅色分量BYTE

rgbReserved;//保留值}RGBQUAD;第四部分就是實(shí)際的圖象數(shù)據(jù)了。對(duì)于用到調(diào)色板的位圖,圖象數(shù)據(jù)就是該象素顏在調(diào)色板中的索引值。對(duì)于真彩色圖,圖象數(shù)據(jù)就是實(shí)際的R、G、B值。下面針對(duì)2色、16色、256色位圖和真彩色位圖分別介紹。對(duì)于2色位圖,用1位就可以表示該象素的顏色(一般0表示黑,1表示白),所以一個(gè)字節(jié)可以表示8個(gè)象素。對(duì)于16色位圖,用4位可以表示一個(gè)象素的顏色,所以一個(gè)字節(jié)可以表示2個(gè)象素。對(duì)于256色位圖,一個(gè)字節(jié)剛好可以表示1個(gè)象素。對(duì)于真彩色圖,三個(gè)字節(jié)才能表示1個(gè)象素。要注意兩點(diǎn):(1)

每一行的字節(jié)數(shù)必須是4的整倍數(shù),如果不是,則需要補(bǔ)齊。這在前面介紹biSizeImage時(shí)已經(jīng)提到了。(2)一般來說,.bMP文件的數(shù)據(jù)從下到上,從左到右的。也就是說,從文件中最先讀到的是圖象最下面一行的左邊第一個(gè)象素,然后是左邊第二個(gè)象素……接下來是倒數(shù)第二行左邊第一個(gè)象素,左邊第二個(gè)象素……依次類推,最后得到的是最上面一行的最右一個(gè)象素。在圖像預(yù)處理部分的圖像數(shù)據(jù)讀取部分,使用了微軟提供的一個(gè)圖像函數(shù)庫dibapi.h和dibapi.cpp,里面已經(jīng)含有一些基本的圖像處理函數(shù),在此就不再列舉源代碼,而緊緊將其接口加以描述,以使讀者清晰每個(gè)函數(shù)的作用。同時(shí)對(duì)該庫又加以擴(kuò)充以滿足本程序的需要。2.2相關(guān)函數(shù)介紹所有的函數(shù)定義及聲明位于dibapi.h、dibapi.cpp、mydiblib.h中。首先來看7個(gè)圖像數(shù)據(jù)讀取/存儲(chǔ)/創(chuàng)建以及圖像基本信息獲取函數(shù)。圖像數(shù)據(jù)讀取/保存由函數(shù)ReadDIBFile、SaveDIB、FindDIBBits、DIBWidth、DIBHeight、DIBNumColors完成,其調(diào)用接口如下:(1)ReadDIBFile函數(shù)函數(shù)原型: HDIBWINAPIReadDIBFile(CFile&file);參數(shù):CFile&file-要讀取得文件文件CFile返回值:HDIB-成功返回DIB的句柄,否則返回NULL。說明:該函數(shù)將指定的文件中的DIB對(duì)象讀到指定的內(nèi)存區(qū)域中。除文件頭之外的內(nèi)容都將被讀入內(nèi)存。HDIB即此內(nèi)存區(qū)域的指針(2)SaveDIB函數(shù)函數(shù)原型:BOOLWINAPISaveDIB(HDIBhDib,CFile&file);參數(shù):HDIBhDib-要保存的DIBCFile&file-保存文件CFile返回值:BOOL-成功返回TRUE,否則返回FALSE或者CFileException說明:該函數(shù)將指定的DIB對(duì)象保存到指定的CFile中。該CFile由調(diào)用程序打開和關(guān)閉。(3)FindDIBBits函數(shù)函數(shù)原型:LPSTRWINAPIFindDIBBits(LPSTRlpbi);參數(shù):LPSTRlpbi-指向DIB對(duì)象的指針返回值:LPSTR-指向DIB圖像象素起始位置說明:該函數(shù)計(jì)算DIB中圖像象素?cái)?shù)據(jù)區(qū)的起始位置,并返回指向它的指針。[注]LPSTR指針為指向字符串的32位的指針。在對(duì)256色圖像進(jìn)行象素操作時(shí),可以用(BYTE*)或(unsignedchar*)強(qiáng)制將其轉(zhuǎn)換為8位的指針(4)DIBWidth函數(shù)函數(shù)原型:DWORDWINAPIDIBWidth(LPSTRlpDIB)參數(shù):LPSTRlpbi-指向DIB對(duì)象的指針返回值:DWORD-DIB中圖像的寬度說明:該函數(shù)返回DIB中圖像的寬度。對(duì)于Windows3.0DIB,返回BITMAPINFOHEADER中的biWidth值;對(duì)于其他返回BITMAPCOREHEADER中的bcWidth值。(5)DIBHeight函數(shù)函數(shù)原型:DWORDWINAPIDIBHeight(LPSTRlpDIB)參數(shù):LPSTRlpDIB-指向DIB對(duì)象的指針返回值:DWORD-DIB中圖像的高度說明:該函數(shù)返回DIB中圖像的高度。對(duì)于Windows3.0DIB,返回BITMAPINFOHEADER中的biHeight值;對(duì)于其他返回BITMAPCOREHEADER中的bcHeight值。(6)DIBNumColors函數(shù)函數(shù)原型:WORDWINAPIDIBNumColors(LPSTRlpbi)參數(shù):LPSTRlpbi-指向DIB對(duì)象的指針返回值:WORD-返回調(diào)色板中顏色的種數(shù)說明:該函數(shù)返回DIB中調(diào)色板的顏色的種數(shù)。對(duì)于單色位圖,返回2,對(duì)于16色位圖,返回16,對(duì)于256色位圖,返回256;對(duì)于真彩色位圖(24位),沒有調(diào)色板,返回0。以上6個(gè)函數(shù)是在圖像處理過程中讀取/保存圖像以及獲取圖像基本信息的6個(gè)最基本的函數(shù)。還有一個(gè)NewDIB函數(shù)是作者自己編寫的,用來建立一個(gè)新的DIB。此函數(shù)非常有用,可以十分便利的根據(jù)所提供的要?jiǎng)?chuàng)建的位圖的基本信息(高度、寬度、顏色位數(shù))來開辟內(nèi)存,并自動(dòng)完成位圖信息頭的填充工作。(7)NewDIB函數(shù)其完整程序代碼及注釋介紹如下:/********************************************************************函數(shù)名稱:NewDIB()*參數(shù):*width -將要?jiǎng)?chuàng)建DIB的寬*height -將要?jiǎng)?chuàng)建DIB的高*biBitCount -將要?jiǎng)?chuàng)建DIB的位數(shù)。比如,如果要?jiǎng)?chuàng)建256色DIB,則此值為8**返回值:*HDIB-成功返回DIB的句柄,否則返回NULL。**說明:*該函數(shù)指定寬、高、顏色位數(shù)來創(chuàng)建一個(gè)新的DIB,并返回其句柄***************************************************************/HDIBWINAPINewDIB(longwidth,longheight,unsignedshortbiBitCount){ //計(jì)算新建的DIB每行所占的字節(jié)數(shù)longdwindth=(width*biBitCount/8+3)/4*4;//新建的DIB調(diào)色板中表項(xiàng)的數(shù)目 WORDcolor_num;//通過輸入的biBitCount值來確定調(diào)色板的表項(xiàng)數(shù)目 switch(biBitCount) {//如果用1bit來表示一個(gè)象素那么調(diào)色板中有兩個(gè)表項(xiàng) case1:color_num=2; break;//如果用4bit來表示一個(gè)象素那么調(diào)色板中有16個(gè)表項(xiàng) case4: color_num=16; break;//如果用8bit來表示一個(gè)象素,那么調(diào)色板中得表項(xiàng)有256中(本程序大多采用這種形式) case8: color_num=256; break;//其他的情況調(diào)色扳中沒有表項(xiàng),即真彩位圖 default: color_num=0; break; }//計(jì)算位圖數(shù)據(jù)所占的空間//dwindth*height為象素?cái)?shù)據(jù)所占的空間//40為位圖信息頭占的空間//color_num*4為調(diào)色板的表項(xiàng)所占的空間(調(diào)色板每個(gè)表項(xiàng)占4各個(gè)字節(jié))dwBitsSize=dwindth*height+40+color_num*4;//建立指向位圖文件的指針LPSTRpDIB;//申請(qǐng)存儲(chǔ)空間,并建立指向位圖的句柄HDIBhDIB=(HDIB)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,dwBitsSize);//如果申請(qǐng)空間不成功返回錯(cuò)誤信息 if(hDIB==0) { returnNULL; }//如果申請(qǐng)空間成功鎖定內(nèi)存,并將內(nèi)存的指針傳給pDIB pDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB); //建立指向位圖信息頭結(jié)構(gòu)的指針 LPBITMAPINFOlpmf=(LPBITMAPINFO)pDIB;//給位圖信息頭內(nèi)的各個(gè)參量賦值//指定位圖信息頭結(jié)構(gòu)的大小為40字節(jié) lpmf->bmiHeader.biSize=40;//指定新建位圖的寬度 lpmf->bmiHeader.biWidth=width;//指定新建位圖的高度lpmf->bmiHeader.biHeight=height;//位平面數(shù)必須為1lpmf->bmiHeader.biPlanes=1;//確定新建位圖表示顏色是要用到的bit數(shù)lpmf->bmiHeader.biBitCount=biBitCount;//是否進(jìn)行壓縮 lpmf->bmiHeader.biCompression=0;//新建的位圖中實(shí)際的位圖數(shù)據(jù)所占的字節(jié)數(shù)lpmf->bmiHeader.biSizeImage=dwindth*height;//指定目標(biāo)設(shè)備的水平分辨率 lpmf->bmiHeader.biXPelsPerMeter=2925;//指定目標(biāo)設(shè)備的垂直分辨率lpmf->bmiHeader.biYPelsPerMeter=2925;//新建圖像實(shí)際用到的顏色數(shù)如果為0則用到的顏色數(shù)為2的biBitCount次lpmf->bmiHeader.biClrUsed=0;//指定新建圖像中重要的顏色數(shù),如果為0則所有的顏色都重要 lpmf->bmiHeader.biClrImportant=0; //如果新建的圖像中含有調(diào)色板,則接下來對(duì)調(diào)色板的各種顏色分量賦初始值 if(color_num!=0) { for(inti=0;i<color_num;i++) { lpmf->bmiColors[i].rgbRed=(BYTE)i; lpmf->bmiColors[i].rgbGreen=(BYTE)i; lpmf->bmiColors[i].rgbBlue=(BYTE)i; } }//解除鎖定::GlobalUnlock((HGLOBAL)hDIB);//返回新建位圖的句柄 returnhDIB;}以上的7個(gè)函數(shù)是打開、保存、創(chuàng)建位圖以及獲取位圖基本信息的常用函數(shù)下面的4個(gè)函數(shù)是顯示位圖、清除屏幕、以及畫框的函數(shù)。其中PaintDIB函數(shù)是微軟函數(shù)庫提供的,由DisplayDIB函數(shù)調(diào)用,在此不再列舉源代碼,只是提供調(diào)用接口的講解。其他的3個(gè)編寫的函數(shù)列出詳細(xì)的源代碼。(8)PaintDIB函數(shù)調(diào)用接口:函數(shù)原型BOOLWINAPIPaintDIB(HDC,LPRECT,HDIB,LPRECT,CPalette*pPal);參數(shù):HDChDC-輸出設(shè)備DCLPRECTlpDCRect-繪制矩形區(qū)域HDIBhDIB-指向DIB對(duì)象的指針LPRECTlpDIBRect-要輸出的DIB區(qū)域CPalette*pPal-指向DIB對(duì)象調(diào)色板的指針返回值:BOOL-繪制成功返回TRUE,否則返回FALSE。說明:該函數(shù)主要用來繪制DIB對(duì)象。其中調(diào)用了StretchDIBits()或者SetDIBitsToDevice()來繪制DIB對(duì)象。輸出的設(shè)備由由參數(shù)hDC指定;繪制的矩形區(qū)域由參數(shù)lpDCRect指定;輸出DIB的區(qū)域由參數(shù)*lpDIBRect指定。(9)在屏幕上顯示位圖的DisplayDIB函數(shù)其完整源代碼及注釋介紹如下:/***********************************************************************函數(shù)名稱:DisplayDIB參數(shù): CDC*pDC -指向當(dāng)前設(shè)備上下文(DiviceContext)的指針 HDIBhDIB -要顯示的位圖的句柄**********************************************************************/voidDisplayDIB(CDC*pDC,HDIBhDIB){ //鎖定位圖并獲取指向位圖的指針 BYTE*lpDIB=(BYTE*)::GlobalLock(hDIB); //獲取DIB寬度和高度 intcxDIB=::DIBWidth((char*)lpDIB); intcyDIB=::DIBHeight((char*)lpDIB); //設(shè)置位圖的尺寸 CRectrcDIB,rcDest; rcDIB.top=rcDIB.left=0; rcDIB.right=cxDIB; rcDIB.bottom=cyDIB; //設(shè)置目標(biāo)客戶區(qū)輸出大小尺寸(在這里直接令其為位圖的尺寸) rcDest=rcDIB; //清除屏幕 ClearAll(pDC); //在客戶區(qū)顯示圖像 ::PaintDIB(pDC->m_hDC,rcDest,hDIB,rcDIB,NULL); //解除鎖定 ::GlobalUnlock((HGLOBAL)hDIB);}(10)清除當(dāng)前屏幕客戶區(qū)內(nèi)容的ClearAll函數(shù)其完整源代碼及注釋介紹如下:voidClearAll(CDC*pDC){ //設(shè)置清除區(qū)域 CRectrect; rect.left=0;rect.top=0;rect.right=2000;rect.bottom=1000; //創(chuàng)建一白色畫筆 CPenpen; pen.CreatePen(PS_SOLID,1,RGB(255,255,255)); pDC->SelectObject(&pen); //繪制一白色矩形以清除客戶區(qū) pDC->Rectangle(&rect); //清除畫筆 ::DeleteObject(pen);}(11)畫框函數(shù)DrawFrame其完整源代碼及注釋介紹如下:/***********************************************************************函數(shù)名稱:DrawFrame參數(shù): CDC*pDC -指向當(dāng)前設(shè)備上下文的指針HDIBhDIB -指向位圖的句柄 CRectLinkcharRect -一個(gè)元素為Crect類對(duì)象的鏈表unsignedintlinewidth -指出框的寬度COLORREFcolor -指出框的顏色說明: 調(diào)用此函數(shù)之前要先完成分割操作,否則無法在分割出來的字符外畫框。進(jìn)行分割、標(biāo)準(zhǔn)化操作之后會(huì)自動(dòng)生成一個(gè)Crect鏈表。關(guān)于此鏈表的使用涉及到STL(StandardTemplateLibrary)技術(shù),在后面字符分割一節(jié)有個(gè)簡(jiǎn)要的介紹。**********************************************************************/voidDrawFrame(CDC*pDC,HDIBhDIB,CRectLinkcharRect,unsignedintlinewidth,COLORREFcolor){ //創(chuàng)建畫筆 CPenpen; pen.CreatePen(PS_SOLID,linewidth,color); pDC->SelectObject(&pen); //創(chuàng)建一個(gè)NULL畫刷 ::SelectObject(*pDC,GetStockObject(NULL_BRUSH)); CRectrect,rect2; //鎖定位圖句柄并獲取其指針 BYTE*lpDIB=(BYTE*)::GlobalLock((HGLOBAL)hDIB); while(!charRect.empty()) { //從表頭上得到一個(gè)矩形 rect2=rect=charRect.front(); //從鏈表頭上面刪掉一個(gè) charRect.pop_front(); //坐標(biāo)轉(zhuǎn)換 //注意,這里原先的rect是相對(duì)于圖像原點(diǎn)(左下角)的, //而在屏幕上繪圖時(shí),要轉(zhuǎn)換以客戶區(qū)為原點(diǎn)的坐標(biāo) rect.top=::DIBHeight((char*)lpDIB)-rect2.bottom; rect.bottom=::DIBHeight((char*)lpDIB)-rect2.top; pDC->Rectangle(&rect); } //解除鎖定 ::GlobalUnlock((HGLOBAL)hDIB);}至此,圖像讀取/保存/創(chuàng)建/顯示/清除屏幕/畫框等11個(gè)函數(shù)已介紹完畢。再提一下本程序自動(dòng)刷新的實(shí)現(xiàn)。所謂自動(dòng)刷新,即每當(dāng)屏幕內(nèi)容被遮擋或者說客戶區(qū)需要重畫的時(shí)候,根據(jù)OnPaint消息來自動(dòng)的刷新客戶區(qū)。這里我們使用OnPaint和OnDraw一起來實(shí)現(xiàn)自動(dòng)刷新。代碼如下:voidCChildView::OnPaint(){ CPaintDCdc(this); OnDraw(&dc);}//OnDraw函數(shù)voidCChildView::OnDraw(CDC*pDC){ //如果m_hDIB不為NULL,即表示已經(jīng)加載了圖像文件,那么重畫客戶區(qū) if(m_hDIB!=NULL) DisplayDIB(pDC,m_hDIB);}2.3轉(zhuǎn)化成灰度圖灰度圖像是指只含亮度信息,不含色彩信息的圖像。要表示灰度圖像,需要把亮度值進(jìn)行量化。通常劃分為0到255共256個(gè)級(jí)別,0表示最暗(黑),255表示最亮(白)。它可以表示為物體的二維光強(qiáng)度函數(shù)f(x,y),其中x,y是圖像空間點(diǎn)的坐標(biāo),任意點(diǎn)(x,y)處的函數(shù)值f(x,y)正比于圖像在該點(diǎn)的亮度??梢园鸦叶葓D像考慮為一個(gè)矩陣,其行和列表示為圖像的一個(gè)點(diǎn),而相應(yīng)的矩陣中元素值表示該點(diǎn)的灰度值。一幅彩色圖像可表示為:f(x,y)=(R,G,B)其中R,G,B分別為圖像坐標(biāo)(x,y)處的紅色、綠色、藍(lán)色分量值。將一幅彩色圖像變換為灰度圖,根據(jù)色度學(xué)原理和國際照明委員會(huì)(CIE)的RGB顏色表示系統(tǒng),本研究得到亮度信息,采用如下公式:f(x,y)=(0.299*r+0.587*g+0.114*b)圖像的灰度處理由Convert256toGray函數(shù)完成。2.4灰度圖像二值化在進(jìn)行了灰度化處理之后,圖像中的每個(gè)象素只有一個(gè)值,那就是象素的灰度值。它的大小決定了象素的亮暗程度。為了更加便利的開展下面的圖像處理操作,還需要對(duì)已經(jīng)得到的灰度圖像做一個(gè)二值化處理。圖像的二值化就是把圖像中的象素根據(jù)一定的標(biāo)準(zhǔn)分化成兩種顏色。在系統(tǒng)中是根據(jù)象素的灰度值處理成黑白兩種顏色。和灰度化相似的,圖像的二值化也有很多成熟的算法。它可以采用自適應(yīng)閥值法,也可以采用給定閥值法。系統(tǒng)中采用的是給定閥值的方法。因?yàn)榭紤]到所要進(jìn)行處理的圖像大多是從印刷出版物上掃描得來的底色大多為白色所以我們將這個(gè)閾值固定為220,讀者也可以根據(jù)實(shí)際的情況來自己進(jìn)行閾值的設(shè)定。圖像二值化的函數(shù)由ConvertGrayToWhiteBlack實(shí)現(xiàn),源代碼如下:2.5圖像的梯度銳化由于需要處理的圖像大多有印刷出版物上掃描而來所以在很多的情況下字體模糊,對(duì)識(shí)別造成了一定的困難,所以有時(shí)我們要對(duì)圖像進(jìn)行銳化處理使模糊的圖像變得清晰起來,同時(shí)可以對(duì)噪聲起到一定的去除作用。圖像銳化的方法有很多,有一種是微分法,有一種是高通濾波法,我們?cè)谶@里所采用的梯度銳化的方法就屬于微分法的一種。在這里我們采用Roberts梯度算子對(duì)圖像進(jìn)行銳化。定義如下:設(shè)原始圖像上的點(diǎn)為。定義在處的梯度矢量為:設(shè)一個(gè)判定閾值為,變化后的圖像定義為:通過公式可以看出梯度銳化可以讓模糊的邊緣變得清楚同時(shí)選擇合適的閾值還可以減弱和消除一些細(xì)小的噪聲。本程序中給出了梯度銳化的完整代碼,讀者也可以根據(jù)實(shí)際需求、讀入圖片的質(zhì)量來選擇決定是否使用梯度銳化。事實(shí)證明,梯度銳化具備一定的去噪聲能力,但同時(shí)會(huì)對(duì)字符的邊緣有所損傷。所以筆者建議在圖片中字符較為細(xì)小的時(shí)候不要使用梯度銳化。圖像的梯度銳化可以通過函數(shù)GradientSharp來實(shí)現(xiàn):2.6去除離散的雜點(diǎn)噪聲圖像可能在掃描或者傳輸過程中夾帶了噪聲,去噪聲是圖像處理中常用的手法。通常去噪聲用濾波的方法,比如中值濾波、均值濾波。但是那樣的算法不適合用在處理字符這樣目標(biāo)狹長(zhǎng)的圖像中,因?yàn)樵跒V波的過程中很有可能會(huì)去掉字符本身的象素。系統(tǒng)采用的是去除雜點(diǎn)的方法來進(jìn)行去噪聲處理的。具體算法如下:掃描整個(gè)圖像,當(dāng)發(fā)現(xiàn)一個(gè)黑色點(diǎn)的時(shí)候,就考察和該黑色點(diǎn)間接或者直接相連接的黑色點(diǎn)的個(gè)數(shù)有多少,如果大于一定的值,那就說明該點(diǎn)不是離散點(diǎn),否則就是離散點(diǎn),把它去掉。在考察相連的黑色點(diǎn)的時(shí)候用的是遞歸的方法。去雜點(diǎn)的功能由RemoveScatterNoise、DeleteScaterJudge兩個(gè)函數(shù)完成。2.7整體傾斜度調(diào)整因?yàn)樽x進(jìn)來的圖像可能存在傾斜,所以必須對(duì)它進(jìn)行調(diào)整,使得字符都處于同一水平位置,那樣即便利字符的分割也可以提高字符識(shí)別的準(zhǔn)確率。調(diào)整的算法主要是根據(jù)圖像上左右兩邊的黑色象素的平均高度來的。一般來說,眾多的字符組成的圖像它的左右兩邊的字符象素的高度應(yīng)該是處于水平位置附近的,如果兩邊字符象素的平均位置有比較大的起落,那就說明圖像存在傾斜,需要進(jìn)行調(diào)整。具體來說,首先要分別計(jì)算圖像左半邊和右半邊的象素的平均高度,然后求的斜率,根據(jù)斜率重新組織圖像,里面包含了一個(gè)從新圖像到舊圖像的象素的映射。如果新圖像中的象素映射到舊圖像中時(shí)超出了舊圖像的范圍,則把新圖像中的該象素置白色。圖像的調(diào)整由SlopeAdjust函數(shù)完成。2.8字符分割系統(tǒng)在讀進(jìn)來的圖像中一般會(huì)含有多個(gè)數(shù)字,識(shí)別的時(shí)候只能根據(jù)每個(gè)字符的特征來進(jìn)行判斷,所以還要進(jìn)行字符分割的工作。這一步工作就是把圖像中的字符獨(dú)立的分割出來。具體的算法如下:第一步,先自下向上對(duì)圖像進(jìn)行逐行掃描直至遇到第一個(gè)黑色的象素點(diǎn)。記錄下來。然后再由上向下對(duì)圖像進(jìn)行逐行掃描直至找到第一個(gè)黑色象素,這樣就找到圖像大致的高度范圍。第二步,在這個(gè)高度范圍之內(nèi)在自左向右逐列進(jìn)行掃描,遇到第一個(gè)黑色象素時(shí)認(rèn)為是字符分割的起始位置,然后繼續(xù)掃描,直至遇到有一列中沒有黑色象素,則認(rèn)為這個(gè)字符分割結(jié)束,然后繼續(xù)掃描,按照上述的方法一直掃描直至圖像的最右端。這樣就得到了每個(gè)字符的比較精確寬度范圍。第三步,在已知的每個(gè)字符比較精確的寬度范圍內(nèi),按照第一步的方法,分別進(jìn)行自上而下和自下而上的逐行掃描來獲取每個(gè)字符精確的高度范圍。字符的分割用CharSegment函數(shù)來實(shí)現(xiàn)。為了能夠清楚的看出圖像分割的結(jié)果作者在這里設(shè)計(jì)了一個(gè)函數(shù)DrawFrame用來在每個(gè)已經(jīng)分割完畢的字符周圍畫邊框,這個(gè)畫框函數(shù)只會(huì)起到標(biāo)識(shí)圖像的作用,并不會(huì)對(duì)位圖本身的內(nèi)容造成改變。這里,簡(jiǎn)要介紹一下STL模板中隊(duì)列鏈表deque庫的使用。要使用該庫,首先要作如下聲明:#include<iostream>#include<deque>usingnamespacestd;typedefdeque<CRect>CRectLink;typedefdeque<HDIB>HDIBLink;這樣,以后用CRectLink就可以定義一個(gè)元素為Crect的鏈表了。HDIBLink也是一個(gè)鏈表,不過其中的元素為位圖句柄HDIB。假如用CrectLink定義了一個(gè)鏈表a,那么:a.push_back(rect)可以將一個(gè)矩形區(qū)域?qū)ο蟛迦氲芥湵砗蟛縜.front()可以讀取鏈表頭部的一個(gè)矩形對(duì)象(只是讀取,不刪除)a.pop_front()可以刪除鏈表頭部的一個(gè)矩形對(duì)象a.empty()如果鏈表為空,則返回1;否則,為0至此相信對(duì)STL模板類中的deque已經(jīng)有了一個(gè)基本的認(rèn)識(shí)。該鏈表的使用十分方便。2.9圖像的歸一化處理 因?yàn)閽呙柽M(jìn)來的圖像中字符大小存在較大的差異,而相對(duì)來說,統(tǒng)一尺寸的字符識(shí)別的標(biāo)準(zhǔn)性更強(qiáng),準(zhǔn)確率自然也更高,標(biāo)準(zhǔn)化圖像就是要把原來各不相同的字符統(tǒng)一到同一尺寸,在系統(tǒng)實(shí)現(xiàn)中是統(tǒng)一到同一高度,然后根據(jù)高度來調(diào)整字符的寬度。具體算法如下:先得到原來字符的高度,跟系統(tǒng)要求的高度做比較,得出要變換的系數(shù),然后根據(jù)得到的系數(shù)求得變換后應(yīng)有得寬度。再得到寬度高度之后,把新圖像里面得點(diǎn)按照插值得方法映射到原圖像中。圖像的標(biāo)準(zhǔn)歸一化處理由函數(shù)StdDIBbyRect來實(shí)現(xiàn)。圖像標(biāo)準(zhǔn)歸一化的高度和寬度信息可以通過一個(gè)對(duì)話框由讀者自行輸入,但是為了以后特征提取的時(shí)候處理方便,進(jìn)行BP網(wǎng)絡(luò)訓(xùn)練的時(shí)候縮短訓(xùn)練的時(shí)間,標(biāo)準(zhǔn)化的寬度和高度不要設(shè)置的過大。建議去歸一化寬度為24,高度為48。2.10圖像的緊縮重排經(jīng)過標(biāo)準(zhǔn)歸一化處理后的各個(gè)字符在圖像中的位置不定,要它進(jìn)行特征提取時(shí)處理起來比較麻煩,所以要把歸一化后的字符進(jìn)行緊縮重排,以形成新的位圖句柄,以方便下一步的特征提取的操作。緊縮重排由函數(shù)AutoAlign()來實(shí)現(xiàn),2.11特征提取經(jīng)過上面一系列的變換,原來,大小不同,分布不規(guī)律的各個(gè)字符變成了一個(gè)個(gè)大小相同,排列整齊的字符。下面就要從被分割歸一處理完畢的字符中,提取最能體現(xiàn)這個(gè)字符特點(diǎn)的特征向量。將提取出訓(xùn)練樣本中的特征向量代入BP網(wǎng)絡(luò)之中就可以對(duì)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,提取出待識(shí)別的樣本中的特征相量代入到訓(xùn)練好的BP網(wǎng)絡(luò)中,就可以對(duì)字符進(jìn)行識(shí)別。特征向量的提取方法多種多樣,有逐象素特征提取法,骨架特征提取法,垂直方向數(shù)據(jù)統(tǒng)計(jì)特征提取法,13點(diǎn)特征提取法,弧度梯度特征提取法等很多種方法,根據(jù)具體情況的不同我們可以來選擇不同的方法。下面幾種簡(jiǎn)單的特征提取方法:A.逐象素特征提取法這是一種最簡(jiǎn)單的特征提取方法,對(duì)圖像進(jìn)行逐行逐列的掃描當(dāng)遇到黑色象素時(shí)取其特征值為1,遇到白色象素時(shí)取其特征值為0,這樣當(dāng)掃描結(jié)束以后就形成了一個(gè)維數(shù)與圖像中象素點(diǎn)的個(gè)數(shù)相同的特征向量矩陣。這種算法可以由函數(shù)code實(shí)現(xiàn):*函數(shù)名稱:code()**參量:*BYTE*lpDIBBits-指向輸入圖像的象素其實(shí)位置的指針*intnum-圖片中樣本的個(gè)數(shù)*LONGlLineByte-輸入圖片每行的字節(jié)數(shù)*LONGlSwidth-預(yù)處理時(shí)歸一化的寬度*LONGlSheight-預(yù)處理時(shí)歸一化的長(zhǎng)度**返回值:double**-特征向量矩陣(二維的)*函數(shù)功能:*對(duì)于輸入樣本提取特征向量,在這里把歸一化樣本的* 每一個(gè)象素都作為特征提取出來double**code(BYTE*lpDIBBits,intnum,LONGlLineByte,LONGlSwidth,LONGlSheight){ //循環(huán)變量 inti,j,k; BYTE*lpSrc; //建立保存特征向量的二維數(shù)組 double**data; //為這個(gè)數(shù)組申請(qǐng)二維存儲(chǔ)空間 data=alloc_2d_dbl(num,lSwidth*lSheight); //將歸一化的樣本的每個(gè)象素作為一個(gè)特征點(diǎn)提取出來 //逐個(gè)數(shù)據(jù)掃描 for(k=0;k<num;k++) { //對(duì)每個(gè)數(shù)據(jù)逐行掃描 for(i=0;i<lSheight;i++) { //對(duì)每個(gè)數(shù)據(jù)逐列掃描 for(j=k*lSwidth;j<(k+1)*lSwidth;j++) { //指向圖像第i行第j列個(gè)象素的指針 lpSrc=lpDIBBits+i*lLineByte+j; //如果這個(gè)象素是黑色的 if(*(lpSrc)==0) //將特征向量的相應(yīng)位置填1 data[k][i*lSwidth+j-k*lSwidth]=1; //如果這個(gè)象素是其他的顏色 if(*(lpSrc)!=0) //將特征向量的相應(yīng)位置填0 data[k][i*lSwidth+j-k*lSwidth]=0; } } } //返回特征向量矩陣 return(data);}這種特征提取方法的特點(diǎn)是算法簡(jiǎn)單,運(yùn)算速度快,可以使BP網(wǎng)絡(luò)很快的收斂,訓(xùn)練效果好,缺點(diǎn)是適應(yīng)性不強(qiáng)。但可以通過加大訓(xùn)練樣本數(shù)目的方法來增強(qiáng)其適應(yīng)性。B.13特征點(diǎn)提取方法上述的特征點(diǎn)提取方法多少都存在有適應(yīng)性不強(qiáng)的特點(diǎn),當(dāng)字符存在傾斜和偏移時(shí)都會(huì)對(duì)識(shí)別產(chǎn)生誤差,下面來介紹一種適應(yīng)性較好的13點(diǎn)特征提取方法,即從每個(gè)字符中提取13個(gè)特征點(diǎn)。首先把字符平均分成8份統(tǒng)計(jì)每一份內(nèi)黑色象素點(diǎn)的個(gè)數(shù)作為8個(gè)特征,如圖11-15所示。(這里我們以字符“3”舉例。)分別統(tǒng)計(jì)這8個(gè)區(qū)域中的黑象素的數(shù)目,可以得到8個(gè)特征。圖11-1513特征提取法然后統(tǒng)計(jì)水平方向中間兩列和豎直方向中間兩列的黑色象素點(diǎn)的個(gè)數(shù)作為4個(gè)特征,最后統(tǒng)計(jì)所有黑色象素點(diǎn)的個(gè)數(shù)作為第13個(gè)特征。也就是說,畫4道線,統(tǒng)計(jì)線穿過的黑象素的數(shù)目??梢缘玫?個(gè)特征示意圖如圖11-16所示。圖11-1613特征提取法最后,將字符圖像的全部黑色象素的數(shù)目的總和作為一個(gè)特征??偣布吹玫?3個(gè)特征。13特征提取法有著極好的適應(yīng)性,但是由于特征點(diǎn)的數(shù)目太少所以在樣本訓(xùn)練的時(shí)候比較難收斂。C.骨架特征提取法兩副圖像由于它們的線條的粗細(xì)不同,使得兩幅圖像差別很大,但是將它們的線條進(jìn)行細(xì)化以后,統(tǒng)一到相同的寬度,如一個(gè)象素寬時(shí),這時(shí)兩幅圖像的差距就不那么明顯。利用圖形的骨架作為特征來進(jìn)行數(shù)碼識(shí)別,就使得識(shí)別有了一定的適應(yīng)性。我們一般使用細(xì)化的方法來提取骨架,細(xì)化的算法又很多如Hilditch算法,Rosenfeld算法等對(duì)經(jīng)過細(xì)化的圖相利用EveryPixel函數(shù)進(jìn)行處理就可以得到細(xì)化后圖像的特征向量矩陣。骨架特征提取的方法對(duì)于線條粗細(xì)不同的數(shù)碼有一定的適應(yīng)性,但是圖像一旦出現(xiàn)偏移就難以識(shí)別。D.垂直方向數(shù)據(jù)統(tǒng)計(jì)特征提取法這種特征提取方法的算法就是自左向右對(duì)圖像進(jìn)行逐列的掃描,統(tǒng)計(jì)每列的黑色的象素的個(gè)數(shù),然后自上而下逐行掃描,統(tǒng)計(jì)每行的黑色象素的個(gè)數(shù),將統(tǒng)計(jì)結(jié)果作為字符的特征向量,如果字符的寬度為w,長(zhǎng)度為h,則特征向量的維數(shù)是w+h。這種特征提取方法可以由函數(shù)VerticalCode來實(shí)現(xiàn)。以上就是幾種基本的特征向量提取方法,還有梯度統(tǒng)計(jì),弧度統(tǒng)計(jì)等其他的特征向量提取方法。另外,還有一種效率極高的特征提取方法-角點(diǎn)提取方法。角點(diǎn)提取的方法目前一般分為基于灰度的角點(diǎn)提取和基于弧度的角點(diǎn)提取?;诨《鹊慕屈c(diǎn)提取要求首先要做邊緣提取。比較成熟的邊緣提取算法有Canny算法等。角點(diǎn)提取算法較復(fù)雜,而且用到的很多技術(shù)也較專業(yè)化,限于篇幅,這里就不再贅述了。經(jīng)多次嘗試,最終選用的是第一種特征提取方法??梢栽囉闷渌麕追N方法,從訓(xùn)練時(shí)間和識(shí)別率上加以對(duì)比。進(jìn)行數(shù)字識(shí)別3.1BP神經(jīng)網(wǎng)絡(luò)簡(jiǎn)介下面我們首先來簡(jiǎn)要介紹一下神經(jīng)網(wǎng)絡(luò),然后再詳細(xì)介紹BP網(wǎng)絡(luò)。神經(jīng)網(wǎng)絡(luò)簡(jiǎn)介:人工神經(jīng)網(wǎng)絡(luò)(ArtificialNeuralNetwork,ANN),也稱為神經(jīng)網(wǎng)絡(luò)(NeuralNetworks,NN)。即從生物學(xué)神經(jīng)系統(tǒng)的信號(hào)傳遞而抽象發(fā)展而成的一門學(xué)科。在神經(jīng)網(wǎng)絡(luò)中,最基本的單元就是神經(jīng)元。神經(jīng)元由三部分組成:樹突、細(xì)胞體和軸突。樹突是樹狀的神經(jīng)纖維接受網(wǎng)絡(luò),它將電信號(hào)傳遞給細(xì)胞體,細(xì)胞體對(duì)這些輸入信號(hào)進(jìn)行整合并進(jìn)行閥值處理。軸突是單根長(zhǎng)纖維,它把細(xì)胞體的輸出信號(hào)導(dǎo)向其他的神經(jīng)元。神經(jīng)元的排列拓?fù)浣Y(jié)構(gòu)和突觸的連接強(qiáng)度確立了神經(jīng)網(wǎng)絡(luò)的功能。形象的說,神經(jīng)網(wǎng)絡(luò)是由大量處理單元(神經(jīng)元Neurons)廣泛連接而成的網(wǎng)絡(luò),是對(duì)人腦的抽象、簡(jiǎn)化和模擬,反映人腦的基本特性。它能夠通過學(xué)習(xí)過程從外部環(huán)境中獲取知識(shí),并且它內(nèi)部的很多的神經(jīng)元可以用來存儲(chǔ)這些已經(jīng)學(xué)到的知識(shí)。上圖是將生物神經(jīng)元模型抽象成一個(gè)信號(hào)傳遞的數(shù)學(xué)模型。神經(jīng)元的輸入是信號(hào)P,經(jīng)過一個(gè)累加器累加后的信號(hào)送入一個(gè)激活函數(shù)f,從而得到這個(gè)神經(jīng)元的輸出a。這個(gè)神經(jīng)元的輸出a同時(shí)又可以作為下一個(gè)或多個(gè)神經(jīng)元的輸入,從而將神經(jīng)信號(hào)成網(wǎng)絡(luò)分散狀的傳遞出去。一個(gè)神經(jīng)元可以接受多個(gè)輸入,所以把神經(jīng)元表示成為矢量、矩陣形式更容易去處理分析實(shí)際問題。這里,P表示一R維的輸入向量,B為偏置向量,W為網(wǎng)絡(luò)的權(quán)值矩陣,f為激活傳輸函數(shù),a為網(wǎng)絡(luò)的輸出向量。以上是對(duì)一個(gè)單層神經(jīng)網(wǎng)絡(luò)的描述。一般就實(shí)際情況而言,多層網(wǎng)絡(luò)用處要廣的多。后面用到的BP網(wǎng)絡(luò)也是多層的。在多層網(wǎng)絡(luò)中,一般至少有3個(gè)層:一個(gè)輸入層、一個(gè)輸出層、一個(gè)或多個(gè)隱層。多層網(wǎng)絡(luò)可以解決很多單層網(wǎng)絡(luò)無法解決的問題,比如多層網(wǎng)絡(luò)可以用來進(jìn)行非線性分類,可以用來做精度極高的函數(shù)逼近,只要有足夠多的層和足夠多的神經(jīng)元,這些都可以辦到。一個(gè)多層網(wǎng)絡(luò)的輸入和輸出層的神經(jīng)元個(gè)數(shù)是由外部描述定義的。例如如果有4個(gè)外部變量作為輸入,那網(wǎng)絡(luò)就要有4個(gè)輸入。關(guān)于隱層神經(jīng)元的確定,將在BP網(wǎng)絡(luò)的設(shè)計(jì)中詳細(xì)討論。感知器是神經(jīng)網(wǎng)絡(luò)的基礎(chǔ),也是BP網(wǎng)絡(luò)的基礎(chǔ)。所謂感知器(perceptron),也即給定一個(gè)或多個(gè)已知類別的輸入,通過對(duì)網(wǎng)絡(luò)的訓(xùn)練以實(shí)現(xiàn)所有輸入數(shù)據(jù)的正確分類的數(shù)學(xué)模型。注意,感知器是單層網(wǎng)絡(luò)。這里,訓(xùn)練的意思就是通過感知器的輸出來反復(fù)調(diào)整網(wǎng)絡(luò)的權(quán)值,以使其滿足所有分類都正確的要求。不過一般來說,感知器的分類能力較差。神經(jīng)網(wǎng)絡(luò)有好多種,比如徑向基網(wǎng)絡(luò)、BP網(wǎng)絡(luò),Hopfield網(wǎng)絡(luò)等。本神經(jīng)網(wǎng)絡(luò)識(shí)別系統(tǒng)采用的是使用最為廣泛的BP網(wǎng)絡(luò)。下面介紹BP學(xué)習(xí)算法,BP學(xué)習(xí)過程可以描述如下:作信號(hào)正向傳播:輸入信號(hào)從輸入層經(jīng)過隱含層,傳向輸出層,在輸出端生輸出信號(hào)。這是工作信號(hào)的正向傳播。在信號(hào)傳遞的過程中網(wǎng)絡(luò)的權(quán)值是固定不變的,每一層神經(jīng)元的狀態(tài)只影響下一層神經(jīng)元的狀態(tài)。如果在輸出層得到的輸出和期望輸出的偏差比較大,則轉(zhuǎn)入誤差信號(hào)的反向傳播。誤差信號(hào)反向傳播:網(wǎng)絡(luò)的實(shí)際輸出和期望輸出的差值就是誤差信號(hào)。誤差信號(hào)的反向傳播就是誤差信號(hào)從輸出端傳向輸入端。在這個(gè)過程當(dāng)中,網(wǎng)絡(luò)的權(quán)值由誤差反饋進(jìn)行調(diào)節(jié)。通過不斷的修改網(wǎng)絡(luò)權(quán)值從而使得網(wǎng)絡(luò)的輸出不斷的逼近期望值。圖11-17是神經(jīng)網(wǎng)絡(luò)的示意圖。圖11-18是多層BP網(wǎng)絡(luò)結(jié)構(gòu)示意圖。圖11-17神經(jīng)網(wǎng)絡(luò)示意圖圖11-18多層BP網(wǎng)絡(luò)示意圖神經(jīng)網(wǎng)絡(luò)的激勵(lì)函數(shù)。激勵(lì)函數(shù)將輸出信號(hào)壓縮在一個(gè)允許的范圍內(nèi),使其成為有限值,通常神經(jīng)元輸出的范圍在【0,1】或者【-1,1】的閉區(qū)間上。常用的基本激勵(lì)函數(shù)有閾值函數(shù)、分段線性函數(shù)、Sigmoid函數(shù)。其中Sigmoid函數(shù)也稱為s型函數(shù),它是人工神經(jīng)網(wǎng)絡(luò)中用的最多的激勵(lì)函數(shù)。S型函數(shù)的定義如下: 公式(1)神經(jīng)網(wǎng)絡(luò)的反饋調(diào)節(jié)。在誤差信號(hào)的反向傳播中,網(wǎng)絡(luò)不斷的修正各個(gè)節(jié)點(diǎn)的權(quán)值。設(shè)有含n個(gè)節(jié)點(diǎn)的BP網(wǎng)絡(luò),采用s型激勵(lì)函數(shù)。為簡(jiǎn)單起見,可以假設(shè)網(wǎng)絡(luò)只有一個(gè)輸出y,任一節(jié)點(diǎn)的輸出為,并設(shè)有N個(gè)樣本k=1,2,…,N),對(duì)某一輸入,網(wǎng)絡(luò)的輸出為,節(jié)點(diǎn)i的輸出為,節(jié)點(diǎn)j的輸入為:公式(2)使用平方型誤差函數(shù):公式(3)其中為網(wǎng)絡(luò)之實(shí)際輸出,定義如下:公式(4)公式(5)公式(6)其中:公式(7)于是有:公式(8)當(dāng)j為輸出節(jié)點(diǎn)時(shí),公式(9)若j不是輸出節(jié)點(diǎn)時(shí),有:公式(10)公式(11)因此可得:BP網(wǎng)絡(luò)的學(xué)習(xí)過程。BP學(xué)習(xí)算法可以歸納如下:第一步設(shè)置變量和參數(shù),其中包括訓(xùn)練樣本,權(quán)值矩陣,學(xué)習(xí)速率。第二步初始化,給各個(gè)權(quán)值矩陣一個(gè)較小

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論