当前位置:文档之家› 条形码的识别图像处理报告解析

条形码的识别图像处理报告解析

华侨大学厦门工学院图像通信课程设计报告题目:基于数字图像处理的条形码识别专业、班级:学生姓名:学号:指导教师:分数:目录一、设计任务及要求 (3)二、设计原理及设计方案 (3)2.1、条码译码原理 (3)2.2条码译码方案 (4)三、设计步骤与结果 (10)3.1设计步骤 (10)3.2结果分析 (11)四、课程设计总结 (15)五、心得体会 (15)六、参考文献 (16)附录一、源程序 (17)附录二、成绩评定表 (25)一、设计任务及要求本课程设计研究的是基于数字图像处理的EAN-13条形码识别算法,通过工具平台MATLAB 实现。

其中图像处理部分是条码识别重要的前期工作,利用MATLAB 强大的图象处理工具箱实现图像的读入、加噪仿真、滤波、二值化处理等工作,最终得到高质量的二值化图像。

条码识别就是在二值图像的基础上实现,二值图像的质量直接关系到条码能否正确识读。

二、设计原理及设计方案2.1、条码译码原理:如图1-1所示是EAN-13条码的一个字符。

条、空宽度的定义如下:图中1C 、2C 、3C 、4C 表示每个字符中四个相邻条、空的宽度,T 表示一个字符的宽度。

图1-1 EAN-13条码宽度的定义设一个字符中单位模块的宽度为n ,则单位模块的宽度:n=T /7T=1C +2C +3C +4C由于条码条、空宽度1C 、2C 、3C 、4C 已知,设条码条、空分别占单位模块的个数为i m ,则:i m =i C /n(其中i 取1、2、3、4)因此,由mi 可知道条码的编码。

例如:(1)若1m =2、2m =2、3m =2、4m =1;条码的排列为条-空-条-空,则可知条码编码为1100110,是右侧偶性字符1;(2)若1m =1、2m =2、3m =1、4m =3;条码的排列为空-条-空-条,则可知条码编码为0110111,是右侧奇性字符8。

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

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

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

前两种方案对条码图像的要求非常高,因为它们都是测量各元素符号的实际宽度,然后根据查表法得到所代表的码值。

如果实际测量值与标准值存在一点偏差,就不能实现正确译码。

而第三种方案正是有效的解决了这一问题,因此本文采用相似边距离测量的方法来实现译码功能。

下面就简要说明一下这一方法。

由原理知,要想辨识一个条码,必须先测量条码条、空宽度1C 、2C 、3C 、4C 以及一个字符的宽度T 。

条码图像经过预处理后得到的是二值图像,该点的颜色信息在阈值变换时已经定义,用255和0表示白和黑色。

我们从条码的左边开始取点,若遇到点的灰度值由255变到0即由点的颜色由白色变为黑色,则表示检测到条,记录下该点的坐标值,如果点的颜色由黑色变为白色,则表示检测到空,记录下该点的坐标值。

这样经过扫描后得到各个颜色变化点的坐标,然后将相邻两点的横坐标相减得到各个条、空的宽度.由前面所述EAN-13条码的组成知:一个由占3个条空的起始符、3个条空的终止符、4个条空的左侧数据符、5个条空的中间分隔符、20个条空的右侧数据符、4个条空的校验符组成。

所以,整个条码字符占的条空总数为59,若条码字符没有发生几何畸变,一行扫描应记录的坐标数为60个。

而对于有几何畸变的条码图像,例如条码污染、条码断裂、条码瑕疵等,该扫描行的坐标数将肯定大于60或小于60,这时将不记录该扫描行,对此行不处理。

这样利用图像统计方法,逐行扫描图像,获取条码图像信息,比起只由一行获取信息的方式可靠性更高,这样即使个别噪声点存在并不影响图像信息的获取。

(1)条码宽度的计算:设条码字符颜色由黑变为白或由白变为黑(由“0”变为“1”或由“1”变为“0”)的各点坐标为1x 、2x 、 ……、60x 。

则一行扫描的条空宽度(像素)分别为:1c =2x -1x 、2c =3x -2x 、……、59c =60x -59x 。

由上述图像条码译码理论可总结出条码条空宽度计算步骤,如图1-2所示:图1-2 条码条空宽度计算在MATLAB 中采用读取像素的方法实现。

经过二值化后得到一个二值化图象矩阵bw 。

简单起见,可以读取矩阵bw 的中间一行,得到一个向量A 。

为了提高可靠性,我们也可逐行扫描。

[h,l]=size(bw); %得到二值图像bw 的大小A=bw(round(h/2),:);A 中只有0和1表示黑与白。

读取其中的元素,发生变化记下坐标(像素)存入另一个向量x 中,x 元素前后依次相减存入向量y 中得条码宽度。

(2)条码字符的判别—相似边距法:理论上条形码字符的逻辑值应该由条形码的实际宽度来判断,而相似边距离方法的设计思想通过对符号中相邻元素的相似边之间距离的测量来判别字符的逻辑值,而不是由元素宽度的实际值来判别。

此种方法的优点是:即使条码质量存在缺欠,使得实际测量值和条码应该具有的理论值有较大的偏差,仍然可以根据相似边的距离能够正确解释。

图1-3给出了相似边之间的距离,则图中1t ,2t ,3t ,4t ,5t ,6t ,7t (归一化值)为条形码相似边距离。

