李 慧,歐陽鑫玉,張 鋒
(遼寧科技大學(xué) 電子與信息工程學(xué)院,遼寧 鞍山 114051)
隨著社會經(jīng)濟的快速發(fā)展,條形碼技術(shù)已成為一種常用的數(shù)據(jù)采集和自動識別技術(shù)[1-3],由于它具備輸入速度快、準確率高、投入成本低、簡單實用、自由度大、采用設(shè)備相對簡單、容易制作等特點,因此能夠普遍應(yīng)用在商品流通、工業(yè)生產(chǎn)、交通運輸、智慧物流、醫(yī)療衛(wèi)生等領(lǐng)域。
對于條碼的識別,通常是基于光電技術(shù)進行識別,一般的光電識讀設(shè)備通過線性掃描的方式讀取到條碼信息后,再利用硬件進行條形碼的識讀。由于條碼可能存在印刷不清或者由于臟污形成噪聲等情況,會導(dǎo)致識別率降低;此外,識讀設(shè)備成本過高,采用人工手持條形碼識別裝置工作效率低,難以適應(yīng)現(xiàn)代智能化、自動化的應(yīng)用場景功能需求。隨著數(shù)字圖像處理技術(shù)的發(fā)展,采用圖像處理技術(shù)和相關(guān)的智能算法對條形碼進行識別已成為新的趨勢,它可以有效解決利用硬件識別帶來的技術(shù)和成本問題。
本文正是在此背景之下,根據(jù)實際應(yīng)用需求,利用圖像處理相關(guān)技術(shù),對EAN-13一維條形碼的識別進行了研究,并利用MATLAB軟件設(shè)計出識別系統(tǒng),克服了基于光電技術(shù)的條碼識別帶來的局限性。
EAN-13條形碼是歐洲物品編碼的一種終端產(chǎn)品條形碼協(xié)議和標(biāo)準,它的左側(cè)是空白區(qū),然后依次是起始符、左側(cè)數(shù)據(jù)符、中間分隔符,接著是右側(cè)數(shù)據(jù)符、校驗符、終止符以及右側(cè)空白區(qū)和供人識別的字符(如圖1所示),應(yīng)用比較廣泛。
EAN-13條形碼是一種(7,2)碼[4-5],包含了13位數(shù)據(jù)字符,其中第1~3位字符代表國家代碼,第4~7位字符代表廠商代碼,第8~12位字符代表產(chǎn)品代碼,第13位字符是校驗碼;每個字符由兩個條和兩個空交替組成,每一條或空由1~4個模塊組成,每一數(shù)字總寬度為7個模塊,分別用“0”和“1”表示條形碼的空和條的模塊。
圖1 EAN-13碼的結(jié)構(gòu)
EAN-13條形碼字符集包括0~9共10個數(shù)字字符,條碼的二進制表示形式由A、B和C三個子集(見表1)確定。條形碼中的前置碼不用字符表示;右側(cè)的數(shù)據(jù)符和最后的校驗符全部用C子集來表示。前置碼的數(shù)值決定左側(cè)數(shù)據(jù)符是選用A子集還是選用B子集來表示,表2列出了左側(cè)數(shù)據(jù)符的字符集選擇規(guī)則。
表1 條形碼字符集
表2 左側(cè)數(shù)據(jù)符的字符集選擇規(guī)則
校驗符是用來檢驗前面的字符數(shù)字是否正確,計算公式如下:
=a2×102+a1×10+a0
(1)
(2)
其中,Ti(i=1,2,…,12)表示條形碼的第1~12位數(shù)字值,L為校驗符的值。
以EAN-13條形碼9787512426399為例,其前置碼為9,根據(jù)表2可知,其左側(cè)數(shù)據(jù)符的字符集為ABBABA。根據(jù)校驗碼的計算方法,可知K=131,a0=9,因此校驗碼是9。又根據(jù)表1可知,該條形碼后12位數(shù)的二進制碼分別為:0111011、0001001、0010001、0110001、0110011、0010011、1011100、1101100、1010000、1000010、1110100、1110100。
條碼圖像識別處理流程如圖2所示。
圖2 條形碼圖像識別流程
條形碼圖像采集后,需要對圖像進行預(yù)處理,即進行圖像灰度化、傾角矯正、目標(biāo)分割、濾波等操作,然后針對分割的條碼圖像,根據(jù)譯碼規(guī)則進行譯碼識別。
(1)條形碼圖像的灰度化
通過各種攝像設(shè)備采集到的條形碼圖像,大多是彩色圖像,采用的是RGB顏色模式,即用紅、綠、藍三種原色來表示,各個顏色分量的取值范圍都是0~255,因此,對于一個RGB圖像,在計算機中需要用一個三維矩陣來表示,但實際上RGB并不能反映圖像的形態(tài)特征,只是從光學(xué)的原理上進行了顏色的調(diào)配。在進行圖像處理時,通常為了減少所要處理的運算量,一般采用將RGB圖像進行灰度化的方法。圖像灰度化處理方法通常有分量法、最大值法、平均值法和加權(quán)平均法等。本文采用了平均值法進行灰度化,即將分量R、G、B的值求平均得到一個灰度值,處理效果如圖3所示。圖像灰度化之后,在計算機中只需要用一個一維矩陣來表示,大大提高了后續(xù)處理速度。
圖3 條碼圖像灰度化前后對比
(2)條形碼圖像的傾角矯正
對于采集到的圖像,由于條形碼和攝像頭的角度問題,使得條形碼圖像和直角坐標(biāo)系有一定的傾斜角度,為了方便后續(xù)處理,通常需要先計算出圖像的傾斜角度,然后通過旋轉(zhuǎn)相應(yīng)角度對圖像進行矯正。
矯正圖像傾斜角度的方法有兩點法、最小二乘法、Hough變換法以及Radon變換法等[6-8]。兩點法、最小二乘法計算量小,但抗干擾能力差,不能計算有斷點的直線傾角。Hough變換法和Radon變換法具有很好的魯棒性,對于抗噪聲干擾能力強,精度比較高,但是運算量比較大。根據(jù)這種情況,本文采用Hough變換法。
Hough變換法是一種變換域直線提取法,由Paul Hough于1962年首次提出。Hough變換的基本原理是:對于直角坐標(biāo)系中的直線方程y=kx+b,可以在極坐標(biāo)中用ρ=xcosθ+ysinθ來表示,因而這條直線在極坐標(biāo)中表示的是一點(ρ,θ)。對于直角坐標(biāo)系下呈現(xiàn)直線的所有點,它們的斜率和截距均相同,因而它們在極坐標(biāo)系下對應(yīng)于同一個點,這樣就把直線的提取轉(zhuǎn)換成了點的計數(shù)而使問題得到解決。
本文在采用Hough變換法時,進行了適當(dāng)改進,即考慮到條碼圖像中有大量的平行直線條,在處理時只選取含有條碼的小塊進行計算處理,然后根據(jù)得到的傾斜角度,再將整個圖像旋轉(zhuǎn)相應(yīng)角度進行矯正,這樣既保證了精度,也減少了運算量。利用Hough變換對條碼圖像進行傾角矯正后的效果如圖4所示。
圖4 利用Hough變換進行圖像傾角矯正前后對比
(3)條形碼圖像的分割及濾波
針對矯正后的條碼圖像,采用水平和垂直兩種投影方法,檢測出條形碼圖像區(qū)域,并將其從原圖像中分割出來。
同時考慮到圖像本身或受污染可能存在噪聲的情況,需要對條碼圖像先進行去噪聲處理。常用的圖像去噪方法有高斯濾波、中值濾波、維納濾波、小波去噪、P-M方程法以及TV法等。本文考慮條形碼圖像中存在孤立噪聲多的狀況,選擇中值濾波法進行去噪。
中值濾波器作為一種非線性平滑濾波器經(jīng)常被使用,它的基本原理是把數(shù)字圖像中的某點的值用該點的一個鄰域中各點值的中值替換,這樣能夠讓四周的像素灰度值差比較大的像素改取與周圍的像素值近似的值,從而達到去除孤立噪聲點的目的,因此中值濾波方法對于濾除圖像中的孤立噪聲十分有效。
對條形碼圖像進行目標(biāo)分割和中值濾波后的效果如圖5所示。
圖5 分割的條碼圖像和中值濾波效果
(4)條形碼圖像的二值化
二值化就是將灰度圖像上的各點的灰度值轉(zhuǎn)換成為0或255兩個值,使整個圖像呈現(xiàn)出明顯的黑白兩色。對于灰度圖,像素點有256個灰度等級,經(jīng)過選擇適當(dāng)?shù)拈撝祵⒒叶葍蓸O化后,二值化圖像依然可以很好地反映圖像的特征。
根據(jù)上述所得的條碼圖像的濾波圖像,設(shè)定一個閾值R,若某點像素灰度值大于R,則令該點像素值為255;若某點像素灰度值小于R,則令該點像素值為0,即可將圖像二值化。假如圖像像素點的灰度值已經(jīng)完成歸一化,則在0~1之間確定閾值。通過反復(fù)測試,本文選擇閾值為0.7~0.74。針對所得條形碼圖像的濾波圖像進行二值化后,得到的二值圖像如圖6所示,能夠看出,目標(biāo)圖像和背景更加分明。
圖6 二值化后的條碼圖像
條形碼的譯碼過程主要分為邊緣確定、譯碼、校驗和顯示結(jié)果。
(1)邊緣確定
對于條碼圖像,首先要確定條形碼掃描方向,這里采用從左至右進行掃描,然后對圖像進行垂直投影,根據(jù)投影結(jié)果確定起止條碼的左右邊緣。
(2)譯碼
對于條形碼的譯碼,這里采用平均值法,即依據(jù)起止邊緣,計算出條碼符號圖像中整個條碼的寬度,然后用這個寬度除以總模塊數(shù)95,就可以得到每個模塊總共像素的寬度。再依據(jù)每個字符含有的模塊數(shù),參考前述表1的字符集進行譯碼。
(3)校驗
條碼字符譯碼完成后,需要確定得到的譯碼是否正確,利用前述的校驗碼計算方法,可以對其校驗驗證。
(4)顯示結(jié)果
通過校驗碼驗證后,如果正確,則輸出識別到的條碼數(shù)字;否則,輸出“識別錯誤”。
基于MATLAB仿真軟件,利用其圖形用戶界面工具包GUI進行了EAN-13條形碼識別系統(tǒng)設(shè)計,得到的系統(tǒng)界面如圖7所示。
圖7 EAN-13條形碼識別系統(tǒng)界面
在本系統(tǒng)中,用戶需要先將采集的條形碼圖像存放到一個文件夾中。在運行程序后,用戶可以對采集的圖像進行選擇和導(dǎo)入,利用該系統(tǒng)的相關(guān)控件,可以顯示原圖以及部分過程處理效果圖,并能將最終的識別結(jié)果顯示出來。
經(jīng)過對采集的620張條形碼圖片的處理實驗,正確識別614張,其他6張因為圖片污染嚴重或圖像采集時造成大的扭曲未能正確識別,系統(tǒng)識別準確率達到了99%以上,取得很好的效果,達到了工業(yè)應(yīng)用所需的識別率要求。該系統(tǒng)也可以利用其他高級語言進行移植后供實際應(yīng)用。
本文針對一維條形碼的識別問題,基于圖像處理技術(shù),提出了從圖像預(yù)處理到條形碼譯碼的系列方法,并運用MATLAB仿真軟件,設(shè)計出了一個條形碼的識別系統(tǒng),克服了基于光電技術(shù)的條碼識別帶來的局限性,實驗驗證了本文采用的處理方法和設(shè)計的系統(tǒng)的有效性,為條碼自動識別的實際應(yīng)用提供了基礎(chǔ)和參考。