EAN一13码的图像识别系统设计与实现
0 引 言
自动化数据采集技术是信息采集和处理的关键技术,条码技术在自动化数据采集中占重要地位,得到了广泛的应用。但是普遍的条码阅读器是基于激光扫描或者CCD摄像头的,在生活中不是很常见。如果条码识读能用普通的摄像头(如:手机摄像头或网络摄像头),条码将会给人们的日常生活带来更多的方便。近来手机和机器人的应用得到很大发展,手机的一维码识别、机器人的一维码识别、自动分拣物品等都有着很好的应用前景。为了拓宽一维码的应用,基于图像处理的一维条码研究有着重要意义。
在最近几年关于一维码图像识别的识别文章中,都是针对比较理想的条码进行识别的,或者只是讲解一维条码图像识别的某一个步骤,或者是人为地加上部分噪声进行处理,很少有从一幅真正拍摄的图像来识读的。这里完成了整个条码识别系统的设计和图像处理的算法设计,实现了图像的录入到译出条码的整个过程,并通过实验详细阐述了识别流程和效果。
1 EAN—13码特征
EAN一13是标准商品条码,它是一种(7,2)码,即每个字符的总宽度为7个模块,由两个条和两个空交替组成,而每个条空的宽度不超过4个模块。EAN一13商品条码由左侧空白区,起始符、左侧数据符、中间分隔符、右侧数据符、、终止符、校验符、右侧空白区组成,如图1所示。EAN一13码包含13个字符,但只对12个字符进行编码,其第13位(从右向左排序)不进行编码,数值隐含在左侧数据符的奇偶排列中,称为前置符。奇偶性指的是每个字符所含条的模块数为奇数或者偶数,左侧数据符为奇、偶排列,右侧数据符为偶排列,左边的码字组成方式是“空条空条”,右边的码字组成方式是“条空条空”。
由EAN一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。
如何确定数字字符是属于A子集,B子集或者C子集。EAN一13码左侧数据符由A,B子集确定,取决于前置符,右侧数据符属于C子集。前置码和左侧数据符商品条码字符集的选用规则如表2所示。
2 条码识别
在条码识别的整个过程中,都是基于以下假设:所处理的图像正中肯定是包含条码部分的,这样可以很好地减少计算量。条码识别系统分为三个模块:图像预处理、图像提取、译码。如图2所示。
图像预处理是利用一维条码的特征对条码执行灰度化,二值化,滤波和边缘检测操作。它为后续的图像提取做好准备,图像预处理做得越好,图像提取效果将更加明显。
图像提取是对预处理的图像进行分割,分为上下分割和左右分割,在各种背景中分割出条码区域,图像提取的取决于是否能精确地分割出条码区域。由于一维条码是并行长条的,每一条行扫描线都包行了条码的所有信息,最简单的方法是只要在条码图上确定一根行扫描线,逐个像素判断,黑的为1,白的为0,计入数组,然后计算宽度就能解码,这是针对完全干净的条码图的。实际应用的条码图像会有很多噪声,同时条码区域也不可能完全干净,因此需要尽量分割出条码的大部分区域给后续的解码提供更多的信息,上下分割中把沿条码方向的部分条码分割出来,左右分割需把条码的编码区全部包含在内。
译码是对提取后的条码区进行处理,计算出条码中各个条空的宽度,根据一维码的编码规则,解出条码所含的信息。
2.1 图像预处理
2.1.1 灰度化二值化
灰度处理,为实现数字图像的阈值变换提供前提条件,要将256色位图转变为灰度图,灰度与RGB值之间的关系为:Y=0.299R+0.587G+O.114B。
二值化是利用点运算中的阈值变换理论将灰度图转化为二值图像。二值化中阈值T的选择是关键,在整幅图中,我们最关心的是条码,条码是由条空(黑白)组成的,根据前面的假设,在整幅图的中心区域选取50×50个像素点,对其进行灰度处理并得到灰度直方图,采用双峰法得到阈值T,此阈值可以有效地把条码的条空区分出来。按照下式得到二值化图像g(x,y)。
2.1.2 滤波
由于原图像各部分亮度不均,背景图像有不同的情况,得到的二值图会有很多噪声,条码区域有,条码区域外也有,为了后续部分的条码提取和条码译码,需要进行滤波处理。考虑到一维条码的特征:竖直的条和空,采用中值滤波方法,中值滤波模板如图3所示。被圈部分表示模板遍历整幅图时,所对应待检像素的位置。取待滤波像素上下相邻的4个像素值,共5个像素值进行排序,用中间值覆盖待滤波的像素值。此模块能有效地滤除条码区的椒盐噪声,背景区的噪声能得到很大抑制。此模块是根据一维码的特征设计,可以适合各种一维码。
2.1.3 边缘检测
常用的边缘检测算法有梯度算法、Roberts梯度法、Sobel算法和Laplaceian算法等,在充分研究一维条码的特征后,借鉴各种检测算法,在此自行设计了一种滤波算法。由于设计实验时采用的是640×480或320×240的图像,假设条码占整个图像的50 %以上,根据图2可以算出每个模块占的像素值为3到4个或l到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。
当然图像一般都会有倾斜,这样按照x1,x2分割时会把条码区域有用信息分割掉,因此可以加一个经验修正,把x1向左移一点,把x2向右移一点。
在检测101和计算一个模块的长度时,都是通过边缘间的距离计算的,由于图像有变形和扭曲,因此计算长度是要用平均值和比值。
设连续3个边缘的距离为L1,L2,L3,当0.5 2.3 译码 译码过程通过对分割后的二值图进行处理,得到条空的宽度,按照条码的编码方式,译出条码结果。译码步骤如下: (1)对二值图进行逐行扫描,检测边缘数是否为60(EAN-13码有59条空,60个边缘),是则记录下边缘坐标,否则把这行舍弃; (2)根据每行的边缘坐标,算出每个条空的宽度:为了减小图像中的条码扭曲及其他干扰的影响,计算条空宽度的平均值; (3)按照如下归一化方法确定条空归一化宽度。设一个字符(7个模块)的宽度为W,条空的平均宽度为Wa,则条空的归一化结果Wg由下式确定: (4)根据条码左侧数据区的奇偶性确定前置码,如表1所示; (5)根据前置码确定左侧数据区的字符集,右侧字符集为C; (6)根据数据区条码的归一化宽度,查找字符集,根据表2得出条码值,译码完成; (7)检校。 此译码流程不仅按照编码标准快速有效的译出了条码,同时也起到了滤波作用,把有噪声的行全部滤除,完成精确解码。按照上述条码识别的步骤和算法,用Visual C++编写了程序。图6展示从一幅带有条码的RGB图到译码的全部过程。 3 结语 对100幅640 x 320图像进行实验,解码率达100%,可以说本文的算法和译码步骤有着很好的可靠性,对适当扭曲和污染并有复杂背景的条码图有着较好的抗干扰性。在此通过对EAN-13码特征的分析和掌握,设计了滤波模板,边缘检测模板和图像提取算法,并实现了EAN-13码的译码系统,通过实验详细描述了整个解码过程。此识别系统有以下特点:充分考虑了EAN-13码的特点,设计了适合该条码的算法,识读准确率高,速度快;此系统架构和算法可以很快的应用于其他一维码的图像识别中;可以很容易的移植到带有CMOS摄像头的各个平台,实现基于EAN-13码的各种应用。
评论
查看更多