基于Opencv和Tesseract的行驶证识别系统设计
張偉超, 肖中俊, 嚴志國. 基于Opencv和Tesseract的行駛證識別系統設計[J]. 齊魯工業大學學報, 2020, 34(1): 47-52. DOI:?10.16442/j.cnki.qlgydxxb.2020.01.009?
ZHANG W C, XIAO Z J, YAN Z G. Design of Vehicle License Identification System Based on OpenCV and Tesseract[J]. Journal of Qilu University of Technology, 2020, 34(1): 47-52. DOI:?10.16442/j.cnki.qlgydxxb.2020.01.009?
| 基于Opencv和Tesseract的行駛證識別系統設計 | [PDF全文] |
張偉超, 肖中俊, 嚴志國 ????
原來網址:http://www.xml-data.cn/QLGYDXXB/html/354e8da7-9db3-4a70-bc1e-c13cf5b59728.htm
摘要:為了解決行駛證識別困難、識別率低的問題,設計了一套基于OpenCV和Tesseract的行駛證檢測和識別系統。首先,利用OpenCV中的高光抑制、圖像增強和分塊最大類間差法對行駛證進行圖像預處理;然后,對圖像采用透視變換并將行駛證內芯裁剪下來,經過局部高斯閾值分割,得到清晰的文字;最后,采用Tesseract訓練樣本并結合單字識別模式,降低了噪點和中英文混合的干擾。測試結果表明,該方法結合優化策略的長短時記憶網絡(LSTM)的識別正確率能達到94.1%。
關鍵詞:行駛證????光學字符識別????開源計算機視覺庫????長短時記憶網絡????
Design of Vehicle License Identification System Based on OpenCV and Tesseract
ZHANG Wei-chao, XIAO Zhong-jun, YAN Zhi-guo ????
Abstract: In order to solve the problem of difficulty and low recognition rate of vehicle license, a set of detection and recognition system based on OpenCV and Tesseract was designed.Firstly, OpenCV is used to preprocess the driving license image, especially the high-light suppression, image enhancement and block OTSU algorithm.Then, the image is transformed by perspective and cut off the inner core of driving license.After local Gaussian threshold segmentation, clear text is obtained.Finally, Tesseract is adopted for training and character recognition.In order to reduce noise and interference caused by Chinese-English mixture, the system adopts single-word recognition mode.The test results show that the recognition accuracy of LSTM can reach 94.1%.
Key words:?driving license????optical character recognition????opencv????long short term memory????
行駛證作為一種常用證件, 在車險理賠、二手車交易、違章處理、汽修保養等行業頻繁使用, 但是行駛證不像銀行卡一樣可以刷卡識別, 常規采集行駛證信息的方式是手動登記, 這種方式存在低效率和易出錯的問題[1]。隨著光學字符識別技術(optical character recognition, OCR)[2]的迅速發展, 行駛證OCR逐漸進入市場, 幫助人們完成一些繁雜的證件錄入工作。對百度、騰訊、阿里巴巴等開放平臺的API進行測試, 準確率在95%左右。
由于行駛證特殊的防偽技術和套打樣式, 行駛證的OCR識別存在以下難題:1)打印顏色有深淺, 有時候過深, 有時候過淺;2)信息錯位, 內容信息和表格粘連;3)行駛證外套塑料薄膜反光;4)防偽底紋干擾。以上平臺的OCR-API對不同程度的反光、傾斜等情況下, 準確率下降到80%左右。
該設計最終采用OpenCV[3]、Tesseract[4]、Python[5]進行算法設計, 通過改進圖像處理算法, 改善了反光和傾斜的問題。
1 行駛證圖像預處理1.1 轉灰度圖
灰度圖(grey scale image)又稱灰階圖, 是一幅只含亮度信息, 不含色彩信息的圖像, 與原彩色圖像比較, 它只有一個通道, 圖像中每個像素其實就是亮度值(Intensity), 這樣圖像處理計算量也相應大幅減少[6]。要表示灰度圖, 就需要把亮度值進行量化, 簡單來說, 就是把彩色圖像3個通道的分量按照一定的比例計算到灰度圖像中, 通常將灰度值劃分到0至255范圍內, 其中0代表最暗, 255代表最亮。從RGB到灰度圖轉換公式為:
| Gray=0.299R+0.587G+0.114BGray=0.299R+0.587G+0.114B | (1) |
1.2 高斯濾波
行駛證的防偽底紋對于提取內芯區域影響較大, 為了排除防偽底紋的干擾, 本文對灰度圖采取高斯平滑濾波處理, 使得內芯的底紋背景融為一體, 便于進行閾值分割。我們把概率密度函數服從正態分布的噪聲稱為高斯噪聲, 底紋大致符合正態分布, 因此可以當作高斯噪聲進行處理。高斯濾波是一種用來消除高斯噪聲的線性平滑濾波器, 所以可以使用它來模糊內芯的防偽底紋[6], 因為高斯濾波器具有濾除高頻的特性, 因此也可以理解為一個低通濾波器。
高斯濾波是用一個掩模逐行逐列地掃描圖像, 掩模其實就是權重矩陣, 離掩模中心越近的像素權重越高, 其運算實質是把掩模中心像素點的灰度值設置為掩模覆蓋的區域內像素的加權平均灰度值。因此高斯濾波的平滑效果比均值濾波更加柔和, 而且邊緣保留效果更好。
1.3 局部高光抑制
行駛證外面的薄膜極易反光, 在陽光、燈光下會形成局部鏡面反射, 呈現在圖像上的是高亮光斑, 一般出現在內芯邊緣, 面積不大, 但是影響邊緣檢測, 所以可以先通過OpenCV的局部亮度改變算法(Illumination Change)削弱局部鏡面反射對邊緣的影響[7]。參數分別是源圖(source)、掩碼(mask)、結果圖(result)、系數(α, β), 乘數范圍在0~2之間, 0比較清晰, 2比較模糊。
1.4 圖像增強
由于部分圖像背景和主體對比較弱, 難以設置合適的灰度閾值, 所以對灰度圖像采取圖像增強處理, 使內芯明顯地區別于背景, 達到增強對比度的效果。
本文采用是單尺度SSR(Single Scale Retinex)圖像增強算法, Retinex是一種圖像增強理論的統稱, 它是retina(視網膜)和cortex(皮層)兩個單詞的組合[8]。記一幅給定的圖像為S(x,?y), 單尺度SSR算法將該幅圖像分解為反射圖像R(x,?y)和亮度圖像L(x,?y)兩個圖像, 由此可以得到單尺度SSR的公式為:
| S(x,y)=R(x,y)?L(x,y)S(x,y)=R(x,y)?L(x,y) | (2) |
定義一個高斯函數G(x,?y),?C為高斯環繞尺度,?λ是一個尺度且滿足以下條件。
| G(x,y)=λ??(x2+y2)2,?G(x,y)dxdy=1G(x,y)=λ??(x2+y2)2,?G(x,y)dxdy=1 | (3) |
得到增強后的圖像,?R(x,?y)是輸出圖像, *代表卷積符號:
| R(x,y)=logS(x,y)?log[F(x,y)?S(x,y)]R(x,y)=log?S(x,y)?log?[F(x,y)?S(x,y)] | (4) |
本文的SSR算法通過OpenCV for Python實現, 圖像增強對比效果圖如圖 1所示, 單尺度SSR算法能在保持原始圖像平均亮度的同時較好地增強灰度圖對比度, 使得行駛證內芯背景與邊緣黑白分明, 便于進一步閾值分割。
| 圖 1?圖像增強對比圖 |
2 提取證件內芯區域2.1 OTSU閾值分割
行駛證經過以上圖像預處理之后, 內芯和背景的對比度明顯, 分界線清晰, 但是受不均勻光照影響, 直接采取閾值分割, 無法適用于多樣的拍攝環境, 本文采取分塊最大類間差法(OTSU)算法, OTSU閾值分割算法是根據灰度圖像的全局特性, 找到一個合適的閾值將圖像劃分為背景和前景, 也就是求取直方圖中兩個峰值之間的最小值[9]。類間方差越大代表圖像的背景和前景的差別越大。本設計將灰度圖像分成9塊, 逐個采用OTSU算法進行閾值分割, 經過二值化的圖像如圖 2所示。
| 圖 2?采用分塊OTSU算法的二值化對比圖 |
?
然后采取無級別尋找輪廓, 并選取最大輪廓。在opencv里對應的函數為:findContours, 通過for循環對每個輪廓的面積(contourArea)比較, 找到最大輪廓。
2.2 直線擬合
通過drawcontours對輪廓內外所有區域均填充0(全黑), 并繪制寬6 pixl的白色輪廓線。通過arcLength和approxPolyDP找到四個輪廓擬合點, 將輪廓斷開, 篩選出最長的四條輪廓線, 把白色的輪廓線看成一組點, 對每條實線分別直線擬合(fitLine), 擬合出四條直線。在OpenCV中采用的直線擬合是HUBER算法。公式(5)中, 記點到直線的距離函數ρ(r), 一個點(x,?y)到直線的距離為r, 其中C=1.345。
| ρ(r)={r22C(r?r2)ifr<C,oterwise.ρ(r)={r22ifr<C,C(r?r2)oterwise. | (5) |
| 圖 3?直線擬合 |
?
直線擬合效果如圖 3所示。在獲取四條擬合直線后, 利用getCrossPoint獲取四條直線的交點(a, b, c, d)并排序, 行駛證內芯比例寬高比為8.8:6, 本文將內芯尺寸設置為1 760*1 200 pix。
2.3 透視矯正
OpenCV提供了兩種圖片變換的方式:仿射變換和透視變換, 兩者的區別很容易區分, 前者是將矩形的圖片變成平行四邊形, 而后者是將圖片變成梯形。這兩種變換雖然都有各自的應用場景, 但在實際的圖片變換中由于透視效應的存在, 后者的使用更加普遍[10]。
采用手機拍攝行駛證照片的時候, 受相機角度和高度的影響往往會拍出梯形的照片, 如圖 4左圖所示, 這樣的照片不僅不夠美觀而且給文字識別帶來較大難度, 將梯形的圖片轉換成標準的矩形就要對圖片進行透視變換。透視變換實質上就是通過矩陣運算將圖像投影到一個新的平面上, 通用的變換公式為:
| [x′,y′,z′]=[u,v,w][T1T3T2a33][x′,y′,z′]=[u,v,w][T1T2T3a33] | (6) |
| T=[T1T3T2a33]=???a11a21a31a12a22a32a13a23a33???T=[T1T2T3a33]=[a11a12a13a21a22a23a31a32a33] | (7) |
T1、T2、T3分別對應線性變換、透視變換、圖像平移。透視變換的數學表達式為:
| x=x′w′=a11u+a21v+a31a13u+a23v+a33x=x′w′=a11u+a21v+a31a13u+a23v+a33 | (8) |
| y=y′w′=a12u+a22v+a32a13u+a23v+a33y=y′w′=a12u+a22v+a32a13u+a23v+a33 | (9) |
由2.2直線擬合求得的(a, b, c, d)和(a′, b′, c′, d′)四對像素點坐標, 即可求得透視變換矩陣。透視變換效果圖如圖 4所示。
| 圖 4?透視變換 |
3 字符裁剪與分割3.1 二值化
在數字圖像處理中, 圖像的二值化(Image Binarization)主要是為了凸顯感興趣區域的輪廓, 方便進一步便于檢測輪廓。灰度圖的0代表全黑, 255代表最亮, 二值化就是要將圖像像素點的灰度值比閾值小的置為0, 比閾值大的置為255, 使得灰度圖呈現出黑白分明效果。有時為了選擇暗處會設置反向(INV)。二值化包括全局二值化和局部二值化兩大類。
全局二值化方法(Global Binariztion Method)只設置一個閾值劃分整張圖的前景和背景, 是否將像素點判定為前景點取決于該點的灰度值是否大于給定的閾值。平均灰度法、固定閾值法、OSTU方法和直方圖法是常用的全局二值化方法。
局部二值化方法(Local Adaptive Binarization Method)又稱為自適應二值化, 是通過分析像素點的鄰域來計算該點的閾值[11]。如果灰度級高于閾值則將點視為背景點處理, 否則作為前景點處理。常見的局部二值化有自適應中值閾值分割、自適應高斯閾值分割。
采取局域自適應高斯閾值分割, 可以排除底紋的干擾, 如圖 5所示, 自適應高斯閾值分割的效果明顯好于自適應中值閾值分割和全局閾值分割。
| 圖 5?局部閾值分割效果圖 |
3.2 字條裁剪
行駛證打印的信息共有十條, 它們在行駛證上的范圍是一定的, 所以可以根據相對原點的位置坐標定位文本行, 本設計中采用數組記錄字條坐標, 通過for循環將文本行逐一裁剪成字條并保存到一個文件夾中, 按順序命名, 便于查找。在Python中裁剪圖片只需要知道字條相對于原點的左上角坐標(x0, y0)和右下角坐標(x1, y1), 最終裁剪效果圖如圖 6所示, 在這里為了節省空間, 特意將字條組合在了一起。
| 圖 6?裁剪效果圖 |
3.3 字符分割
由于行駛證印刷質量不統一, 顏色過淺會導致閾值分割的時候產生底紋噪點, 位置偏移會造成文字和虛線粘連, 這兩個問題對文字識別的準確度影響較大, 處理起來也比較困難。
經驗發現, 虛線點在文字下方, 并且比字符小, 所以可以判斷面積大小篩選掉, 盡可能地將孤立的虛線點清除, 同時也可以清除掉底紋噪點, 這樣可以排除虛線粘連的干擾。但是還是會有一小部分粘連, 所以后續采用單個文符識別的模式進行識別。
| 圖 7?漢字、英文、數字的分割效果圖 |
?
字符分割前先進行8*8的閉運算, 以避免左右結構的漢字被分割成兩個字符。先采取豎向垂直投影分割[12], 然后再對單個字符采取橫向垂直投影分割, 在分割前都需要進行一次閉運算, 主要是為了避免單個字符被誤判為兩個字符, 分割效果圖如圖 7所示。
4 文字識別4.1 Tesseract和LSTM介紹
本文使用的Tesseract4.0是一款文字識別引擎, 它的核心是長短時記憶網絡(LSTM)[13]。LSTM是一種改進的循環神經網絡(RNN), 它在實踐中不需要付出很大代價就可以記住長期的信息, 完美解決了普通RNN在實際應用中很難處理長距離文本的缺陷, 這也是它本身具有的能力。LSTM示意圖如圖 8所示, LSTM設計思路簡單, 但結構復雜, 基礎LSTM網絡一般包含三個門(輸入門、遺忘門、輸出門)和一個神經元細胞。LSTM示意圖如圖 8所示, t時刻, LSTM有三個輸入:當前時刻輸入值xt、上一時刻輸出值ht-1和上一時刻的細胞狀態ct-1;LSTM有兩個輸出:當前時刻輸出值ht和當前時刻的細胞狀態ct。
| 圖 8?LSTM示意圖 |
4.2 訓練字符識別庫
行駛證上的字體和一般字體不同, 數字和英文是專用防偽字體, 漢字是宋體, 但是由于各個地方印刷質量不同, 有深有淺, 有粗有細, 經過二值化處理后的字體和常規字體差別較大, 表現為輪廓粗糙、斷點、粘連等, 所以只有選擇單獨訓練庫。通過程序批量二值化1萬張圖片, 并將裁剪的字條保存作為訓練樣本, 最終將樣本訓練成兩個庫, 一個是漢字庫, 一個是英文數字庫。
在實驗中, 采用jtessboxeditor訓練文字庫。如圖 9所示, 訓練過程相對簡單, 但工作量大, 耗時兩個多星期, 主要是對box文件進行逐一矯正。最終將幾個文件合并為trainddata文件, 也就是訓練的庫。將trainddata文件放置到tessdata文件夾, 就可以正常引用此文字識別庫了。
| 圖 9?訓練和矯正過程示意圖 |
4.3 識別過程與效果
Tesseract對于中文字符的識別不太友好, 經常將1個漢字識別為兩個漢字, 造成識別信息錯亂, 本文將頭文件(tovars.h)里的文字間距變量(textord_dotmatrix_gap)設置為合適的數值。中文字符和漢字和英文的區別是漢字為趨近方形, 英文和數字為瘦長型, 因此可以根據輪廓的長寬判斷是哪一類, 對于漢字采用漢字庫進行識別, 英文和數字采用數字和英文識別庫判斷, 增加識別成功率。
從表 1識別率對比看出, Tesseract自帶庫識別率極低。經過訓練后的庫與百度API開放平臺的API進行對比測試, 訓練庫和算法結合的識別效果在邊緣反光和傾斜方面比百度API略高, 但是對于打印偏移和字體過淺問題識別效果較差。正常情況下識別率達到94.1%。圖 2的最終識別結果保存到文本文件中, 結果如圖 10所示。
| 表 1?識別率對比 |
| ? |
?
| 圖 10?最終識別效果圖 |
5 結論
本文設計了一種行駛證識別系統, 主要包括四部分:圖像預處理, 圖像矯正, 字符切割, 字符識別。經過測試, 本文采取的文字定位和識別方法效果良好, 能適用于普通手機拍攝的照片, 平均識別率達到94.1%。但是對于一些惡劣情況, 例如:打印顏色淺、文字偏移嚴重、邊緣不全等, 無法精確識別, 后續將針對這些問題對系統加以改進。
參考文獻
| [1] | 李亮.基于Tesseract_OCR的駕駛證識別系統設計與實現[D].成都: 電子科技大學, 2018.?http://kns.cnki.net/KCMS/detail/detail.aspx?dbcode=CMFD&filename=1018708658.nh |
| [2] | IMAD Q H, ZEYAD Q A. Enhanced ensemble technique for optical character recognition[M]. Switzerland: Springer International Publishing, 2018: 23-30. |
| [3] | AMIN A T. Computer vision with opencv3 and qt5[M]. Iran: Packt Publishing, 2018: 89-99. |
| [4] | FLORIAN R, THOMAS S. Time-drifts in event streams using series of evolving rolling averages of completion times[J].?Information Systems, 2018, 15(3): 130-135. |
| [5] | 韓曉冬, 王浩森, 王碩, 等. Python在圖像處理中的應用[J].?北京測繪, 2018, 32(03): 312-317. |
| [6] | RAFAEL C, GONZALE Z. Digital image processing[M]. Beijing: Publishing House of Electronics Industry, 2008: 110-117. |
| [7] | 鄭紅波, 石豪. 光照不均勻的結構光圖像的條紋快速提取方法[J].?計算機科學, 2019, 46(05): 272-278. |
| [8] | 張詩.基于Retinex理論的圖像與視頻增強算法研究[D].南京: 南京郵電大學, 2018. |
| [9] | 趙世峰, 何皙健. 基于OpenCV的復雜環境下圖像二值化方法[J].?電子測量技術, 2018, 41(06): 55-59. |
| [10] | MIKKO H, LASSE M, STEPHEN K. Multi-sided market places and the transformation of retail:A service systems perspective[J]. Journal of Retailing and Consumer Services, 2019, 49(1): 380-388. |
| [11] | BILAL B, SITI N. An adaptive local binarization method for document images based on a novel thresholding method and dynamic windows[J].?Pattern Recognition Letters, 2011, 32(14): 1803-1805. |
| [12] | 冉令峰. 基于垂直投影的車牌字符分割方法[J]. 通信技術, 2012, 45(04): 89-91.?DOI:10.3969/j.issn.1002-0802.2012.04.029 |
| [13] | YU L Z, REN J H. Long short-term memory networks for CSI300 volatility prediction with baidu search volume[J].?Concurrency and Computation:Practice andExperience, 2019, 31(10): 1-7. |
總結
以上是生活随笔為你收集整理的基于Opencv和Tesseract的行驶证识别系统设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最新emoji表情代码大全_抖音不用考虑
- 下一篇: 数字图像处理冈萨雷斯版学习(二)