郭 爽
(電子科技大學 物理電子學院,四川 成都 610054)
數字儀表具有高精度、方便讀取、容易操作等優點,從而廣泛應用于工業、設備顯示和檢測等領域,已經成為國內各種儀表的發展趨勢。利用數字圖像處理技術和識別技術可以實現數顯儀表的自動識別,不僅可以提高工作效率,同時也能確保采集到的數據的準確率[1-6]。
利用計算機視覺函數庫 OpenCV,編寫 C++語言程序實現對七段數碼管式出租車計價器的自動識別。OpenCV是 Intel開源計算機視覺庫,全名為Open Source Computer Vision Library,它由一系列C函數和少量C++類構成,包括300多種用于數字圖像處理的C或C++程序,該函數庫的最大特點是實現了圖像處理和計算機視覺方面的很多通用算法,具有很好的矩陣運算和圖像處理能力,并且在 VC開發環境上可以直接調用其庫函數,極大地簡化了編程[7-8]。算法流程主要包括圖像預處理、字符分割和字符識別3個過程。
待識別的目標圖像在由攝像頭采集的過程中,會受到實際采集環境以及攝像頭與目標圖像的距離和角度等因素的影響,最終傳輸到計算機的圖像可能存在模糊和噪聲缺陷[6,9],這些缺陷會影響到字符的正確分割和識別,所以在對圖像進行字符分割和識別之前,需要對圖像進行預處理操作。預處理的主要目的是突出給定圖像中的某些信息,消弱或除去不需要的信息。從而使得圖像畫面清晰,邊緣明顯,以便提取特征進行識別[10]。預處理結果的好壞直接影響到后續圖像的分割和識別的準確率。預處理流程圖如圖1所示。

圖1 預處理流程
攝像頭采集到的圖像是含有大量顏色信息的彩色圖像,不利于后續圖像的分割和識別,而且彩色圖像的存儲空間較大,因此有必要進行灰度轉換。圖像的灰度轉換就是去除圖像中的彩色信息,只包含亮度信息[8]。程序中利用 OpenCV中的顏色空間轉換函數 cvCvtColor,可以將原始載入的彩色圖像轉換為灰度圖像。
由于圖像在采集過程中會受到噪聲的干擾,所以必須對圖像進行一次中值濾波平滑處理來減少噪聲,程序中采用了 cvSmooth函數實現中值濾波平滑,從而平滑掉了圖像采集和傳輸過程中形成的噪聲和區域模糊,保持圖像輪廓清晰。
圖像主要由物體的圖案和背景組成,采用二值化處理可以從背景中分割出物體的圖像[1]。經過二值化處理后,即把原來的由256個值表示的灰度圖轉變為只有0(全黑)和255(全白)兩個亮度值。在圖像二值化過程中,關鍵的一步是確定一個閾值,根據這個閾值可以將圖像總目標從背景中分割出來。文中使用了利用整幅圖像的信息求出圖像最優閾值的全局閾值法中的大律法(OTSU)來得到灰度圖像的變換閾值[7],調用的函數是 cvThreshold。cvThreshold是OpenCV庫中的一個函數,它的典型應用是對灰度圖像進行閾值操作得到二值圖像[8]。
為了便于字符分隔和提高字符識別的準確率,對經過二值化后的圖像進行二次中值濾波平滑處理。
二值化后的圖像會存在一些大噪聲,采用數學形態學開運算 cvMorphologyEx函數可以去除圖像中存在的噪聲點。數學形態學是圖像處理技術中的一種新方法[5]。其基本思想是利用具有一定形態的結構元素提取圖像中的對應性狀,從而達到識別圖像的目的[6,8]。
以上這些圖像預處理為后續的數字字符的分割和識別打下了良好的基礎。另外,程序中多次調用了OpenCV中其他5個庫函數:圖像載入函數、窗口定義函數、圖像顯示函數、圖像保存函數以及圖像銷毀函數。
采集到圖像是由多個字符組成的,因此要將這些字符分割開才能進行識別。在分割時需要進行歸一化,其目的是消除數碼管在攝像頭上所成像的尺寸不一而導致的模板和待識別數字在尺寸上的偏差。程序中將源圖像歸一化為 60×80。采用投影法對目標圖像中的數字字符進行分割,以精確定位出每個字符[4]。在進行切割之前,需要將圖像進行水平和垂直投影,程序中的垂直投影實現方法是先計算出每一列上黑點的數目,然后在投影圖上畫出相同數目的白點數目,水平投影與此類似。根據字符投影可以判斷出每個數字的上下和左右邊緣,然后再進行切割。
字符圖像識別的目就是利用圖像處理和識別技術對數碼管顯示的數字字符進行識別。程序中分別實現了穿線識別和模板匹配識別兩種方法。
穿線識別法主要是利用7段數碼管的特征進行識別的,如圖 2所示的穿線法示意圖,通過提取7個顯示段的特征來判斷實際顯示的字符。7段數碼管由ABCDEFG7個顯示段組成,每個段的粗細和長短基本一致且都是垂直或水平的顯示段。

