EAN一13碼的圖像識(shí)別系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
0 引 言
自動(dòng)化數(shù)據(jù)采集技術(shù)是信息采集和處理的關(guān)鍵技術(shù),條碼技術(shù)在自動(dòng)化數(shù)據(jù)采集中占重要地位,得到了廣泛的應(yīng)用。但是普遍的條碼閱讀器是基于激光掃描或者CCD攝像頭的,在生活中不是很常見。如果條碼識(shí)讀能用普通的攝像頭(如:手機(jī)攝像頭或網(wǎng)絡(luò)攝像頭),條碼將會(huì)給人們的日常生活帶來更多的方便。近來手機(jī)和機(jī)器人的應(yīng)用得到很大發(fā)展,手機(jī)的一維碼識(shí)別、機(jī)器人的一維碼識(shí)別、自動(dòng)分揀物品等都有著很好的應(yīng)用前景。為了拓寬一維碼的應(yīng)用,基于圖像處理的一維條碼研究有著重要意義。
在最近幾年關(guān)于一維碼圖像識(shí)別的識(shí)別文章中,都是針對(duì)比較理想的條碼進(jìn)行識(shí)別的,或者只是講解一維條碼圖像識(shí)別的某一個(gè)步驟,或者是人為地加上部分噪聲進(jìn)行處理,很少有從一幅真正拍攝的圖像來識(shí)讀的。這里完成了整個(gè)條碼識(shí)別系統(tǒng)的設(shè)計(jì)和圖像處理的算法設(shè)計(jì),實(shí)現(xiàn)了圖像的錄入到譯出條碼的整個(gè)過程,并通過實(shí)驗(yàn)詳細(xì)闡述了識(shí)別流程和效果。
1 EAN—13碼特征
EAN一13是標(biāo)準(zhǔn)商品條碼,它是一種(7,2)碼,即每個(gè)字符的總寬度為7個(gè)模塊,由兩個(gè)條和兩個(gè)空交替組成,而每個(gè)條空的寬度不超過4個(gè)模塊。EAN一13商品條碼由左側(cè)空白區(qū),起始符、左側(cè)數(shù)據(jù)符、中間分隔符、右側(cè)數(shù)據(jù)符、、終止符、校驗(yàn)符、右側(cè)空白區(qū)組成,如圖1所示。EAN一13碼包含13個(gè)字符,但只對(duì)12個(gè)字符進(jìn)行編碼,其第13位(從右向左排序)不進(jìn)行編碼,數(shù)值隱含在左側(cè)數(shù)據(jù)符的奇偶排列中,稱為前置符。奇偶性指的是每個(gè)字符所含條的模塊數(shù)為奇數(shù)或者偶數(shù),左側(cè)數(shù)據(jù)符為奇、偶排列,右側(cè)數(shù)據(jù)符為偶排列,左邊的碼字組成方式是“空條空條”,右邊的碼字組成方式是“條空條空”。
由EAN一13條碼的結(jié)構(gòu)知:左側(cè)空白區(qū)為11個(gè)模塊,起始符為3個(gè)模塊(3個(gè)條空),左側(cè)數(shù)據(jù)符為42個(gè)模塊(24個(gè)條空),中間分隔符為5個(gè)模塊(5個(gè)條空),右側(cè)數(shù)據(jù)符為35個(gè)模塊(20個(gè)條空),檢校符為7個(gè)模塊(4個(gè)條空),終止符為3個(gè)模塊(3個(gè)條空),右側(cè)空白區(qū)為7個(gè)模塊,整個(gè)編碼區(qū)的模塊數(shù)為3+42+5+35+7+3=95個(gè),條空數(shù)為3+24+5+20+4+3=59個(gè)。若將黑色模塊(條)用二進(jìn)制的“1”表示,白色模塊(空)用二進(jìn)制的“0”表示,則數(shù)據(jù)字符的編碼圖案有30種,如表1所示。且有如下編碼:起始符:101中間分隔符010110,終止符101。
如何確定數(shù)字字符是屬于A子集,B子集或者C子集。EAN一13碼左側(cè)數(shù)據(jù)符由A,B子集確定,取決于前置符,右側(cè)數(shù)據(jù)符屬于C子集。前置碼和左側(cè)數(shù)據(jù)符商品條碼字符集的選用規(guī)則如表2所示。
2 條碼識(shí)別
在條碼識(shí)別的整個(gè)過程中,都是基于以下假設(shè):所處理的圖像正中肯定是包含條碼部分的,這樣可以很好地減少計(jì)算量。條碼識(shí)別系統(tǒng)分為三個(gè)模塊:圖像預(yù)處理、圖像提取、譯碼。如圖2所示。
圖像預(yù)處理是利用一維條碼的特征對(duì)條碼執(zhí)行灰度化,二值化,濾波和邊緣檢測操作。它為后續(xù)的圖像提取做好準(zhǔn)備,圖像預(yù)處理做得越好,圖像提取效果將更加明顯。
圖像提取是對(duì)預(yù)處理的圖像進(jìn)行分割,分為上下分割和左右分割,在各種背景中分割出條碼區(qū)域,圖像提取的取決于是否能精確地分割出條碼區(qū)域。由于一維條碼是并行長條的,每一條行掃描線都包行了條碼的所有信息,最簡單的方法是只要在條碼圖上確定一根行掃描線,逐個(gè)像素判斷,黑的為1,白的為0,計(jì)入數(shù)組,然后計(jì)算寬度就能解碼,這是針對(duì)完全干凈的條碼圖的。實(shí)際應(yīng)用的條碼圖像會(huì)有很多噪聲,同時(shí)條碼區(qū)域也不可能完全干凈,因此需要盡量分割出條碼的大部分區(qū)域給后續(xù)的解碼提供更多的信息,上下分割中把沿條碼方向的部分條碼分割出來,左右分割需把條碼的編碼區(qū)全部包含在內(nèi)。
譯碼是對(duì)提取后的條碼區(qū)進(jìn)行處理,計(jì)算出條碼中各個(gè)條空的寬度,根據(jù)一維碼的編碼規(guī)則,解出條碼所含的信息。
2.1 圖像預(yù)處理
2.1.1 灰度化二值化
灰度處理,為實(shí)現(xiàn)數(shù)字圖像的閾值變換提供前提條件,要將256色位圖轉(zhuǎn)變?yōu)榛叶葓D,灰度與RGB值之間的關(guān)系為:Y=0.299R+0.587G+O.114B。
二值化是利用點(diǎn)運(yùn)算中的閾值變換理論將灰度圖轉(zhuǎn)化為二值圖像。二值化中閾值T的選擇是關(guān)鍵,在整幅圖中,我們最關(guān)心的是條碼,條碼是由條空(黑白)組成的,根據(jù)前面的假設(shè),在整幅圖的中心區(qū)域選取50×50個(gè)像素點(diǎn),對(duì)其進(jìn)行灰度處理并得到灰度直方圖,采用雙峰法得到閾值T,此閾值可以有效地把條碼的條空區(qū)分出來。按照下式得到二值化圖像g(x,y)。
2.1.2 濾波
由于原圖像各部分亮度不均,背景圖像有不同的情況,得到的二值圖會(huì)有很多噪聲,條碼區(qū)域有,條碼區(qū)域外也有,為了后續(xù)部分的條碼提取和條碼譯碼,需要進(jìn)行濾波處理。考慮到一維條碼的特征:豎直的條和空,采用中值濾波方法,中值濾波模板如圖3所示。被圈部分表示模板遍歷整幅圖時(shí),所對(duì)應(yīng)待檢像素的位置。取待濾波像素上下相鄰的4個(gè)像素值,共5個(gè)像素值進(jìn)行排序,用中間值覆蓋待濾波的像素值。此模塊能有效地濾除條碼區(qū)的椒鹽噪聲,背景區(qū)的噪聲能得到很大抑制。此模塊是根據(jù)一維碼的特征設(shè)計(jì),可以適合各種一維碼。
2.1.3 邊緣檢測
常用的邊緣檢測算法有梯度算法、Roberts梯度法、Sobel算法和Laplaceian算法等,在充分研究一維條碼的特征后,借鑒各種檢測算法,在此自行設(shè)計(jì)了一種濾波算法。由于設(shè)計(jì)實(shí)驗(yàn)時(shí)采用的是640×480或320×240的圖像,假設(shè)條碼占整個(gè)圖像的50 %以上,根據(jù)圖2可以算出每個(gè)模塊占的像素值為3到4個(gè)或l到2個(gè),如果采用3×3或5×5之類的邊緣檢測模板,加上圖像原本的變形,將會(huì)誤檢邊緣或邊緣丟失,同時(shí)考慮到一維條碼的特征:豎直的條和空,有明顯的豎直邊緣,因此設(shè)計(jì)了豎直邊緣檢測算法,邊緣檢測模板如圖4所示。
待檢像素的值由其鄰域內(nèi)10個(gè)像素的值決定,這10個(gè)值按模板中的權(quán)值相加的絕對(duì)值為s(x,y)。由于進(jìn)行邊緣檢測的圖像是二值圖,非黑(0)即白(255),設(shè)定邊緣檢測的閾值T1=255×4=1 020,即鄰域內(nèi)至少有4處黑白突變才能說明待檢像素為一邊緣值,按照下式得到邊緣檢測圖像h(x,y)。
2.2 圖像提取
圖像提取是把圖像中的條碼部分割出來,用于后續(xù)的條碼譯碼。圖像提取的步驟分為:上下分割和左右分割。根據(jù)條碼的特征,分別設(shè)計(jì)了上下分割和左右分割的算法。
2.2.1 上下分割
基于前文的假設(shè),設(shè)計(jì)了如下分割算法,上下分割的流程如圖5(a)所示,此流程的設(shè)計(jì)應(yīng)用了條碼的兩個(gè)特征:條空數(shù)為59個(gè),即邊緣數(shù)為60個(gè);條碼的上下部分都有空白區(qū)。當(dāng)然一般情況下,條碼區(qū)域所在行肯定還會(huì)存在噪聲,因此邊緣數(shù)是肯定大于60的,而在條碼上下的空白區(qū)所在行經(jīng)過圖像預(yù)處理基本沒多少噪聲,邊緣數(shù)基本不會(huì)大于60,通過對(duì)100幅圖像的試驗(yàn)只有背景很復(fù)雜的2幅圖例外。但是沒分割出來不代表沒譯碼出來,后面譯碼部分對(duì)分割有補(bǔ)充修正。根據(jù)各種圖像的不同,上下分割不會(huì)把整個(gè)條碼區(qū)域分割出來,但分割出來的圖像信息足以用來解碼。上下分割可以去除圖像中上下部分的非條碼區(qū)同時(shí)為譯碼減少了計(jì)算量。
2.2.2 左右分割
左右分割是在行方向把條碼分割出來,流程如圖5(b)所示,此流程的設(shè)計(jì)應(yīng)用了條碼的兩個(gè)特征:
(1)條碼的左側(cè)空白區(qū)有11個(gè)模塊,右側(cè)空白區(qū)有7個(gè)模塊;
(2)條碼的起始符為101,結(jié)束符為101。
當(dāng)然圖像一般都會(huì)有傾斜,這樣按照x1,x2分割時(shí)會(huì)把條碼區(qū)域有用信息分割掉,因此可以加一個(gè)經(jīng)驗(yàn)修正,把x1向左移一點(diǎn),把x2向右移一點(diǎn)。
在檢測101和計(jì)算一個(gè)模塊的長度時(shí),都是通過邊緣間的距離計(jì)算的,由于圖像有變形和扭曲,因此計(jì)算長度是要用平均值和比值。
設(shè)連續(xù)3個(gè)邊緣的距離為L1,L2,L3,當(dāng)0.5<L2/L1<1.5且0.5<L3/L2<1.5時(shí),認(rèn)為檢測到101,且以a=(L1+L2+L3)/3為一個(gè)模塊的長度。按上假設(shè)在條碼中滿足101情況很多,但是同時(shí)滿足101兩側(cè)有固定空白模塊數(shù)的就是惟一的。逐行掃描采用的是從中間行開始分別往上和往下掃描,這樣對(duì)于有傾斜的條碼圖像也能分割出部分有用條碼信息,而不需要用hough變換和雙線性差值來對(duì)條碼圖像進(jìn)行矯正,減少了處理時(shí)間。得到x1,x2,y1,y2之后就能把條碼分割出來進(jìn)行譯碼。
2.3 譯碼
譯碼過程通過對(duì)分割后的二值圖進(jìn)行處理,得到條空的寬度,按照條碼的編碼方式,譯出條碼結(jié)果。譯碼步驟如下:
(1)對(duì)二值圖進(jìn)行逐行掃描,檢測邊緣數(shù)是否為60(EAN-13碼有59條空,60個(gè)邊緣),是則記錄下邊緣坐標(biāo),否則把這行舍棄;
(2)根據(jù)每行的邊緣坐標(biāo),算出每個(gè)條空的寬度:為了減小圖像中的條碼扭曲及其他干擾的影響,計(jì)算條空寬度的平均值;
(3)按照如下歸一化方法確定條空歸一化寬度。設(shè)一個(gè)字符(7個(gè)模塊)的寬度為W,條空的平均寬度為Wa,則條空的歸一化結(jié)果Wg由下式確定:
(4)根據(jù)條碼左側(cè)數(shù)據(jù)區(qū)的奇偶性確定前置碼,如表1所示;
(5)根據(jù)前置碼確定左側(cè)數(shù)據(jù)區(qū)的字符集,右側(cè)字符集為C;
(6)根據(jù)數(shù)據(jù)區(qū)條碼的歸一化寬度,查找字符集,根據(jù)表2得出條碼值,譯碼完成;
(7)檢校。
此譯碼流程不僅按照編碼標(biāo)準(zhǔn)快速有效的譯出了條碼,同時(shí)也起到了濾波作用,把有噪聲的行全部濾除,完成精確解碼。按照上述條碼識(shí)別的步驟和算法,用Visual C++編寫了程序。圖6展示從一幅帶有條碼的RGB圖到譯碼的全部過程。
3 結(jié)語
對(duì)100幅640 x 320圖像進(jìn)行實(shí)驗(yàn),解碼率達(dá)100%,可以說本文的算法和譯碼步驟有著很好的可靠性,對(duì)適當(dāng)扭曲和污染并有復(fù)雜背景的條碼圖有著較好的抗干擾性。在此通過對(duì)EAN-13碼特征的分析和掌握,設(shè)計(jì)了濾波模板,邊緣檢測模板和圖像提取算法,并實(shí)現(xiàn)了EAN-13碼的譯碼系統(tǒng),通過實(shí)驗(yàn)詳細(xì)描述了整個(gè)解碼過程。此識(shí)別系統(tǒng)有以下特點(diǎn):充分考慮了EAN-13碼的特點(diǎn),設(shè)計(jì)了適合該條碼的算法,識(shí)讀準(zhǔn)確率高,速度快;此系統(tǒng)架構(gòu)和算法可以很快的應(yīng)用于其他一維碼的圖像識(shí)別中;可以很容易的移植到帶有CMOS攝像頭的各個(gè)平臺(tái),實(shí)現(xiàn)基于EAN-13碼的各種應(yīng)用。