基于MATLAB的一维条码二维码识别

基于MATLAB的一维条码二维码识别


  1. 课题背景介绍

条码技术是如今应用最广泛的识别和输入技术之一,由于其包含的信息量大,识别错误率低而在各个方面得到很大的重视。它发展迅速并被广泛应用于于工业、商业、图书出版、医疗卫生等各行各业。由我国目前发展现状来看,条码的正常使用受到条形码印刷质量和商品运输过程的影响,并且传统的条码识读方式是采用光电识读器,条码图像对光的不同反射效果也必然会对条码的识读产生影响。

不同的条码有着不同的识读过程。本设计研究一种基于图像处理方式的识读方法,通过计算机辨识来解决条码印刷质量不佳和条码变形等问题。该方法是采用摄像头采集条码图像,通过照相,一次性采集条码图像的方法避免了线性扫描器逐行扫描所产生的问题,同时简化了扫描条码图像的操作。然后通过一定的数字图像处理算法处理进行译码。译码算法主要分为两部分:第一部分首先对采集的条码图像进行预处理,这将为后面实现正确译码打下基础;第二部分就是对预处理后的条码图像进行译码,我们将利用统计方法、根据相似边距离来判别条码字符,再通过译码、校验、纠错处理来识读条码,得到条码所表示的文本信息。与用条码识读器硬件进行译码相比,软件译码具有更大的灵活性和较低的成本,因此具有很大的发展潜力。本设计在Matlab软件语言环境下实现。

  1. 课题研究意义

条形码技术主要研究如何用条码标识信息、并将条形码表示的信息转换成计算机可识读的语言,以实现自动输入、自动识读、自动统计.在先进的工业国家里,条码技术作为一种信息处理技术己成为社会化产物,不仅应用于生产过程,而且也应用于管理过程。在我国条码技术起步比较晚,但它的发展非常迅速,己被广泛用于工业、商业、图书出版、医疗卫生等各行各业。随着全球经济贸易体系的形成,将被更广泛用于其它领域。现在,它已变成商品进入国际市场的通行证.但是,由我国目前发展现状来看,主要有两种因素影响条码正常使用。首先条形码在印刷中存在许多质量问题,据1998年4月桂林条码工作会议公布的数字表明,我国商品条码不合格率达20%--30%,使大量名牌产品、优质产品不能进入超级市场(POS商店)。条码印刷质量对其能否正常使用是至关重要的,质量低劣出现扫描误读,不仅造成不必要的经济损失,而且将大大影响了工作效率。其次,运输过程中造成的条码磨损、断裂和脏污是影响条码正确误读的另一个重要的因素。

目前,市场上普遍采用的条形码识读装置是光电识读器。由一般条码识读器的原理可知:条形码的宽窄和颜色的对比度都会对光的反射产生影响,不可避免的会影响到条码正确识读;此外,由于光电识读器采用线扫描方式,斑点、脏污和纸面断裂也会造成反射光的差异,相应的对条码识读也必然会产生影响。因此,一方面条码标准化工作需要大力加强;另一方面研制有一定的辨识能力的条码阅读装置具有十分重要的现实意义。条码图像辨识在一些特殊情况下将发挥着极大的优势。图像处理识读方法是首先对条码图像进行处理,然后利用统计方法,根据相似边距离来判别条码字符,再通过译码、校验、纠错处理来识读条码,这样将大大降低条码印刷质量以及条码污染等各种因素的干扰,从而有效地提高条码的识读率。


  1. 算法流程

本文研究的是基于数字图像处理的EAN-13条形码识别算法,通过工具平台(Matlab)实现。其中图像处理部分是条码识别重要的前期工作,利用Matlab强大的图象处理工具箱实现图像的读入、加噪仿真、滤波、二值化处理等工作,最终得到高质量的二值化图像。条码识别就是在二值图像的基础上实现,二值图像的质量直接关系到条码能否正确识读。在条码识读方法上,我们对宽度测量法、平均值法简单介绍,而对相似边距离的测量方法这一低误码率方法进行详细具体研究。

3.1 预处理结果与分析

根据上述条码图像预处理的理论知识编译相关的Matlab程序,得到如图3-2所示图像预处理结果。


v2-ce32b084eef1356c2e61ced545ed8574_b.jpg


图3-1 条码图像预处理

分析:Matlab图像处理工具箱支持的图像文件格式丰富,但通常情况下我们习惯于BMP格式图像的处理。利用imread函数将图像由计算机硬盘读入内存。

图像读入识别设备后或多或少都会受到噪声的影响,噪声的来源和类型是随机的。在Matlab平台上我们利用图像处理工具箱提供的imnoise函数能够对图像添加gaussian,localvar,passion,salt&pepper,speckle五种类型的噪声,达到仿真的效果。噪声影响条码图像的质量,从而影响条码的正确识读。而要想达到好的滤波效果就要针对图像的特征采用相应的滤波方法。中值滤波和低通滤波就是相对较适合条码图像的滤波方法。对于中值滤波,采用不同的模板会有不同的滤波效果,例如采用3×3模板的除噪效果好于采用5×1模板,后者处理后的图像边缘上和数字上还存有未滤除的椒盐颗粒。

在实际的识读过程中,影响条码图像质量的不仅仅是噪声,还有条码图像读入过程中出现的倾斜,因此必须对图像进行矫正。我们可采用Hough变换,快速、准确地找到倾斜角度,实现对图像的矫正。本设计不考虑图像的倾斜情况

对滤波后的图像进行二值化处理,是条码识读的前提。二值化效果的好坏直接关系到条码识读的正确与否。如二值化后图像没达到预期的效果,我们运用形态学中的开和闭运算除去二值图像中的随机噪声。

以上所有数字图像处理算法对其它一维条码是通用的,也可应用于其它一维条码的处理和识别。

3.2 EAN-13码译码原理及其Matlab实现

3.2.1 条码译码原理

如图3-2所示是EAN-13条码的一个字符。条、空宽度的定义如下:图中C1、C2、C3、C4表示每个字符中四个相邻条、空的宽度,T表示一个字符的宽度。


v2-7263868ef68d83a33580bff33af6b321_b.jpg


图3-2 EAN-13条码宽度的定义

设一个字符中单位模块的宽度为n,则单位模块的宽度:

n=T/7

T=C1+C2+C3+C4

由于条码条、空宽度C1、C2、C3、C4已知,设条码条、空分别占单位模块的个数为mi,则:

mi=ci/n(其中i取1、2、3、4)

因此,由mi可知道条码的编码。例如:

(1)若m1=2、m2=2、m3=2、m4=1;

条码的排列为条-空-条-空,

则可知条码编码为1100110,是右侧偶性字符1;

(2)若m1=1、m2=2、m3=1、m4=3;

条码的排列为空-条-空-条,

则可知条码编码为0110111,是右侧奇性字符8。


3.2.2 条码译码方法

方案一:宽度测量法

在图像方式的译码过程中,宽度的测量不再采用传统的脉冲测量法,而是通过记录每个条或空的宽度中所含象素的个数来确定实际的条/空宽度,从而确定整个条码符号所代表的信息。

方案二:平均值法

对条码符号图像中从起始符到终止符整个宽度进行测量,然后除以95(标准宽度),求出单位模块所含的像素列宽,再分别测量各个条空的实际宽度(此宽度以单位宽度为单位计算)

方案三:相似边距离的测量方法

这种方法的设计思路是通过对符号中相邻元素的相似边之间距离的测量来判别字符的逻辑值,而不是由各元素宽度的实际测量值来判别。

前两种方案对条码图像的要求非常高,因为它们都是测量各元素符号的实际宽度,然后根据查表法得到所代表的码值。如果实际测量值与标准值存在一点偏差,就不能实现正确译码。而第三种方案正是有效的解决了这一问题,因此我们采用相似边距离测量的方法来实现译码功能.下面就简要说明一下这一方法。

由原理知,要想辨识一个条码,必须先测量条码条、空宽度C1、C2、C3、C4以及一个字符的宽度T。条码图像经过预处理后得到的是二值图像,该点的颜色信息在阈值变换时已经定义,用255和0表示白和黑色。我们从条码的左边开始取点,若遇到点的灰度值由255变到0即由点的颜色由白色变为黑色,则表示检测到条,记录下该点的坐标值,如果点的颜色由黑色变为白色,则表示检测到空,记录下该点的坐标值。这样经过扫描后得到各个颜色变化点的坐标,然后将相邻两点的横坐标相减得到各个条、空的宽度.由前面所述EAN-13条码的组成知:一个由占3个条空的起始符、3个条空的终止符、4个条空的左侧数据符、5个条空的中间分隔符、20个条空的右侧数据符、4个条空的校验符组成。所以,整个条码字符占的条空总数为59,若条码字符没有发生几何畸变,一行扫描应记录的坐标数为60个;而对于有几何畸变的条码图像,例如条码污染、条码断裂、条码瑕疵等,该扫描行的坐标数将肯定大于60或小于60,这时将不记录该扫描行,对此行不处理。这样利用图像统计方法,逐行扫描图像,获取条码图像信息,比起只由一行获取信息的方式可靠性更高,这样即使个别噪声点存在并不影响图像信息的获取。

(1)条码宽度的计算:

设条码字符颜色由黑变为白或由白变为黑(由“0”变为“1”或由“1”变为“0”)的各点坐标为x1、x2、 ……、x60。则一行扫描的条空宽度(像素)分别为:c1=x2-x1、c2=x3-x2、……、c59=x60-x59.

由上述图像条码译码理论可总结出条码条空宽度计算步骤,如图3-3所示:

v2-1995d83881f25f2ffeaf7a2b066facd6_b.jpg


图3-3 条码条空宽度计算

在Matlab中采用读取像素的方法实现。经过二值化后得到一个二值化图象矩阵bw。简单起见,我们可以读取矩阵bw的中间一行,得到一个向量A。为了提高可靠性,我们也可逐行扫描。

[h,l]=size(bw); %得到二值图像bw的大小

A=bw(round(h/2),:);

A中只有0和1表示黑与白。读取其中的元素,发生变化记下坐标(像素)存入另一个向量x中,x元素前后依次相减存入向量y中得条码宽度

(2)条码字符的判别—相似边距法

理论上条形码字符的逻辑值应该由条形码的实际宽度来判断,而相似边距离方法的设计思想通过对符号中相邻元素的相似边之间距离的测量来判别字符的逻辑值,而不是由元素宽度的实际值来判别。此种方法的优点是:即使条码质量存在缺欠,使得实际测量值和条码应该具有的理论值有较大的偏差,仍然可以根据相似边的距离能够正确解释。什么是相似边距离?图3-4给出了相似边之间的距离,则图中t1, t2, t3, t4, t5, t6, t7(归一化值)为条形码相似边距离。本文采用归一化理论,用一种相似边距离归一化的方法对字符进行判别。该方法即使条码印刷质量有偏差,仍能正确对条码进行识读.


v2-12bd7e0a70c6a490bbbdd4273c1ab94c_b.jpg


图3-4 相似边之间的距离 图3-5条码字符宽度示图

首先见图3-5各种宽度的定义:C1, C2, C3, C4表示每个字符中四个相邻条、空的宽度,T表示一个字符的宽度,t1 , t2为相似边之间的距离,则用下列值Ti(i=1,2)来定义TI与T2的归一化值。

测量图3-4中7个宽度值T, t1, t2, t3, t4, t5, t6;然后将测量值t1, t2, t3, t4, t5, t6转换为常数值Tl, T2, T3, T4, T5,及T6即T序列值,它代表了这些测量值的整数模块宽,以下方法用于i序列值的求取:

若1.5≦ti≦2.5,那么Ti=2

若2.5≦ti≦3.5,那么Ti=3

若3.5≦ti≦4.5,那么Ti=4

若4.5≦ti≦5.5,那么Ti=5

表3-2列出了正向译码时,EAN-13条码字符值与归一化值(Tl, T2)的对应关系。

表3-2 EAN-13条码字符与归一化值

v2-8c72175683ca203318b49aed8f7daee1_b.jpg


表3-2中“E”表示偶字符,“O”表示奇字符

EAN-13码字符编码与归一化值(T1. T2)的对应关系见表3-3。

表3-3 EAN-13字符编码与归一化值

v2-adce40a1ec2f512e14428520c61906a9_b.jpg


表3-3中可以看到条形码编码和归一化值在多数情况下呈现一一对应的关系,只要确定了归一化值就能确定字符值,但是有四种情况例外,在表3-3中知,左侧奇字符和右侧偶字符1,7归一化值均为44,左侧奇字符和右侧偶字符2,8归一化值均为33,左侧偶字符1,7归一化值均为34,左侧偶字符2,8归一化值均为43。这两种情况可以在判别字符时根据C1,C2,C3,C4进一步判别,根据它们条空宽度特点进行判别。有1728字符标准条空宽度值的特点知:对于左侧奇字符、右侧偶字符1和7可通过C3与C4作比较,C3>C4者为字符1,反之为7;对于左侧奇字符、右侧偶字符2和8可通过C2与C3作比较,C2>C3者为字符8,反之为2;对于左侧偶字符1和7可通过C1与C2作比较,C1>C2者为字符7,反之为1;对于左侧偶字符2和8可通过C2与C3作比较,C2>C3者为字符2,反之为8;

由上述条码字符识别理论可总结出相似边距离测量法的一般步骤。由条码宽度的计算我们得到了各个条、空的宽度(像素),并通过计算n=T/7,T=C1+C2+C3+C4得到单位模块的宽度(像素)。各个条空的宽度除以单位模块的宽度就是归一化的条空宽度。而为了方便译码,我们除去起始符3个条空,中间分隔符5个条空,终止符3个条空,对剩下的48个条空每4个条空为一组进行译码。计算相似边之间的距离t1、t2从而得到归一化(T1,T2)。最后查表可得条码字符。为检验译码的正确性利用校验位对码字进行校验。流程图如图3-6。

v2-2259ef166550a51e552dc9f6c661a06f_b.jpg


图3-6 字符判别流程图

3.3.3 译码结果与分析

根据上述译码理论,采用相似边距离测量方法对3.2.1节中预处理后的条码图像(二值图像)进行译码,得到如下所示译码结果。


v2-144650bdff16a86e48ca3742d6bef8e2_b.jpg

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值