MATLAB實現的車牌定位系統


MATLAB實現的車牌定位系統

看完《數字圖像處理后》,做的圖像識別的入門級項目,代碼在: https://github.com/zhoulukuan/Plate-Location ,論文都可以在知網里找到,我就不貼了。具體項目的一些簡介可以看github,大致上講,可以分為顏色檢測、區域操作、車牌檢測算法和夜晚下的Retinex算法四個環節。

顏色檢測

選用顏色檢測的好處是在於定位比較精准。選中圖片中特定的顏色區域,然后每個區域單獨拿出來檢測,可以提高檢測速度。相對於對圖片灰度化,然后進行算法增強與補償的思路來說,顏色檢測對圖片信息的利用更加充分。缺點也很明顯,就是對於某些強光或者異物(如污泥)引發的車牌顏色變化沒有很好的檢測能力。

顏色檢測部分我較多地參考了:

陳昌濤.基於彩色和黑白紋理分析的車牌定位方法[D].重慶:重慶大學,2008

主要思路是在HSV模式下計算顏色與標准顏色相似度。從colorDetection.m文件中,可以看到,針對區域和非區域、白天和夜晚、各種顏色的參數都是不同。這里區域和非區域的差別可能比較難理解。具體來說,就是區域顏色檢測是為了框出特定顏色區域,尋找車牌可能的所在區域的;而非區域則是為了檢測特定的顏色邊緣,為尋找某種顏色的邊緣點做投影准備的。因此非區域閾值可以設置得窄一點,區域閾值可以設置大一點。

其實最主要的,設定區域和非區域參數的原因是區域的話需要進行一系列的形態學操作。我的步驟是:去除小區域——膨脹——進一步去除小區域。第一個去除小區域是排除大量干擾點,這里的面積閾值可以設置得比較小。隨后的膨脹操作,是為了將車牌在顏色檢測中得到的可能有斷裂情況的車牌不同區域連成一體。最后,再次去除小區域的面積閾值可以設置大一些,是為了進一步過濾區域,減小工作量。不一步到位的原因是,若先去除區域,則可能將車牌斷裂的小區域去除,區域不完整;若先膨脹,則可能引入大量不同區域連在一起造成的干擾。

區域操作

區域操作主要是我發現直接進行車牌檢測干擾比較多,所以設置了很多檢驗條件(雖然好像也沒什么卵用)。區域提取主要是依靠regionprops函數實現的。

一開始實際上我打算使用一個區域歸並算法,順便替代掉上面說的膨脹操作,因為膨脹可能會把車牌和周邊區域連起來,引入干擾,這個算法在這里有提到:

陳寅鵬,丁曉青.復雜車輛圖像中的車牌定位與字符分割方法[J].紅外與激光工程

不過實際使用效果很差,大概因為我的樣本庫比較雜和刁鑽,有很多傾斜度過高的圖片,所以垂直重合率很低。我還是在代碼里寫了這個算法,真實的效果不得而知。
另外就是根據區域里藍色點的比例之類的,區域大小之類的做做基本的排除工作了。

車牌檢測

投影點選擇

很多論文提到的思路都是差分絕對值投影,我個人感覺是不太靠譜的,因為對信息的利用率還是太低了。相比較而言,第一篇論文提到的提取白色區域和藍色區域,計算邊緣點然后做與,得到藍白邊緣點,然后計算藍白交界點做投影就會更好一些。

邊緣提取的話我用的是colorLP方法和OTSU閾值化方法,使用縱向sobel算子應該也可以,感覺差距不是很大。不過我只求了藍色邊緣點然后做投影,原因還是樣本庫太雜的問題。給我的樣本庫很多網上搜集的小圖片,可能車牌大小還不到40*20這樣子,打開一看都是像素點,白色的文字基本和藍色背景混成一堆,顏色混疊了……

實際看了下,藍色邊緣和藍白邊緣區別不是很大的,不過真的圖片尺寸理想的話,最好的還是用藍白邊緣交界。順帶一說,我感覺用白色邊緣點膨脹然后與藍色邊緣點相與比較好,原論文的算法,檢測出的點真的太少,可能這樣會更准確一些?不過我感覺車牌紋理特征體現的不明顯就是了……

計算具體區域

個人覺得這部分應該是整個項目最復雜的部分。簡單說下思路:

