


摘 要:本課題研究內容是基于傳統方法實現對車牌號碼的識別,運用了計算機視覺等方面的知識。總體設計方案包括圖像獲取、圖像預處理、目標區域檢測、目標區域分割、目標區域處理、字符分割以及字符識別及輸出。Python 因為它易讀、易維護的特點,近年來迅速成為被大量用戶所廣泛應用和受歡迎的編程開發語言。所以此次選擇使用 Python 來完成本次課題的實現。Open CV 應用范圍廣泛,它還可以提供 Python、Matlab 等語言接口來實現圖像處理和計算機視覺中的許多通用算法。本課題設計主要結構采用 Python+Open CV 來實現完成。
關鍵詞:車牌識別;Python;Open CV
汽車的出現改變了步行和騎自行車的時代,更加便于人們日常出行,增加了人們之間的良好溝通。汽車為我們的旅行提供了便利,也給城市的交通造成了壓力。來自城市的車輛進行有效的實時監測和管理,能提高智能運輸的效率,有效地減少了人工的操作。這不僅節省費用,而且在一定程度上還能杜絕工作人員亂收費,違規操作的問題。因為這諸多原因,社會整體對實現車牌識別技術寄予了厚望。在這項技術中,國外的科技人員要比國內提前一步開始進行研究,其主要方法便是運用圖像處理技術將其運用到實際應用之中,牌照識別技術研究沒有產生完整的系統。但基于當時的科技水平,使用簡單的圖像處理技術,以此用于實際生活中的一些具體問題,如果想要得到最終人們想要的結果,則需要工作人員的手動參與。20 世紀 90 年代以后,我國對車牌自動識別系統的研究開始了。一些高端院校與機構同樣對此類技術進行了深入的探索,研究期間,需要克服的環境干擾問題極為繁多。截止至今日,國內對于車牌自動識別系統技術的研究已經取得了較為巨大的進步,并且其中較為成熟的產品已經投入使用。本文的主題和內容是使用 Python+ Open CV 技術來提高車牌識別效率。
1研究框架
本課題研究內容是基于傳統方法實現對車牌號碼的識別,運用數字圖像處理、計算機視覺方面的知識。總體設計方案包括圖像獲取、圖像預處理、目標區域檢測、目標區域分割、目標區域處理、字符分割以及字符識別及輸出。如圖 1 所示為整體設計思路框圖。
2圖像讀取
使用 Python 對圖像進行讀取有兩種方式。
第一種是利用 Open CV 提供的 cv.imread()函數和 cv.imshow()函數,在這其中,cv.imread()函數有兩個參數,第一個參數為讀取圖像資源的路徑,若圖像資源與項目在同一目錄下則可直接輸入圖像資源的名稱加后綴名,若圖像資源與項目不在同一目錄下,則需要使用絕對路徑加圖像名稱與后綴名。第二個參數為圖像資源的讀取方式,可用阿拉伯數字 0,1,2 表示,分別表示加載黑白圖像,加載彩色圖像,加載含阿爾法通道信息圖像。cv.imshow()函數則用來顯示加載的圖像資源,此函數也有兩個參數,顯示圖像的窗體名稱及顯示的圖片變量名稱分別為其第一和第二個參數。
第二種方式是使用 cv.imdecode()函數來加載圖像資源。cv.imread()函數要求圖像資源名稱不能包含中文字符,而 cv.imdecode()函數可以選擇編碼格式,對中文命名的圖像資源也可加載顯示。
通過 Numpy 數組操作來獲取圖像的各個屬性。在本次課程設計中,需要獲得加載的圖像資源的寬度與高度,通過 Numpy 提供的 shape 方法來返回圖像資源的高度、寬度與通道數的數組。
3圖片預處理
3.1色彩空間轉換
從網絡上下載的圖像資源與手機拍攝的圖像資源,為避免因圖像資源大小格式均不一致而導致出現錯誤。所以要針對所取得的圖像資源進行相應的處理。將圖片保存為 jpg 或 png 格式,將圖像資源壓縮成 1000*750 像素,以便后續對圖像資源進行相關操作。
將 RGB 色彩圖像使用 cv.cvtColor()函數對其進行處理為 HSV 色彩飽和度圖像,其中,調整 HSV 各通道的顏色對應的最大值與最小值來實現HSV 色彩飽和度圖像對圖像資源的色彩檢測。HSV 各通道的顏色對應的最大值與最小值,如圖 3 所示。
我們通過輸入藍色對應的各個通道的最大值與最小值,利用 cv.imRange()函數實現對圖像的色彩檢測。Cv.imrange()函數最重要的三個參數分別為要處理的圖像和最大值與最小值,可以使用變量和 array 數組來保存相應的值。
3.2邊緣檢測與二值化處理
因為無法避免車輛的背景中不存在藍色的區域,只使用顏色檢測不能達到最好的效果。
面對這種情況,需要對顏色檢測后的圖像進行邊緣檢測,描繪出各個部分的邊緣情況,隨后根據現實情況的具體要求對處理后的圖像進行二值化操作與形態學操作。首先要對圖像資源進行高斯濾波去噪,然后通過多次形態學開閉操作與腐蝕膨脹填充等操作找出車牌輪廓。
3.3外輪廓繪制與字符切割
通過上面的操作,已經找到了車牌的輪廓,但車牌的輪廓并不規則,無法對其進行操作。所以我們將已經找到的車牌的輪廓外圍繪制了一個規則的矩形,這個規則的矩形與車牌最外側輪廓相切,這樣就對車牌成功進行了粗定位。然后將繪制的矩形切割下來。
在對字符進行切割之前,還需要做一些準備工作。首先針對不同的圖像切割出來的外輪廓尺寸也均不相同。先將切割下來的車牌圖像統一尺寸為車牌標準尺寸 450*15 然后對車牌部分同樣進行二值化處理與形態學操作,然后通過遍歷圖像像素值的方法獲取字符界限。從上向下遍歷每一列像素,如若像素值從 0 變成 255,此時表示顏色從黑色變為白色,則判斷為字符上界,反之,如若像素值從 255 變為 0,此時表示顏色從白色變為黑色,則判斷為字符下界。然后使用同樣的方法,找出字符的左右界限,然后將每個字符分割出來。
4字符識別
4.1 安裝Tesseract-OCR
Tesseract-OCR 是一個免費的圖片識別文字的軟件,可以通過具體網站下載并進行安裝,隨后通過該軟件進行下一步的相關實驗。
4.2 字符識別
在 Python 中通過 text = pytesseract.image_to_string(cropImg, lang="chi", config="-psm 10")調用 tesseract。其中 cropimg 是原圖片,lang 是我們之后自定義的語言,config 后面一定要跟 10 因為此參數表示對單個字符進行識別,默認是對一行字符識別。
我們需要將所獲得的字符轉換為 tif 格式才能使用 Tesseract-OCR 進行字符識別,具體的實現方法為:
if type(imgfile) == str and imgfile.endswith(('.bmp', 'gif', 'png', 'jpg')): with Image.open(imgfile)as im:
im.convert('RGB').save(imgfile[:-3] + 'tif')
利用 jTessBoxEditor 對多個字符圖片識別,將識別錯誤的圖片改正。最后得到需要的文件放入文件夾即可。最后得到如圖 10 所示結果。
5 總結
本實驗是利用 Python 語言實現車牌識別技術。實驗的工作流程為獲取圖像、預處理圖像、檢測目標區域、目標區域分割、目標區域處理、字符分割、字符識別等。在這一具體過程中,為實現目標結果的正常生成,應當合理運用了 PyCharm 軟件,才能夠較為準確地識別車牌, 達到了題目要求和預期目的。因為 Python 語言的簡潔性和通用性,使其開發較為簡單,而且很多嵌入式,如樹莓派等也都兼容,使其可以方便的進行代碼移植,運用實際的場景中。隨著軟件算法的深入研究和硬件設備的升級換代,車牌識別技術也將越來越成熟化和智能化。
參考文獻
[1] Joe Minichino Joseph Howse 著. OpenCV3 計算機視覺 Python 語言實現[M]. 北京:機械工業出版社,2001.5
[2] 毛星云著. OpenCV3 編程入門[M]. 北京:電子工業出版社 2015.7
[3] 岡薩雷斯(美),伍茲(美)著 數字圖像處理[M] 北京:電子工業出版社 2011.6
[4] 斯蒂格(德)著 機器視覺算法與應用[M] 北京:清華大學出版社 2008.12
[5] 布拉德斯基(美)著 學習 OpenCV[M] 北京:清華大學出版社 2009.10
[6] 圖像處理與分析[M]. 科學出版社 , 崔屹編著, 2000
[7] 李曉莎,林森.基于 Python+OpenCV 的車牌識別技術的研究[J].數字技術與應用,2019,37(06):95-97
作者簡介:霍立志(1996),男,安徽淮北人,淮北師范大學信息學院2016級本科在讀,研究方向:通信工程