条形码识别.docx
《条形码识别.docx》由会员分享,可在线阅读,更多相关《条形码识别.docx(25页珍藏版)》请在冰豆网上搜索。
条形码识别
HEFEIUNIVERSITY
系另H电子信息与电气工程系
专业电气信息类
班级电子
(2)班
完成时间2012-11-04
姓名学号周峰0905073012
基于MATLA啲一维条码识别
摘要:
条码技术是如今应用最广泛的识别和输入技术之一,由于其包含的信息量
大,识别错误率低而在各个方面得到很大的重视。
它发展迅速并被广泛应用于于工业、商业、
图书出版、医疗卫生等各行各业。
由我国目前发展现状来看,条码的正常使用受到条形码印
刷质量和商品运输过程的影响,并且传统的条码识读方式是采用光电识读器,条码图像对光
的不同反射效果也必然会对条码的识读产生影响,而一般条码在搬运过程中条码会不可避免
的破损,所以对质量较差的条码的条码的识别尤为重要。
不同的条码有着不同的识读过程。
本设计研究一种基于图像处理方式的识读方法,通
过一定的数字图像处理算法处理进行译码。
译码算法主要分为两部分:
第一部分首先对采集
的条码图像进行预处理,图像的预处理包括图像分割,图像滤波等,良好的图像处理将对后
面实现正确译码有重大贡献;第二部分就是对预处理后的条码图像进行译码,我们根据相似
边距离来判别条码字符,再通过译码、校验、纠错处理来识读条码,得到条码所表示的文本
信息。
借助于Matlab软件的功能我们完成这次译码工作。
关键词:
图像处理条形码识别EAN-13图像滤波Matlab
1.1条码技术概述
条码技术是在计算机的应用实践中产生和发展起来的一种自动识别技术,条码应用技术就是应用条码系统进行的信息处理技术。
条码技术的研究始于20世纪中期,是继计算机
技术应用和发展应运而生的。
通俗的说条形码是指在浅色衬底上印有深色矩形的线条(也称条码)排列而成的编码,其
码条和空白条的数量和宽度按一定的规则(标准)排列。
条形码是由一组规则排列的条、空、
相应的数字组成。
这种用条、空组成的数据编码可以供机器识读,而且很容易译成二进制数
和十进制数。
这些条和空可以有各种不同的组合方法,构成不同的图形符号,即各种符号体
系,适用于不同的应用场合。
条形码是迄今为止最经济、实用的一种自动识别技术。
1.2Matlab应用图像处理
Matlab图像处理工具是由MathWorks公司推出的用于数值计算的有力工具,它具有相当强大的矩阵运算和操作功能,力求人们摆脱繁杂的程序代码。
Matlab图像处理工具箱提
供了丰富的图像处理函数,灵活运用这些函数可以完成大部分图像处理工作。
图像处理工具
包是由一系列支持图像处理操作的函数组成的。
所支持的图像处理操作有:
图像的几何操作、
邻域和区域操作、图像变换、图像恢复与增强、线性滤波和滤波器设计、变换(DCT变换等)、
图像分析和统计、二值图像操作等。
下面就MATLAB在图像处理中各方面的应用分别进行介
绍。
主要包括下面几方面:
(1)图像文件格式的读写和显示。
MATLAB提供了图像文件读入函数imread(),用来读取
如:
bmp,tif、tiff、pcx、jpg、gpeg、hdf、xwd等格式图像文;图像写出函数imwrite(),还有图像显示函数image()、imshow()等等。
(2)图像处理的基本运算。
MATLAB提供了图像的和、差等线性运算,以及卷积、相关、滤
波等非线性算。
例如,conv2(I,J)实现了I,J两幅图像的卷积。
⑶图像变换。
MATLAB提供了一维和二维离散傅立叶变换(DFT)、快速傅立叶变换(FFT)、
离散余弦变换(DCT),以及连续小波变换(CWT卜离散小波变换(DWT)及其反变换。
二、一维条码技术
2.1一维条码符号的结构
通常任何一个完整的条码是由两侧空白区、起始符、数据字符、校验符、终止符组成,以一维条码而言,其排列方式通常如表2-1所示:
表2-1条码符号结构
空白区
起始宇符
數据字符
校骋字符
终止字符
空白区
图2-1条码符号
1、空白区
位于条码两侧无任何符号及资讯的白色区域,主要用来提示扫瞄器准备扫瞄。
2、起始符
指条码符号的第一位字码,用来标识一个条码符号的开始,扫瞄器确认此字码存在后开
始处理扫瞄脉冲。
3、数据符
位于起始字符后面的字码,用来标识一个条码符号的具体数值,允许双向扫瞄。
4、校验符
用来判定此次阅读是否有效的字码,通常是一种算术运算的结果,扫瞄器读入条码进行
解码时,先对读入各字码进行运算,如运算结果与检查码相同,则判定此次阅读有效。
2.2EAN码简述
EAN码的全名为欧洲商品条码(EuropeanArticleNumber),源于公元1977年,由欧洲十二个工业国家所共同发展出来的一种条码。
目前已成为一种国际性的条码系统。
EAN条码
系统的管理是由国际商品条码总会(InternationalArticleNumberingAssociation)负责
各会员国的国家代表号码之分配与授权,再由各会员国的商品条码专责机构,对其国内的制造商、批发商、零售商等授予厂商代表号码。
目前已有30多个国家加盟EANEAN码由前
缀码、厂商识别码、商品项目代码和校验码组成。
2.3EAN-13码符号的特征
(1)条码符号的整体形状为矩形。
由一系列互相平行的条和空组成,四周都留有空白区。
(2)条空分别由1-4个同一宽度的的深或浅颜色的模块组成。
深色模块用“1”表示,浅色模块用“0”表示。
(3)在条码符号中,表示数字的每个条码字符仅由两个条和两个空组成,共7个模块。
(4)除了表示数字的条码字符外,还有一些辅助条码字符,用作表示起始、终止的分界符和平分条码符号的中间分隔符。
(5)条码符号的大小可在放大系数的两个极限值所决定的尺寸之间变化,以适应不同印刷工艺的需求及用户对印刷面积的要求。
2.3.1EAN-13码字符集
EAN-13条码字符集包括10个数字字符,即0-9。
在条码符号中,每个数字
字符由七个模块的二进制表示,其表示形式见条码字符集中的A,B,C三个子集
表2-2条码字符集
数字字符
ret集
C子集
0
0001101
0100111
1110010
1
0011001
0110011
1100110
2
0010011
0011011
1101100
3
0111101
0100001
1000010
4
0100011
0011101
1011100
5
0110001
0111001
1001110
&
01O1O00
0000101
1O10OO0
7
0111011
0010001
1000100
8
0110111
0001001
1001000
9
0001011
00101IX
1H0100
A子集中条码字符所包含的深色模块的个数为奇数,称为奇排列。
B、C子集中条码字符
所包含的深色模块的个数为偶数,称为偶排列。
2.3.2EAN-13码符号结构
EAN-13条码符号是由左侧空白区、起始符、左侧数据符、中间分隔符、右侧
数据符、校验符及右侧空白区构成,如图2-4所示
图2-4EAN-13条码符号结构
左侧中间右侧
数据氏分隔符数据区校验符缰止符
I,II,IZ
_[-\FI1
95+13模块
95模块
左
起
左侧
中
右侧
校验
蜒
右
侧
始
数据
间
数据
符1
止
侧
空
符
符6
分
符5
位数
符
空
白
位數
隔
位数
宇
白
宇
符
宇
图2-5EAN-13条码符号构成示意图
左侧空白区:
位于条码符号起始符左侧,无印刷符号且与空的颜色相同的区域。
其最小
宽度为11个模块宽。
起始符:
位于条码符号左侧,表示信息开始的特殊符号,由3个模块组成。
左侧数据符:
介于起始符和中间分隔符之间的表示信息的一组条码字符。
表示前缀码(不
包含前置码)和厂商代码,共6位数字。
条码字符按A子集或B子集的形式构成。
左侧数据符由42个模块组成。
中间分隔符:
位于条码符号的中间位置,是平分条码符号的特殊符号,由5个模块组成。
右侧数据符:
中间分隔符右侧的一组选自C子集的条码字符,表示5位商品代码,又
35个模块组成。
校验符:
最后一个条码字符,选自C子集,由7个模块组成,表示一个校验字符。
终止符:
位于条码符号右侧,表示信息结束的特殊符号,由3个模块组成。
右侧空白区:
在终止符之外的无印刷符号且与空的颜色相同的区域,其最小宽度为7
个模块。
三、条码图像的预处理
3.1灰度处理及二值化
Matlab能够处理的四种类型图像:
1)索引图像
索引图像包括图像矩阵与颜色图数组,其中,颜色图是按图像中颜色值进行排序后的数
组。
对于每个像素,图像矩阵包含一个值,这个值就是颜色图中的索引。
颜色图为m*3双精
度值矩阵,各行分别指定红绿蓝(RGB单色值。
2)灰度图像
在MATLAB^,灰度图像是保存在一个矩阵中的,矩阵中的每一个元素代表一个像素点。
矩阵可以是双精度类型,其值域为[0,1];也可以为uint8类型,其数据范围为[0,255]。
矩阵的每个元素代表不同的亮度或灰度级。
3)二进制图像,
每个点为两离散值中的一个,这两个值代表开或关。
二进制图像保存在一个由二维的由
0(关)和1(开)组成的矩阵中。
从另一个角度讲,二进制图像可以看成为一个仅包括黑与白的灰度图像,也可以看作只有两种颜色的索引图像。
4)RGB图像
与索引图像一样,RGB!
像分别用红,绿,蓝三个亮度值为一组,代表每个像素的颜色。
与索引图像不同的是,这些亮度值直接存在图像数组中,而不是存放在颜色图中。
图像数组
为M*N*3,MN表示图像像素的行列数。
对图像进行灰度处理,为实现数字的阈值变换提供前提条件,要将256色位图转变为
灰度图,首先必须计算每种原色对应的灰度值,灰度与RGB颜色的对应关系
Y=0.299R+0.587G+0.114B
将调色板转换成灰度调色板。
实现的指令:
y=rgb2gray(l)。
为了对图像进行后续处理,需要对图像进行二值化处理,二值化是图像分割技术中的区域分割技术,它是区域分割中最基本也是最常用的手段,使用阈值将背景与图像分割出来,
也称阈值分割。
3.2图像的滤波
3.2.1图像的平滑滤波
中值滤波器是一种最常用的非线性平滑滤波器,其滤波原理与均值滤波器方法类似,二
者不同是在于中值滤波器的输出像素是由领域像素值是由领域的中间值决定的而不是平均
值决定的,中值对极限像素值远不如平均值那么敏感,所以中值滤波器产生的模糊较少,更
适合消除孤立噪声点。
它在平滑脉冲噪声方面非常有效,同时它可以保护图像尖锐的边缘。
加权中值滤波能够改进中值滤波的边缘信号保持效果。
但对方向性很强的指纹图像进行滤波
处理时,有必要引入方向信息,即利用指纹方向图来指导中值滤波的进行。
中值滤波器的优点是:
它可以克服线性滤波器(如均值滤波)给图像带来的模糊,做到在有效地清除脉冲噪声的同时,又保持良好的边缘特性,从而获得较满意的复原效果。
根据上述条码图像预处理的理论知识编译相关的Matlab程序,得到如图3-3.2所示图
像预处理结果。
3-3.2图像处理的结杲
四、条码的译码方法及基本原理
4.1译码方案的选择
我们所采用的是:
相似边距离的测量方法,这种方法的设计思路是通过对符号中相邻元素的相似边之间距离的测量来判别字符的逻辑值,而不是由各元素宽度的实际测量值来判别。
由原理知,要想辨识一个条码,必须先测量条码条、空宽度C1、C2、C3C4以及一个
字符的宽度T。
条码图像经过预处理后得到的是二值图像,该点的颜色信息在阈值变换时已经定义,用255和0表示白和黑色。
我们从条码的左边开始取点,若遇到点的灰度值由255
变到0即由点的颜色由白色变为黑色,则表示检测到条,记录下该点的坐标值,如果点的颜
色由黑色变为白色,则表示检测到空,记录下该点的坐标值。
这样经过扫描后得到各个颜色
变化点的坐标,然后将相邻两点的横坐标相减得到各个条、空的宽度•由前面所述EAN-13
条码的组成知:
一个由占3个条空的起始符、3个条空的终止符、24个条空的左侧数据符、5个条空的中间分隔符、20个条空的右侧数据符、4个条空的校验符组成。
所以,整个条码字
符占的条空总数为59,若条码字符没有发生几何畸变,一行扫描应记录的坐标数为60个;
而对于有几何畸变的条码图像,例如条码污染、条码断裂、条码瑕疵等,该扫描行的坐标数
将肯定大于60或小于60,这时将不记录该扫描行,对此行不处理。
这样利用图像统计方法,逐行扫描图像,获取条码图像信息,比起只由一行获取信息的方式可靠性更高,这样即使个
别噪声点存在并不影响图像信息的获取。
4.2条码字符的判别
如图4-4所示是EAN-13条码的一个字符。
条、空宽度的定义如下:
图中C1、C2、C3
C4表示每个字符中四个相邻条、空的宽度,T表示一个字符的宽度。
当前宇符下一字符
一C1――C2-一阳+
图4-4EAN-13条码宽度的定义
设一个字符中单位模块的宽度为n,则单位模块的宽度:
n=T/7
T=C1+C2+C3+C4
由于条码条、空宽度C1、C2C3、C4已知,设条码条、空分别占单位模块的个数为mi,
则:
mi=ci/n(其中i取1、2、3、4)。
因此,由mi可知道条码的编码。
例如:
4.3EAN-13的译码原理分析
要辨别一个条码,必须知道条码的码,空间隔C1,C2,C3,C4和一个字符的宽度T.图像
经过分割,灰度,二值化处理后得到就是关于条码的二值图像,把图像看作一个二维矩阵,矩阵中的点就是0和255表示白与黑。
我们进行列扫描,对于每一列如果有大于大于二分之一行是0的话,判定这一列是0。
最后我们得到的是一个一维矩阵,从而由这个一维矩阵,来做字符识别。
我们检测这个一维矩阵,若遇到矩阵由0变到255,或是由255变到0,的
话,记录下坐标值。
然后由坐标值相减得到条空的宽度。
由前面的EAN-13条码组成可知:
一个条码由3个条空起始符,3个条空终止符,24个条空左侧数据区,5个条空的中间分隔符,20个右侧数据符,4个条空的校验码,所以扫描的坐标应该为60个,整个条空总数为
59。
字符判别流程图:
扫描识别的流程图如下:
经处理后的二值化图像
]—
扫描一列,是否有大于1/2行是0
-NYpi
这列为1这列为0
得到一个一维矩阵
扫描突变点坐标,并记录
坐标相减,得到条空宽度C1……C59
±
t~\
结束
图5-1条码扫描的流程图
4.4译码的结果分析
根据上述译码理论,采用相似边距离测量方法对预处理后的条码图像(二值图像)进行译码,得到如下所示译码结果:
=
L!
M5N«12E
复砒川啡h门SJeicenitionC'!
Ju;,jiii'l机-IH1-5T
叽您團tttl*刪舟汕二珂]
-V-11-llrJ"I
-1-IHIT¥和:
IMT
分析:
通过多次对不同EAN-13条码的识读,证明该条码检测系统速度快、效率高、而
误码率却很低,即使在图像预处理上达不到理想的效果,条码仍能正确识读。
这是因为我们
选择了相似边距离测量的方法。
可见,影响条码识别效果的不仅仅是条码图像预处理效果,译码方法更是不可忽视的重要原因。
相似边距离测量方法有着其它译码方法无可比拟的优势,它不是根据条码条空宽度的实际值来判别,而是通过所谓的相似边距离来判别。
因此,即使条码质量存在欠缺,仍然能够根据相似边距离正确解释条码,有着很强的对实际情况的
适应性。
六、结论
在对条码图像作相应的图像预处理之后,对得到的二值条码图像利用上述条码识别算法
在Matlab软件环境下编写了相应的软件程序。
通过多次实验,识别效果很好,误码率低,大大提高了条码的识别率。
相信对其它一维条码图像识别具有一定的理论及实践参考价值。
本次设计在译码方法上进行了比较选择,确定了相似边距离的测量方法的优越性。
这种方法的设计思路是通过对符号中相邻元素的相似边之间距离的测量来判别字符的逻辑值,而不是由各元素宽度的实际测量来判别。
对条码图像的要求相对其它方法而言较低,具有较
高的识别率,因而能够很好的满足实际需要。
同时用软件实现条码的识别比硬件具有更好的
抗噪声性能,且速度快,效率高。
尽管如此,设计中也遇到了很多的问题有待进一步的解决和探索研究。
图像处理是条码识别的重要基础。
本设计只是对质量较好的条码图像进行一般性处理,但实际中的图像并
都不是这么理想,例如条码污染、条码断裂、条码瑕疵等。
这些需要进行特殊的图像处理过
程才能达到译码的目的。
如果条码被污染了我们要进行修复,条码发生几何畸变我们要进行
图像矫正等等。
只有考虑到更多的方面才能提高系统的性能和适应性,对一定质量范围内的
条码图像都能进行有效的处理。
其次,对软件程序的精简也是我所追求的,希望通过最精练
的语句实现所需要的功能。
程序中很多的语句还有进一步改进的空间,这样既能精简语句,使语句简明易懂,也能提高程序整体的执行速度,提高条码识别效率。
附录:
源程序
closeall
I=imread('019.bmp');
J=rgb2gray(l);
figure
(1)
imshow(J);
title('灰度化图像');
[e1,e2]=size(J);
lm=imcrop(J,[e2/2-200,e1/2-200,400,400])figure
(2)
subplot(1,2,1),imshow(Im)
title('中心区域');subplot(1,2,2),imhist(Im)title('中心区域直方图');
[xa,ya]=size(lm);
b=double(Im);
zd=double(max(Im))zx=double(min(lm))T=double((zd+zx))/2;
count=double(0);
while1
count=count+1;
S0=0.0;n0=0.0;
S1=0.0;n1=0.0;
fori=1:
xa
forj=1:
ya
ifdouble(lm(i,j))>=T
S仁S1+double(Im(i,j));n仁n1+1;
else
S0=S0+double(Im(i,j));nO=n0+1;
end
end
end
T0=S0/n0;
T仁S1/n1;
ifabs(T-((T0+T1)/2))<0.1
break;
else
T=(T0+T1)/2;
end
end
count
T
K=find(JJ(K)=0;
K=find(J>=T);
J(K)=255;
figure(3)
imshow(J)
title('图像二值化');
B=medfilt2(J,[5,1]);
figure(4)
imshow(B)
title('中值滤波后图像');
[yO,xO]=size(B);
BW=edge(B,'log');
figure(5);imshow(BW);title('边缘检测图像')
%functioncode=barcode(pic)%条形码识别
check_left=[13,25,19,61,35,49,47,59,55,11;…%左边数据编码,奇
39,51,27,33,29,57,5,17,9,23];%左边数据编码,偶
check_right=[114,102,108,66,92,78,80,68,72,116];%右边数据编码
first_num=[31,20,18,17,12,6,3,10,9,5];%第一位数据编码
bar=imread('019.bmp');%读输入条形码图片
bar_Gray=rgb2gray(bar);%将RGB图片转换灰度图[a_histx]=imhist(bar_Gray);
hist_max=[];
ifa_hist
(1)>a_hist
(2)
hist_max=[hist_max1];
end
x=max(x);
fori=2:
x
ifa_hist(i)>a_hist(i-1)&&a_hist(i)>a_hist(i+1)
hist_max=[hist_maxi];
end
end
ifa_hist(x)hist_max=[hist_maxx+1];
end
[m,n]=size(hist_max);
k=0;
max_1=0;
max_2=0;
fori=1:
n
ifkk=a_hist(hist_max(i));
max_1=hist_max(i);
end
end
temp=a_hist(max_1);
a_hist(max_1)=0;
k=0;
fori=1:
n
ifkk=a_hist(hist_max(i));max_2=hist_max(i);
end
end
a_hist(max_1)=temp;
ifmax_1>max_2
k=max_1;
max_1=max_2;
max_2=k;
end
T=max_1;
k=a_hist(max_1);
fori=max_1:
max_2
ifk>a_hist(i)
k=a_hist(i);
T=i;
end
end
[m,n]=size(bar_Gray);%求灰度图的大小
fori=1:
m%对图像进行二值化处理
forj=1:
n
ifbar_Gray(i,j)>T%选择适当的阈值进行二值化处理
bar_10(i,j)=1;
else
bar_10(i,j)=0;
end
end
end
%imshow(bar_10);
l=0;%检测59根条形码
fori=1:
m
k=1;
l=1+1;
forj=1:
n-1
ifbar_10(i,j)~=bar_10(i,j+1)%比较同一行相邻两点的颜色是否一致
%bar_x(l,k)=i;
bar_y(l,k)=j;%记录转折点的纵坐标
k=k+1;%准备记录下一个数据点
ifk>61%点数大于60,该行应该删掉
l=1-1;
break
end
end
ifk<61%点数小于60,该行应该删掉
l=l-1;
end
end
[m,n]=size(bar