EAN一13码的图像识别系统设计与实现
待检像素的值由其邻域内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.5L2/L11.5且0.5L3/L21.5时,认为检测到101,且以a=(L1+L2+L3)/3为一个模块的长度。按上假设在条码中满足101情况很多,但是同时满足101两侧有固定空白模块数的就是惟一的。逐行扫描采用的是从中间行开始分别往上和往下扫描,这样对于有倾斜的条码图像也能分割出部分有用条码信息,而不需要用hough变换和双线性差值来对条码图像进行矫正,减少了处理时间。得到x1,x2,y1,y2之后就能把条码分割出来进行译码。
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码的各种应用。
- 思博伦为EANTC年度测试活动提供支持(05-31)
- 更快进行原型开发的八个技术考虑(07-28)
- 基于虚拟仪器LabVIEW的网络虚拟实验室系统设计(10-04)
- 基于射频技术的无线识别系统设计 (10-04)
- 基于单片机PIC18F1320的信号采集系统设计方案(06-01)
- 精轧机轴瓦温度在线监测系统的设计改造(02-06)