李 慧,歐陽鑫玉,張 鋒
(遼寧科技大學 電子與信息工程學院,遼寧 鞍山 114051)
隨著社會經濟的快速發展,條形碼技術已成為一種常用的數據采集和自動識別技術[1-3],由于它具備輸入速度快、準確率高、投入成本低、簡單實用、自由度大、采用設備相對簡單、容易制作等特點,因此能夠普遍應用在商品流通、工業生產、交通運輸、智慧物流、醫療衛生等領域。
對于條碼的識別,通常是基于光電技術進行識別,一般的光電識讀設備通過線性掃描的方式讀取到條碼信息后,再利用硬件進行條形碼的識讀。由于條碼可能存在印刷不清或者由于臟污形成噪聲等情況,會導致識別率降低;此外,識讀設備成本過高,采用人工手持條形碼識別裝置工作效率低,難以適應現代智能化、自動化的應用場景功能需求。隨著數字圖像處理技術的發展,采用圖像處理技術和相關的智能算法對條形碼進行識別已成為新的趨勢,它可以有效解決利用硬件識別帶來的技術和成本問題。
本文正是在此背景之下,根據實際應用需求,利用圖像處理相關技術,對EAN-13一維條形碼的識別進行了研究,并利用MATLAB軟件設計出識別系統,克服了基于光電技術的條碼識別帶來的局限性。
EAN-13條形碼是歐洲物品編碼的一種終端產品條形碼協議和標準,它的左側是空白區,然后依次是起始符、左側數據符、中間分隔符,接著是右側數據符、校驗符、終止符以及右側空白區和供人識別的字符(如圖1所示),應用比較廣泛。
EAN-13條形碼是一種(7,2)碼[4-5],包含了13位數據字符,其中第1~3位字符代表國家代碼,第4~7位字符代表廠商代碼,第8~12位字符代表產品代碼,第13位字符是校驗碼;每個字符由兩個條和兩個空交替組成,每一條或空由1~4個模塊組成,每一數字總寬度為7個模塊,分別用“0”和“1”表示條形碼的空和條的模塊。

圖1 EAN-13碼的結構
EAN-13條形碼字符集包括0~9共10個數字字符,條碼的二進制表示形式由A、B和C三個子集(見表1)確定。條形碼中的前置碼不用字符表示;右側的數據符和最后的校驗符全部用C子集來表示。前置碼的數值決定左側數據符是選用A子集還是選用B子集來表示,表2列出了左側數據符的字符集選擇規則。

表1 條形碼字符集

表2 左側數據符的字符集選擇規則
校驗符是用來檢驗前面的字符數字是否正確,計算公式如下:
=a2×102+a1×10+a0
(1)
(2)
其中,Ti(i=1,2,…,12)表示條形碼的第1~12位數字值,L為校驗符的值。
以EAN-13條形碼9787512426399為例,其前置碼為9,根據表2可知,其左側數據符的字符集為ABBABA。根據校驗碼的計算方法,可知K=131,a0=9,因此校驗碼是9。又根據表1可知,該條形碼后12位數的二進制碼分別為:0111011、0001001、0010001、0110001、0110011、0010011、1011100、1101100、1010000、1000010、1110100、1110100。
條碼圖像識別處理流程如圖2所示。

圖2 條形碼圖像識別流程
條形碼圖像采集后,需要對圖像進行預處理,即進行圖像灰度化、傾角矯正、目標分割、濾波等操作,然后針對分割的條碼圖像,根據譯碼規則進行譯碼識別。
(1)條形碼圖像的灰度化
通過各種攝像設備采集到的條形碼圖像,大多是彩色圖像,采用的是RGB顏色模式,即用紅、綠、藍三種原色來表示,各個顏色分量的取值范圍都是0~255,因此,對于一個RGB圖像,在計算機中需要用一個三維矩陣來表示,但實際上RGB并不能反映圖像的形態特征,只是從光學的原理上進行了顏色的調配。在進行圖像處理時,通常為了減少所要處理的運算量,一般采用將RGB圖像進行灰度化的方法。圖像灰度化處理方法通常有分量法、最大值法、平均值法和加權平均法等。本文采用了平均值法進行灰度化,即將分量R、G、B的值求平均得到一個灰度值,處理效果如圖3所示。圖像灰度化之后,在計算機中只需要用一個一維矩陣來表示,大大提高了后續處理速度。

