2.2.2 左右分割
左右分割是在行方向把条码分割出来,流程如图5(b)所示,此流程的设计应用了条码的两个特征:
(1)条码的左侧空白区有11个模块,右侧空白区有7个模块;
(2)条码的起始符为101,结束符为101。
当然图像一般都会有倾斜,这样按照x1,x2分割时会把条码区域有用信息分割掉,因此可以加一个经验修正,把x1向左移一点,把x2向右移一点。
在检测101和计算一个模块的长度时,都是通过边缘间的距离计算的,由于图像有变形和扭曲,因此计算长度是要用平均值和比值。
设连续3个边缘的距离为L1,L2,L3,当0.5<L2/L1<1.5且0.5<L3/L2<1.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码的各种应用。