圖2 穿線法示意
首先,對字符做平行于水平方向的分割線line1和line2,將字符水平均勻分割成3部分,每一部分從左到右進行掃描,如果其中的某一部分存在筆段,就將其記為“1”,否則記為“0”。這一過程用于檢測DEFG是否存在筆段;其次,對字符做垂直于水平方向的平分線line3,將字符垂直平均分割成兩部分,從上到下掃描,如果其中的某一部分存在筆段,就將其記為“1”,否則記為“0”,該過程用于檢測 ABC是否存在筆段;最后,綜合以上兩步得到的標記筆段,對照表1所示的數碼管數字譯碼表,得出符合該特征的數字[2-3]。

表1 數碼管數字譯碼
模板匹配法是比較常用的數字識別方法,待識別的字符是0到9十個數字。提供了一種簡單有效的模板匹配識別法,對分割后的每一個圖像依次進行識別,將結果輸出到控制臺并保存到指定文件中。自定義的模板匹配函數的程序算法為:一張圖片由很多點組成,每個點就是一個像素,預處理過程中將彩色圖像轉成灰度圖像,即是把圖片每個像素變成 0-255之間的某個數,經過二值化以后,每個像素點變成 0或者 255。歸一化后,每個數字的大小被歸一化到 80×60,從而共有 4 800個點。然后這4 800個點對應相減取絕對值累加起來后,差值最小的模板數字就是所要識別的結果。程序中定義兩個IplImage類型的指針數組,分別用于存儲分割后的圖像和載入模板,以及一個簡單的整形數組用于存儲模板匹配結果,其中,IplImage是OpenCV中定義的最基本的結構體,它將圖像描述為一系列屬性和指向圖像相關數據的指針集合,包含了圖像的全部信息。
根據以上所述原理和開發步驟,在 Windows 7平臺下利用VC++6.0編程實現算法,分別采用了穿線和模板匹配兩種識別方法,程序中載入如圖3所示的七段數碼管式出租車計價器作為原始圖像,圖4和圖 5分別為二值化和字符分割后的圖像。程序輸出結果顯示在控制臺上為單個數字,以數組元素的形式存儲,如a[0] = 6,a[1]=6,a[2]=“*”,a[3]=0,其中“*”號代表小數點。在編程實現過程中,發現如果在前期預處理過程中對字符進行傾斜校正,那么穿線法的識別結果準確率較高,而對于模板匹配法,由于是對分割后的單個字符進行識別,即使沒有進行傾斜校正,仍能得到準確的識別結果。

圖3 原始彩色圖像

圖4 二值化后圖像

圖5 分割后的圖像
通過利用C++編程語言和OpenCV中的庫函數實現了對七段數碼管式出租車計價器的數字字符的識別,大大簡化了程序代碼。在對出粗車計價器識別過程中發現,穿線法無法識別出正確的結果,但是模板匹配法卻能得到準確的結果,主要原因是由于預處理過程中沒有進行傾斜校正,導致前一個數字會影響到下一個數字的識別,由于模板匹配法是對逐個字符進行識別,從而識別結果沒有受到數字傾斜的影響。在后續的工作中,要進一步優化和完善字符分割和識別算法,以降低算法的時間和空間復雜度,提高識別效率。
[1] 吳留生,陳家新,黎蔚.基于 Niblack的手掌經脈圖像二值化技術研究[J].通信技術,2010,43(01):112-114.
[2] 王蓉芳,汪仁煌.基于數碼管機器視覺的小數點識別[J].電子測試,2008(11):17-20.
[3] 何洪波.數碼管的計算機識別[D].廣州:華南理工大學,2004.
[4] 劉丹,穆林麗,余曉鍔.一種七段數碼管式醫用儀表的自動識別方法[J].科學技術與工程,2010,16(16):4037-4039.
[5] 姬寶金,呂建平.基于梯度重建與形態學分水嶺算法的圖像分割[J].通信技術,2009,42(05):98-102.
[6] 田自君.數顯儀表數字字符快速識別系統的研究[D].成都:電子科技大學,2007.
[7] 趙洋.基于 OpenCV的網上閱卷技術的研究[D].山東:山東大學,2009.
[8] 詹群峰.基于OpenCV的視頻道路車輛檢測與跟蹤[D].廈門:廈門大學,2009.
[9] 王曉雪,蘇杏麗.數字圖像處理在車牌識別中的應用[J].自動化儀表,2010, 31(07):22-28.
[10] 張好,王士林,李生紅.基于內容圖像分類技術中的特征分析[J].信息安全與通信保密,2006(11):74-76.