龚亚欢 王 超 胡 晨

摘 要:条码的图像识别在信息采集领域有着广阔的应用前景,为了在复杂背景下快速正确的译出条码信息,在详细分析EAN[CD*2]13码之后,概括提取了其数个特征,利用EAN[CD*2]13码的特征及相关图像处理技术,设计EAN[CD*2]13码的图像自动识别系统,并用VC++编程实现,且利用大量实验进行验证。系统分为三部分:图像预处理、图像分割、图像译码。各部分的算法都是基于EAN[CD*2]13码的特征特定设计的,利用条码条空的特点设计边缘检测算子和滤波算子,利用起始符,终止符和空白符设计了分割算法,能有效地去除图像噪音对条码识别的影响,可以在复杂背景下提取条码图像完成〦AN[CD*2]13码的自动识别,针对性强,译码速度快,准确率高。

关键词:EAN[CD*2]13码;边缘检测;图像分割;滤波;自动识别;二值化

中图分类号:TP39

0 引 言

自动化数据采集技术是信息采集和处理的关键技术,条码技术在自动化数据采集中占重要地位,得到了广泛的应用。但是普遍的条码阅读器是基于激光扫描或者CCD摄像头的,在生活中不是很常见。如果条码识读能用普通的摄像头(如:手机摄像头或网络摄像头),条码将会给人们的日常生活带来更多的方便。近来手机和机器人的应用得到很大发展,手机的一维码识别、机器人的一维码识别、自动分拣物品等都有着很好的应用前景。为了拓宽一维码的应用,基于图像处理的一维条码研究有着重要意义。

在最近几年关于一维码图像识别的识别文章中,都是针对比较理想的条码进行识别的,或者只是讲解一维条码图像识别的某一个步骤,或者是人为地加上部分噪声进行处理,很少有从一幅真正拍摄的图像来识读的。这里完成了整个条码识别系统的设计和图像处理的算法设计,实现了图像的录入到译出条码的整个过程,并通过实验详细阐述了识别流程和效果。

1 EAN[CD*2]13码特征

EAN[CD*2]13是标准商品条码,它是一种(7,2)码,即每个字符的总宽度为7个模块,由两个条和两个空交替组成,而每个条空的宽度不超过4个模块。EAN[CD*2]13商品条码由左侧空白区,起始符、左侧数据符、中间分隔符、右侧数据符、、终止符、校验符、右侧空白区组成,如图1所示。EAN[CD*2]13码包含13个字符,但只对12个字符进行编码,其第13位(从右向左排序)不进行编码,数值隐含在左侧数据符的奇偶排列中,称为前置符。奇偶性指的是每个字符所含条的模块数为奇数或者偶数,左侧数据符为奇、偶排列,右侧数据符为偶排列,左边的码字组成方式是“空条空条”,右边的码字组成方式是“条空条空”。オ[KH-1]

[HT5”K][JZ]图1 商品条码(EAN[CD*2]13)符号结构[HT5]

由EAN[CD*2]13条码的结构知:左侧空白区为11个模块,起始符为3个模块(3个条空),左侧数据符为42个模块(24个条空),中间分隔符为5个模块(5个条空),右侧数据符为35个模块(20个条空),检校符为7个模块(4个条空),终止符为3个模块(3个条空),右侧空白区为7个模块,整个编码区的模块数为3+42+5+35+7+3=95个,条空数为3+24+5+20+4+3=59个。若将黑色模块(条)用二进制的“1”表示,白色模块(空)用二进制的“0”表示,则数据字符的编码图案有30种,如表1所示。且有如下编码:起始符:101中间分隔符010110,终止符101。

[HT6H][STHZ][WTHZ][JZ]表1 EAN[CD*2]13编码[STBZ][WTBZ][HT6K]

[HT6]注:括号中为各种编码条空的归一化宽度。[HJ*2/3][HJ][HT5SS]

如何确定数字字符是属于A子集,B子集或者C子集。EAN[CD*2]13码左侧数据符由A,B子集确定,取决于前置符,右侧数据符属于C子集。前置码和左侧数据符商品条码字符集的选用规

2 条码识别

在条码识别的整个过程中,都是基于以下假设:所处理的图像正中肯定是包含条码部分的,这样可以很好地减少计算量。

条码识别系统分为三个模块:图像预处理、图像提取、译码。如图2所示。