水平方向,檢測連續多波峰特征,指的是車牌紋理藍色邊緣點投影會連續出現多個高峰:
1、獲取函數所有極大值,極大值最小間隙為圖片寬/20,用極大值序列中第三高的峰值的0.6作為閾值。之所以選擇第三高的峰值來獲取閾值是因為在運行時發現區域兩邊會有幾率出現0~2個干擾,如果干擾是峰值極大的情況,很可能會影響判斷。而極大值最小間隙的存在是為了防止相近的峰被誤檢測。假設車牌最小寬度占總區域的1/3,則七個字符,每個字符高峰的距離為1/20。
2、獲取大於閾值的所有峰值及其位置。依次檢索每個峰,判斷某個峰的位置和它前一個峰是否接近,若接近則認定檢索峰和前面的峰屬於同一個可能的“連續多波峰區域”;否則則認為檢索峰屬於新的“連續多波峰區域”。
比如我們檢索到大於閾值的有8個峰,前7個峰都很接近,第8個峰離第7個較遠,最后的區域划分是[1 7]和[8 8],代表1-7峰屬於一個“連續多波峰區域”,而8峰則是一個單獨的“連續多波峰區域”。
距離是否足夠接近是由需要判斷的峰和前面最后一個峰的距離與平均距離的比值判斷的。
3、將包含最多峰數的區域視為車牌可能存在區域。若該區域所含峰數過少或寬度過短,則直接判斷不含車牌;否則,從該區域的第一個峰向左檢索,若某點接近零且該點的左面不含有大於閾值的峰,則該點視為車牌開始坐標;從該區域的最后一個峰向右檢索,遇到的第一個接近零的點視為車牌結束坐標。接近零代表該點值小於峰值閾值的5%。
之所以開始坐標還要有左面不含有大於閾值的峰值要求,是因為在調試時發現,若左邊的開始坐標僅以接近零為條件,程序會將車牌“XX·XXXXX”中的點作為開始位置。不過考慮中間的點確實有時候太小,會把車牌隔斷,我后來把最大區域所含峰過少就判斷不含車牌改成了,最大區域所含峰或者最大和次大區域所含峰之和過小,一定程度上也減小了這個問題。

垂直方向:
1、獲取函數的最大值及其位置,設置最大值5%為閾值。
2、從最大值位置向左檢索,若某點接近零且該點的左面不含有大於閾值的峰,則該點視為開始點;從最大值位置向右檢索,若某點接近零且該點的右面不含有大於閾值的峰,則該點視為結束點。
波峰要求同樣是為了防止檢索到的車牌不完整而設置的。
3、若垂直方向的寬度比例過短,則直接判斷不含車牌;否則,結合水平方向的寬度進行車牌判斷。

含有車牌條件:
寬度大於40,高度大於20,長寬比在0.7~6之間。這個閾值和各種論文比起來很大了,主要原因當然還是樣本庫……寫到這里真是滿滿的怨念。

夜晚下的Retinex算法

最后就是考慮到夜晚下車牌太暗所希望做的補償算法,這個具體參考: https://github.com/Vespa314/Retinex ,將的很清楚,代碼也寫的很棒,我的代碼也是用了這里的。不過不知道為什么,好像這個代碼使用后得到的圖像再轉成HSV模式時,部分圖像會提示函數錯誤,而且還是工具箱的函數使用錯誤,讓我有點摸不着頭腦,也是我目前沒有找出來的一個bug。

關於白天和夜晚的銜接,我的也比較粗暴。直接先檢測白天的條件,沒有的話再檢測夜晚……主要是關於白天和夜晚不是很好判斷。我最早使用的是灰度化圖片的平均值,標准差平均值,OTSU閾值和灰度平均值比值來判斷的,效果其實還是不錯的。更加復雜精准的方法,我看過用模式的聚類來做的,也屬於我知識的空白區吧,以后有機會再做改進。最后使用的這個方法也是勉勉強強能用,夜晚識別率也只有一半左右,沒辦法識別強光。

總結

想想,自己做的還是比較慘淡的。很多更加有效精准的方法不能用,礙於樣本庫的多樣復雜,檢測率一直沒辦法提高。有時候還確實有卡着的感覺,好像忙活了半天也就改改參數,沒什么實質化的進步。感覺自己還是對特征挖掘不夠充分,掌握方法不多,也很不足,說到底還是個剛入門的。希望自己以后繼續深入學習能找到改進的方法吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM