【正文】
向紋理的分割方法,能夠對各類車輛圖像實現(xiàn)很好的分割效果。因此,在對車輛圖像進行邊緣檢測的時候,要經(jīng)過兩個步驟:初步邊緣檢測和水平梯度方向邊緣檢測。這樣得到的圖像中就留下了大量的豎向邊緣特征,為后面準確的車牌定位提供了最根本的依據(jù)。圖像分割的一種重要途徑是通過邊緣檢測,即檢測灰度級具有突變的地方。這樣的地方表明一個區(qū)域的終結,也是另一個區(qū)域的開始,這種不連續(xù)性稱為邊緣。邊緣檢測不僅用于圖像分割,也是紋理分析等其它圖像分析的重要信息源和形狀特征基礎。需要說明的是:邊緣與物體間的邊界并不等同,邊緣指的是圖像中像素值有突變的地方,而物體的邊界指的是現(xiàn)實場景中的存在于物體之間的邊界。一幅圖像中,有可能有邊緣的地方并非邊界,也有可能物體的邊界在圖像中不成為邊緣,這是因為現(xiàn)實中的物體是三維的,而圖像只有二維信息,從三維到二維的投影成像不可避免的會丟失一部分信息;另外成像過程中的光照和噪聲也是不可避免的重要因素。經(jīng)典的邊緣提取方法是考察圖像的每個像素點在某個區(qū)域內(nèi)灰度的變化,利用邊緣鄰近一階或二階方向導數(shù)變化規(guī)律檢測邊緣。這種方法為邊緣檢測局部算子法。邊緣的種類分為兩種:一是階躍邊緣,它兩邊像素的灰度值有著顯著的不同;一是屋頂邊緣,它位于灰度值從增加到減少(或從減少到增加)的變化的轉折點。邊緣檢測算子檢查每個像素的領域并對灰度變化率進行量化,通常也包括方向的確定。有若干種方法可以使用,其中大多數(shù)是基于方向導數(shù)掩模求卷積的方法。本文采用的是 Sobel 算子邊緣檢測算法。Sobel 邊緣檢測要用兩個卷積核作用于同一幅圖像,這兩個卷積核分別用來計算水平和垂直方向的梯度,它們是: ???????120??????102設用兩個卷積核分別進行卷積操作的中間圖像為 和 ,其中 取][yxGh][yxvx值范圍為 0~width1,y 的取值范圍為 0~height1,則最后的結果圖像如 36 或 37或 38 所示: (36)][][][22yxyxyxMvhsobel ??或 西南交通大學本科畢業(yè)設計(論文) 第 16 頁 (37)][][][yxGyxyxMvhsobel ??或 (38))][,][ma(][vhsobel這時檢測的方向為公式 39 所示: (39))][(tan][1yxGyxhvsobel???很顯然,上述算法的計算量相當大:第一,要做兩次卷積操作;第二,要計算范數(shù)。下面介紹改進后的 Sobel 邊緣檢測算法。假定以當前像素為中心獲取一個 33鄰域,按行按列依次編號為 a,b,c ,d,e,f,g,h,i。這樣,中心像素被編號為e。在這個鄰域中,過中心像素 e 的直線共有 4 條,它們是 aei,beh,ceg,def。每條分割線均將鄰域剩下的像素分成兩部分。對于每一條分割線,分別計算其兩個子部分的像素平均值之差的絕對值。最后在四個絕對值中選擇最大者作為當前像素的最后值。實驗證明,Sobel 邊緣檢測算法所生成的結果是非常令人滿意的。邊緣檢測流程圖如圖 33 所示。 西南交通大學本科畢業(yè)設計(論文) 第 17 頁設置像素指針B Y T E * p b y R s ci = 0 , j = 0若 i 圖像高度H I G H若 j 圖像寬度 W E I T H獲取當前像素值以及周圍點的像素值用邊緣檢測 S O B E L 算子檢測像素點周圍像素導數(shù)變化 , 并乘以 S O B E L算子的橫向矩陣和縱向矩陣j + +i + +更新當前視圖結束將原圖再乘以S O B E L 算子的縱向矩陣系數(shù) ,得到新的圖像用原圖像與新圖像相減 , 得到最終圖像更新當前視圖開始YNYN圖 33 邊緣檢測流程圖 消弱背景噪聲對于背景的消弱的好環(huán)也關系到車牌位置的提取準確性。因此在這個環(huán)節(jié)處理也至關重要。該函數(shù)用指定的模板(任意大?。﹣韺D像進行操作,參數(shù)iTempH 指定模板的高度,參數(shù)iTempW 指定模板的寬度,參數(shù)iTempMX 和iTempMY 指定模板的中心元素坐標,參數(shù)fpArray 指定模板元素, fCoef 指定系數(shù)。調(diào)用該函數(shù)能夠很好的處理背景帶來的干擾。同樣在主菜單項下建立一個子菜單并標題為消弱背景干擾。其大概過程是這樣的:首先獲取文檔,使指針指向DIB 對象,并且鎖定對象,調(diào)用自定義的模板消弱背景干擾。最后解除鎖定并更新視圖。噪聲過濾流程圖如圖 34 所示。 西南交通大學本科畢業(yè)設計(論文) 第 18 頁設置像素指針i = 1 , j = 1若 i 圖像高度 H I G H若 j 圖像寬度 W E I T H獲取當前像素點的值獲取當前像素點前一個像素值令當前像素點減去前一個像素點j + +i + +更新當前視圖結束開始YNNY圖 34 噪聲過濾流程圖 車牌捕捉在上述的圖像預處理工作,無疑是為了給車牌定位做下基礎。車牌的搜索定位有基于紋理特征的車牌定位方法、投影法、基于顏色和紋理車牌定位方法等由于投影法比較容易理解和便于操作因此在本例采用了投影法進行車牌的地位。我程序中車牌定位的算法過程是這樣的:首先把圖片從下往上掃描,并設置一個閥值,當一行的像素點超過這個閥值的時候,便認定這行就是車牌的下邊界,繼續(xù)往上掃描,當一行像素點低于這個閥值,這行便是車牌的上邊界,這時調(diào)用 crop()函數(shù)將這段圖片剪切下來。再將剪切好的圖片代替原來的 DIP,從左向右掃描。同時也設定另一個閥值,還是像上面一樣, 西南交通大學本科畢業(yè)設計(論文) 第 19 頁當一列的像素點超過這個閥值的時候,便認定這行就是車牌的左邊界,繼續(xù)往上掃描,當一列像素點低于這個閥值,這行便是車牌的右邊界,最后將車牌剪切下來。最后微調(diào)一下就好了。車牌捕捉流程圖如圖 35 所示。若 i l H e i g h t * 0 . 8計算黑白跳變的次數(shù) k若 k t 1當前的 i = 車牌下邊界i + +橫向截取圖像若 j l W i d t h * 0 . 8計算黑白跳變的次數(shù) k若 k t 2若 k t 1當前的 i = 車牌下邊界計算黑白跳變的次數(shù) k當前的 j = 車牌左邊界J + 1 2 0 為車牌右邊界截取車牌結束設置閥值 t 1 = 1 2 , t 2 = 1 0i = l H e i g h t /5 , j = l W i d t h / 5K = 0 ;開始NYYYNNYNJ + + YN圖 35 車牌捕捉流程圖 字符處理 車牌反色經(jīng)過上面的步驟之后,程序應該把車牌完整的切割了下來,這時切割出來的車牌是一個已經(jīng)二值化的車牌,這時根據(jù)場景的不同,可能會出現(xiàn)兩種情況,一種是黑底白字。一種是白底黑字,而我們需要的則是白底黑字的車牌。因此在字符處理的第一步我們先要將黑底白字的車牌反色,白底黑字的車牌保留。其算法簡單說就是一行為單位掃描圖片,若前三行黑色像素大于白色,就進行反色,若白色像素多,則跳出循環(huán)。 西南交通大學本科畢業(yè)設計(論文) 第 20 頁 車牌傾斜度調(diào)整因為分割出來的車牌圖像可能存在傾斜,所以必須對它進行調(diào)整,使得字符都處于同一水平位置,那樣既有利于字符的分割也可以提高字符識別的準確率。調(diào)整的算法主要是根據(jù)車牌圖像上左右兩邊的白色像素(前景點)的平均高度來的。一般來說,眾多的字符組成的圖像它的左右兩邊的字符像素的高度應該是處于水平位置附近的,如果兩邊字符像素的平均位置有比較大的起落,那就說明圖像存在傾斜,需要進行調(diào)整。具體來說,首先要分別計算圖像左半邊和右半邊的像素的平均高度,然后求斜率,根據(jù)斜率重新組織圖像,里面包含了一個從新圖像到舊圖像的像素的映射。如果新圖像中的像素映射到舊圖像中時超出了舊圖像的范圍,則把新圖像中的該像素置為黑色點(背景點) 。傾斜度調(diào)整流程圖如圖 36 所示。 字符分割車牌圖像中會含有多個字符,識別的時候只能根據(jù)每個字符的特征來進行判斷,所以還要進行字符分割的工作。這一步工作就是把圖像中的字符獨立的分割出來。具體的算法如下:1. 先自下向上對圖像進行逐行掃描直至遇到第一個白色的像素點,記錄下來。然后再由上向下對圖像進行逐行掃描直至找到第一個白色像素點,這樣就找到圖像大致的高度范圍。2. 在這個高度范圍之內(nèi)再自左向右逐列進行掃描,遇到第一個白色像素時認為是字符分割的起始位置,然后繼續(xù)掃描,直至遇到有一列中沒有白色像素,則認為這個字符分割結束,然后繼續(xù)掃描,按照上述的方法一直掃描直至圖像的最右端。這樣就得到了每個字符比較精確的寬度范圍。3. 在已知的每個字符比較精確的寬度范圍內(nèi),按照第 1 步的方法,分別進行自上而下和自下而上的逐行掃描來獲取每個字符精確的高度范圍。字符分割流程如圖 37 所示。 西南交通大學本科畢業(yè)設計(論文) 第 21 頁設置像素指針B Y T E * p b y R s ci = 0 , k 1 = 0 , k 2 = 0T 1 = 0 , t 2 = 0若 i 圖像高度H I G HJ = 0 J = W E I T H / 2J W E I T H / 2J W E I T H獲取當前像素值獲取當前像素值若B Y T E * p b y R s c =0若B Y T E * p b y R s c =0K 1 = iK 2 = iJ + +i + +T 1 + + T 2 + +若 k 1 / t 1 = k 2 / t 2將圖像根據(jù)k 1 / k 2 的斜率向上邊界投影結束更新視圖11開始NYNNY YYNNYYN圖 36 傾斜度調(diào)整流程圖 字符歸一化緊排由于分割出來的字符大小存在較大的差異,而相對來說,統(tǒng)一尺寸的字符識別的標準性更強,準確率自然也更高,標準化圖像就是要把原來各不相同的字符統(tǒng)一到同一尺寸,本文字符歸一化后的大小為 1632。具體算法如下:先得到原來字符的高度和寬度,并與系統(tǒng)要求的高度和寬度做比較,得出要變換的系數(shù),然后根據(jù)得到的系數(shù)進行高寬度的變換,把新圖像里面的點按照插值的方法映射到原圖像中。經(jīng)過標準歸一化處理后的各個字符在圖像中的位置不定,要它進行特征提取時處理起來比較麻煩,所以要把歸一化后的字符進行緊縮重排,形成新的圖像,以方便后面特征提取的操作。 西南交通大學本科畢業(yè)設計(論文) 第 22 頁縱向掃描是否超過邊界圖像像素指針是否超過閥值 1 2設定第一個字符左邊界圖像像素指針是否小于閥值設定第一個字符右邊界掃描下一列依次類推 , 找出7 個字符結束開始NYNYNY圖 37 字符分割流程圖 字符的細化如果兩幅圖像由于它們的線條的粗細不同,就會使得兩幅圖像差別很大,但是將它們的線條進行細化以后,統(tǒng)一到相同的高度,如一個像素寬時,這時兩幅圖像的差距就不那么明顯了。利用字符的骨架的某些特征來進行數(shù)碼識別,就使得識別有了一定的適應性。一般使用細化的方法來提取骨架,細化的算法有很多,如Hilditch 算法, Rosenfeld 算法等。本文將采用一種簡單實用的方法來對字符進行細化,具體算法如下:對于圖像中的某個像素點 ,考察它的 8 個相鄰的像素點,把這 8 個像素點分1P別記為 , ,, ,如下所示:2P39 西南交通大學本科畢業(yè)設計(論文) 第 23 頁??????765814923P把這 9 個像素點按上圖排列后,假設 的像素值為 PixelValue,則當下面的 41個條件同時滿足時,可以刪除 像素點,也就可以達到圖像細化的目的。1P1. ;6)(21?NZ2. ;0?P3. 或者 ;*842 )(02?Z4. 或者 ;614P條件中, 是求與 相鄰的 8 個像素點中與其像素值相同的像素點的個數(shù),)(11是求與 相鄰的 8 個像素點中像素值交替變化的次數(shù)。如下所示,)(01PZ, 。4?N301 ??????01P那么上面四個條件的意思分別是:條件 1 是指與 相鄰的 8 個像素點中,與其像素值相同的像素點的個數(shù)應大于1P等于 2 且要小于等于 6。條件 2 是指與 相鄰的 8 個像素點中,像素值交替變化的次數(shù)應等于 1。1條件 3 是指 、 、 中至少有一個的像素值與 不同。24 1P條件 4 是指 、 、 中至少有一個的像素值與 不同。P6接下來,只需對圖像中的每一個像素逐一判斷這 4 個條件,把同時滿足這四個條件的像素點去掉,否則保留該像素點為圖像的