图像预处理是利用一维条码的特征对条码执行灰度化,二值化,滤波和边缘检测操作。它为后续的图像提取做好准备,图像预处理做得越好,图像提取效果将更加明显。

图像提取是对预处理的图像进行分割,分为上下分割和左右分割,在各种背景中分割出条码区域,图像提取的取决于是否能精确地分割出条码区域。由于一维条码是并行长条的,每一条行扫描线都包行了条码的所有信息,最简单的方法是只要在条码图上确定一根行扫描线,逐个像素判断,黑的为1,白的为0,计入数组,然后计算宽度就能解码,这是针对完全干净的条码图的。实际应用的条码图像会有很多噪声,同时条码区域也不可能完全干净,因此需要尽量分割出条码的大部分区域给后续的解码提供更多的信息,上下分割中把沿条码方向的部分条码分割出来,左右分割需把条码的编码区全部包含在内。

译码是对提取后的条码区进行处理,计算出条码中各个条空的宽度,根据一维码的编码规则,解出条码所含的信息。

2.1 图像预处理

2.1.1 灰度化二值化

灰度处理,为实现数字图像的阈值变换提供前提条件,要将256色位图转变为灰度图,灰度与RGB值之间的关系为:玒=0.299R+0.587G+0.114B。

[JP2]二值化是利用点运算中的阈值变换理论将灰度图转化为二值图像。二值化中阈值T的选择是关键,在整幅图中,我们最关心的是条码,条码是由条空(黑白)组成的,根据前面的假设,在整幅图的中心区域选取50×50个像素点,对其进行灰度处理并得到灰度直方图,采用双峰法[4]得到阈值玊,此阈值可以有效地把条码的条空区分出来。按照下式得到二值化图像

2.1.2 滤波

由于原图像各部分亮度不均,背景图像有不同的情况,得到的二值图会有很多噪声,条码区域有,条码区域外也有,为了后续部分的条码提取和条码译码,需要进行滤波处理。考虑到一维条码的特征:竖直的条和空,采用中值滤波方法,中值滤波模板如图3所示。被圈部分表示模板遍历整幅图时,所对应待检像素的位置。

取待滤波像素上下相邻的4个像素值,共5个像素值进行排序,用中间值覆盖待滤波的像素值。此模块能有效地滤除条码区的椒盐噪声,背景区的噪声能得到很大抑制。此模块是根据一维码的特征设计,可以适合各种一维码。

2.1.3 边缘检测

常用的边缘检测算法有梯度算法、Roberts梯度法、Sobel算法和Laplaceian算法等,在充分研究一维条码的特征后,借鉴各种检测算法,在此自行设计了一种滤波算法。

由于设计实验时采用的是640×480或320×240的图像,假设条码占整个图像的50%以上,根据图2可以算出每个模块占的像素值为3到4个或1到2个,如果采用3×3或5×5之类的边缘检测模板,加上图像原本的变形,将会误检边缘或边缘丢失,同时考虑到一维条码的特征: 竖直的条和空,有明显的竖直边缘,因此设计了竖直边缘检测算法,边缘检测模板如图4所示。

待检像素的值由其邻域内10个像素的值决定,这10个值按模板中的权值相加的绝对值为S(x,y)。由于进行边缘检测的图像是二值图,非黑(0)即白(255),设定边缘检测的阈值T1=255×4=1 020,即邻域内至少有4处黑白突变才能说明待检像素为一边缘值,按照下式得到边缘检测图像h(x,y)。

2.2 图像提取

图像提取是把图像中的条码部分割出来,用于后续的条码译码。图像提取的步骤分为:上下分割和左右分割。根据条码的特征,分别设计了上下分割和左右分割的算法。

2.2.1 上下分割

基于前文的假设,设计了如下分割算法,上下分割的流程如图5(a)所示,此流程的设计应用了条码的┝礁霆特征:条空数为59个,即边缘数为60个;条码的上下部分都有空白区。当然一般情况下,条码区域所在行肯定还会存在噪声,因此边缘数是肯定大于60的,而在条码上下的空白区所在行经过图像预处理基本没多少噪声,边缘数基本不会大于60,通过对100幅图像的试验只有背景很复杂的2幅图例外。但是没分割出来不代表没译码出来,后面译码部分对分割有补充修正。