本文采用归一化理论,用一种相似边距离归一化的方法对字符进行判别。

该方法即使条码印刷质量有偏差,仍能正确对条码进行识读。

图1-3 相似边之间的距离 图1-4 条码字符宽度示图首先见图1-4各种宽度的定义: 1C , 2C , 3C , 4C 表示每个字符中四个相邻条、空的宽度,T 表示一个字符的宽度,1t ,2t 为相似边之间的距离,则用下列值i T (i=1,2)来定义1T 与2T 的归一化值。

测量7个宽度值T ,1t ,2t ,3t ,4t ,5t ,6t ;然后将测量值1t ,2t ,3t ,4t ,5t ,6t 转换为常数值1T ,2T ,3T ,4T ,5T ,6T 即T 序列值,它代表了这些测量值的整数模块宽,以下方法用于i 序列值的求取:若1.5≦i t ≦2.5,那么i T =2若2.5≦i t ≦3.5,那么i T =3若3.5≦i t ≦4.5,那么i T =4若4.5≦i t ≦5.5,那么i T =5表1-1列出了正向译码时,EAN-13条码字符值与归一化值(1T ,2T )的对应关系。

表1-1中“E”表示偶字符,“O”表示奇字符。

EAN-13码字符编码与归一化值(1T ,2T )的对应关系见表1-2。

表1-1 EAN-13条码字符与归一化值表1-2 EAN-13字符编码与归一化值可以看到条形码编码和归一化值在多数情况下呈现一一对应的关系,只要确定了归一化值就能确定字符值,但是有四种情况例外,在表1-2中知,左侧奇字符和右侧偶字符1,7归一化值均为44,左侧奇字符和右侧偶字符2,8归一化值均为33,左侧偶字符1,7归一化值均为34,左侧偶字符2,8归一化值均为43。

这两种情况可以在判别字符时根据1C ,2C ,3C ,4C 进一步判别,根据它们条空宽度特点进行判别。

有1728字符标准条空宽度值的特点知:对于左侧奇字符、右侧偶字符1和7可通过3C 与4C 作比较,3C >4C 者为字符1,反之为7;对于左侧奇字符、右侧偶字符2和8可通过2C 与3C 作比较,2C >3C 者为字符8,反之为2;对于左侧偶字符1和7可通过1C 与2C 作比较,1C >2C 者为字符7,反之为1;对于左侧偶字符2和8可通过2C 与3C 作比较,2C >3C 者为字符2,反之为8。

由上述条码字符识别理论可总结出相似边距离测量法的一般步骤。

由条码宽度的计算我们得到了各个条、空的宽度(像素),并通过计算n=T /7,T =1C +2C +3C +4C 得到单位模块的宽度(像素)。

各个条空的宽度除以单位模块的宽度就是归一化的条空宽度。

而为了方便译码,我们除去起始符3个条空,中间分隔符5个条空,终止符3个条空,对剩下的48个条空每4个条空为一组进行译码。

计算相似边之间的距离1t 、2t 从而得到归一化(1T ,2T )。

最后查表可得条码字符。

为检验译码的正确性利用校验位对码字进行校验。

流程图如图1-5 和1728判别子程序流程如图1-6。

图1-5 字符判别流程图图1-6 1728判别子程序流程图三、设计步骤与结果3.1设计步骤对于一个条码图像我们先要对其进行一定的处理才能达到正确译码的目的。

而要对其进行处理,首先是要将其读入。

由于有噪声的存在,必须对其进行滤波。

也可以人为地加入一定类型的噪声仿真,然后用合适的滤波方法进行滤波,这样有助于理解各种滤波方法所针对的噪声类型。

最后就是要二值化,得到二值图像。

条码图像预处理流程图如图1-7所示。

图1-7 条码图像预处理流程图⑴ MATLAB中利用函数imread来实现图像文件的读取操作。

图1-8是首次需要处理的条码图片。

图1-8 需要处理的条码一般情况下,通过imread函数读取的大多数图像都是8位的。

当把这些图像加载到内存中时,MATLAB就将其存储在类uint8中。

此外,MATLAB还支持16位的PNG和TIFF图像。

当用户读取这类图像时,MATLAB就将其存储在类uint16中。

而对于索引图像来说,即使图像矩阵的本身为uint8或uint16,imread 函数仍将颜色映射表读取并存储在一个双精度浮点类型的矩阵中。

例如:I=imread('008.bmp');该语句可将条码图像读入内存,并以矩阵形式存储。

⑵MATLAB的图像处理工具箱提供imnoise函数,可以用该函数给图像添加不同种类的噪声。

该函数的调用格式如下:J=imnoise(I,‘type’,parameters)表1-3列出了imnoise函数能够产生的五种噪声及其对应参数。

表1-3 imnoise函数支持的噪声种类及参数说明例如:J=imnoise(I,'salt & pepper',0.01);该语句实现在条码图像I中加入椒盐噪声。

⑶条码图像被采集进入计算机,由于设备、以及传输过程中的各种因素的影响,一些噪声将会对图像的质量产生影响。

任何一幅未经处理的原始图象,都存在一定程度的噪声干扰。

不同的噪声干扰,处理方法不同。

影响条码图像质量最典型的噪声是椒盐噪声。

相关主题