圖3 條碼圖像灰度化前后對比
(2)條形碼圖像的傾角矯正
對于采集到的圖像,由于條形碼和攝像頭的角度問題,使得條形碼圖像和直角坐標系有一定的傾斜角度,為了方便后續處理,通常需要先計算出圖像的傾斜角度,然后通過旋轉相應角度對圖像進行矯正。
矯正圖像傾斜角度的方法有兩點法、最小二乘法、Hough變換法以及Radon變換法等[6-8]。兩點法、最小二乘法計算量小,但抗干擾能力差,不能計算有斷點的直線傾角。Hough變換法和Radon變換法具有很好的魯棒性,對于抗噪聲干擾能力強,精度比較高,但是運算量比較大。根據這種情況,本文采用Hough變換法。
Hough變換法是一種變換域直線提取法,由Paul Hough于1962年首次提出。Hough變換的基本原理是:對于直角坐標系中的直線方程y=kx+b,可以在極坐標中用ρ=xcosθ+ysinθ來表示,因而這條直線在極坐標中表示的是一點(ρ,θ)。對于直角坐標系下呈現直線的所有點,它們的斜率和截距均相同,因而它們在極坐標系下對應于同一個點,這樣就把直線的提取轉換成了點的計數而使問題得到解決。
本文在采用Hough變換法時,進行了適當改進,即考慮到條碼圖像中有大量的平行直線條,在處理時只選取含有條碼的小塊進行計算處理,然后根據得到的傾斜角度,再將整個圖像旋轉相應角度進行矯正,這樣既保證了精度,也減少了運算量。利用Hough變換對條碼圖像進行傾角矯正后的效果如圖4所示。

圖4 利用Hough變換進行圖像傾角矯正前后對比
(3)條形碼圖像的分割及濾波
針對矯正后的條碼圖像,采用水平和垂直兩種投影方法,檢測出條形碼圖像區域,并將其從原圖像中分割出來。
同時考慮到圖像本身或受污染可能存在噪聲的情況,需要對條碼圖像先進行去噪聲處理。常用的圖像去噪方法有高斯濾波、中值濾波、維納濾波、小波去噪、P-M方程法以及TV法等。本文考慮條形碼圖像中存在孤立噪聲多的狀況,選擇中值濾波法進行去噪。
中值濾波器作為一種非線性平滑濾波器經常被使用,它的基本原理是把數字圖像中的某點的值用該點的一個鄰域中各點值的中值替換,這樣能夠讓四周的像素灰度值差比較大的像素改取與周圍的像素值近似的值,從而達到去除孤立噪聲點的目的,因此中值濾波方法對于濾除圖像中的孤立噪聲十分有效。
對條形碼圖像進行目標分割和中值濾波后的效果如圖5所示。

圖5 分割的條碼圖像和中值濾波效果
(4)條形碼圖像的二值化
二值化就是將灰度圖像上的各點的灰度值轉換成為0或255兩個值,使整個圖像呈現出明顯的黑白兩色。對于灰度圖,像素點有256個灰度等級,經過選擇適當的閾值將灰度兩極化后,二值化圖像依然可以很好地反映圖像的特征。
根據上述所得的條碼圖像的濾波圖像,設定一個閾值R,若某點像素灰度值大于R,則令該點像素值為255;若某點像素灰度值小于R,則令該點像素值為0,即可將圖像二值化。假如圖像像素點的灰度值已經完成歸一化,則在0~1之間確定閾值。通過反復測試,本文選擇閾值為0.7~0.74。針對所得條形碼圖像的濾波圖像進行二值化后,得到的二值圖像如圖6所示,能夠看出,目標圖像和背景更加分明。

圖6 二值化后的條碼圖像
條形碼的譯碼過程主要分為邊緣確定、譯碼、校驗和顯示結果。
(1)邊緣確定
對于條碼圖像,首先要確定條形碼掃描方向,這里采用從左至右進行掃描,然后對圖像進行垂直投影,根據投影結果確定起止條碼的左右邊緣。
(2)譯碼
對于條形碼的譯碼,這里采用平均值法,即依據起止邊緣,計算出條碼符號圖像中整個條碼的寬度,然后用這個寬度除以總模塊數95,就可以得到每個模塊總共像素的寬度。再依據每個字符含有的模塊數,參考前述表1的字符集進行譯碼。
(3)校驗
條碼字符譯碼完成后,需要確定得到的譯碼是否正確,利用前述的校驗碼計算方法,可以對其校驗驗證。
(4)顯示結果
通過校驗碼驗證后,如果正確,則輸出識別到的條碼數字;否則,輸出“識別錯誤”。
基于MATLAB仿真軟件,利用其圖形用戶界面工具包GUI進行了EAN-13條形碼識別系統設計,得到的系統界面如圖7所示。

圖7 EAN-13條形碼識別系統界面
在本系統中,用戶需要先將采集的條形碼圖像存放到一個文件夾中。在運行程序后,用戶可以對采集的圖像進行選擇和導入,利用該系統的相關控件,可以顯示原圖以及部分過程處理效果圖,并能將最終的識別結果顯示出來。
經過對采集的620張條形碼圖片的處理實驗,正確識別614張,其他6張因為圖片污染嚴重或圖像采集時造成大的扭曲未能正確識別,系統識別準確率達到了99%以上,取得很好的效果,達到了工業應用所需的識別率要求。該系統也可以利用其他高級語言進行移植后供實際應用。
本文針對一維條形碼的識別問題,基于圖像處理技術,提出了從圖像預處理到條形碼譯碼的系列方法,并運用MATLAB仿真軟件,設計出了一個條形碼的識別系統,克服了基于光電技術的條碼識別帶來的局限性,實驗驗證了本文采用的處理方法和設計的系統的有效性,為條碼自動識別的實際應用提供了基礎和參考。