根据各种图像的不同,上下分割不会把整个条码区域分割出来,但分割出来的图像信息足以用来解码。上下分割可以去除图像中上下部分的非条码区同时为译码减少了计算量。

2.2.2 左右分割

左右分割是在行方向把条码分割出来,流程如┩5(b)所示,此流程的设计应用了条码的两个特征:

(1) 条码的左侧空白区有11个模块,右侧空白区有7个模块;

(2) 条码的起始符为101,结束符为101。

当然图像一般都会有倾斜,这样按照玿1,x2分割时会把条码区域有用信息分割掉,因此可以加一个经验修正,把x1向左移一点,把x2向右移一点。

在检测101和计算一个模块的长度时,都是通过边缘间的距离计算的,由于图像有变形和扭曲,因此计算长度是要用平均值和比值。

设连续3个边缘的距离为L1,L2,L3,当0.5<㎜2/L1<1.5且0.5

2.3 译码

译码过程通过对分割后的二值图进行处理,得到条空的宽度,按照条码的编码方式,译出条码结果。译码步骤如下:

(1) 对二值图进行逐行扫描,检测边缘数是否为60(EAN[CD*2]13码有59条空,60个边缘),是则记录下边缘坐标,否则把这行舍弃;

(2) 根据每行的边缘坐标,算出每个条空的宽度:为了减小图像中的条码扭曲及其他干扰的影响,计算条空宽度的平均值;

(3) 按照如下归一化方法确定条空归一化宽度。

设一个字符(7个模块)的宽度为玏,条空的平均宽度为W瑷,则条空的归一化结果玏㻅由下式确定:

(4) 根据条码左侧数据区的奇偶性确定前置码,如表1所示;

(5) 根据前置码确定左侧数据区的字符集,右侧字符集为猎;

(6) 根据数据区条码的归一化宽度,查找字符集,根据表2得出条码值,译码完成;

(7) 检校。

此译码流程不仅按照编码标准快速有效的译出了条码,同时也起到了滤波作用[6],把有噪声的行全部滤除,完成精确解码。

按照上述条码识别的步骤和算法,用Visual C++编写了程序。图6展示从一幅带有条码的RGB图到译码的全部过程。

3 结 语

对100幅640×320图像进行实验,解码率达100%,可以说本文的算法和译码步骤有着很好的可靠[LL]性,对适当扭曲和污染并有复杂背景的条码图有着较好的抗干扰性。在此通过对EAN[CD*2]13码特征的分析和掌握,设计了滤波模板,边缘检测模板和图像提取算法,并实现了EAN[CD*2]13码的译码系统,通过实验详细描述了整个解码过程。

此识别系统有以下特点:充分考虑了EAN[CD*2]13码的特点,设计了适合该条码的算法,识读准确率高,速度快;此系统架构和算法可以很快的应用于其他一维码的图像识别中;可以很容易的移植到带有CMOS摄像头的各个平台,实现基于EAN[CD*2]13码的各种应用。

参 考 文 献

[1]Lu Xiangju,Fan Guoliang,Wang Yunkuan.A Robust Barcode Reading Method Based on Image Analysis of a Hierarchical Feature Classification[A].2006 IEEE/RSJ International Conference on Intelligent Robots and Systems[C].2006:3 358[CD*2]3 362.

[2]中国标准出版社.条码国家标准汇编[M].北京:中国标准出版社,2004.

[3]Eisaku Ohbuchi,Hiroshi Hanaizumi,Lim Ah Hock.Barcode Readers using the Camera Device in Mobile Phones[A].

2004 International Conference on Cyberworlds[C].2004:260[CD*2]265.

[4]刘宁钟.复杂背景中条码检测定位技术的研究[J].南京航空航天大学学报,2005,37(1):65[CD*2]69.

[5]左飞,万晋森.Visual C++数字图像处理开发入门与编程实践[M].北京: 电子工业出版社,2008.

[6]王雅静.基于图像处理的EAN[CD*2]13条码识别算法[J].山东理工大学学报:自然科学版,2005(4):17[CD*2]21.

[7]冈萨雷斯.Digital Image Processing:Using Matlab[M].阮秋琦,译.北京:电子工业出版社,2005.

[8]吕文红.二维条形码的编码与识别[J].现代电子技术,2002,25(7):62[CD*2]64.

作者简介 龚亚欢 男,江苏南通人,硕士研究生。