条形码的识别图像处理报告.doc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 条形码 识别 图像 处理 报告
- 资源描述:
-
数字图像处理:条形码的识别 数字图像处理课程设计报告 题 目:基于数字图像处理的条形码识别 班 级: 11级信息与计算2班 学生姓名: 张 涛 学 号: 20110810010209 指导教师: 范 自 柱 分 数 : 目 录 一、设计任务及要求 3 二、设计原理及设计方案 3 2.1、条码译码原理 3 2.2条码译码方案 4 三、设计步骤与结果 10 3.1设计步骤 10 3.2结果分析 11 四、课程设计总结 15 五、心得体会 15 六、参考文献 16 附录一、源程序 17 一、 设计任务及要求 本课程设计研究的是基于数字图像处理的EAN-13条形码识别算法,通过工具平台MATLAB实现。其中图像处理部分是条码识别重要的前期工作,利用MATLAB强大的图象处理工具箱实现图像的读入、加噪仿真、滤波、二值化处理等工作,最终得到高质量的二值化图像。条码识别就是在二值图像的基础上实现,二值图像的质量直接关系到条码能否正确识读。 二、 设计原理及设计方案 2.1、条码译码原理: 如图1-1所示是EAN-13条码的一个字符。条、空宽度的定义如下:图中、、、表示每个字符中四个相邻条、空的宽度,T表示一个字符的宽度。 图1-1 EAN-13条码宽度的定义 设一个字符中单位模块的宽度为n,则单位模块的宽度: n=/7 T=+++ 由于条码条、空宽度、、、已知,设条码条、空分别占单位模块的个数为,则: =/n(其中i取1、2、3、4) 因此,由mi可知道条码的编码。例如: (1)若=2、=2、=2、=1; 条码的排列为条-空-条-空,则可知条码编码为1100110,是右侧偶性字符1; (2)若=1、=2、=1、=3; 条码的排列为空-条-空-条,则可知条码编码为0110111,是右侧奇性字符8。 2.2条码译码方案: 方案一:宽度测量法 在图像方式的译码过程中,宽度的测量不再采用传统的脉冲测量法,而是通过记录每个条或空的宽度中所含象素的个数来确定实际的条/空宽度,从而确定整个条码符号所代表的信息。 方案二:平均值法 对条码符号图像中从起始符到终止符整个宽度进行测量,然后除以95(标准宽度),求出单位模块所含的像素列宽,再分别测量各个条空的实际宽度(此宽度以单位宽度为单位计算)。 方案三:相似边距离的测量方法 这种方法的设计思路是通过对符号中相邻元素的相似边之间距离的测量来判别字符的逻辑值,而不是由各元素宽度的实际测量值来判别。 前两种方案对条码图像的要求非常高,因为它们都是测量各元素符号的实际宽度,然后根据查表法得到所代表的码值。如果实际测量值与标准值存在一点偏差,就不能实现正确译码。而第三种方案正是有效的解决了这一问题,因此本文采用相似边距离测量的方法来实现译码功能。下面就简要说明一下这一方法。 由原理知,要想辨识一个条码,必须先测量条码条、空宽度、、、以及一个字符的宽度。条码图像经过预处理后得到的是二值图像,该点的颜色信息在阈值变换时已经定义,用255和0表示白和黑色。我们从条码的左边开始取点,若遇到点的灰度值由255变到0即由点的颜色由白色变为黑色,则表示检测到条,记录下该点的坐标值,如果点的颜色由黑色变为白色,则表示检测到空,记录下该点的坐标值。这样经过扫描后得到各个颜色变化点的坐标,然后将相邻两点的横坐标相减得到各个条、空的宽度.由前面所述EAN-13条码的组成知:一个由占3个条空的起始符、3个条空的终止符、4个条空的左侧数据符、5个条空的中间分隔符、20个条空的右侧数据符、4个条空的校验符组成。所以,整个条码字符占的条空总数为59,若条码字符没有发生几何畸变,一行扫描应记录的坐标数为60个。而对于有几何畸变的条码图像,例如条码污染、条码断裂、条码瑕疵等,该扫描行的坐标数将肯定大于60或小于60,这时将不记录该扫描行,对此行不处理。这样利用图像统计方法,逐行扫描图像,获取条码图像信息,比起只由一行获取信息的方式可靠性更高,这样即使个别噪声点存在并不影响图像信息的获取。 (1)条码宽度的计算: 设条码字符颜色由黑变为白或由白变为黑(由“0”变为“1”或由“1”变为“0”)的各点坐标为、、 ……、。则一行扫描的条空宽度(像素)分别为:=-、=-、……、=-。 由上述图像条码译码理论可总结出条码条空宽度计算步骤,如图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给出了相似边之间的距离,则图中,,,,,,(归一化值)为条形码相似边距离。本文采用归一化理论,用一种相似边距离归一化的方法对字符进行判别。该方法即使条码印刷质量有偏差,仍能正确对条码进行识读。 图1-3 相似边之间的距离 图1-4 条码字符宽度示图 首先见图1-4各种宽度的定义: , , , 表示每个字符中四个相邻条、空的宽度,表示一个字符的宽度,,为相似边之间的距离,则用下列值 (i=1,2)来定义与的归一化值。 测量7个宽度值,,,,,,;然后将测量值,,,,,转换为常数值,,,,,即序列值,它代表了这些测量值的整数模块宽,以下方法用于i序列值的求取: 若1.5≦≦2.5,那么=2 若2.5≦≦3.5,那么=3 若3.5≦≦4.5,那么=4 若4.5≦≦5.5,那么=5 表1-1列出了正向译码时,EAN-13条码字符值与归一化值(,)的对应关系。 表1-1中“E”表示偶字符,“O”表示奇字符。 EAN-13码字符编码与归一化值(,)的对应关系见表1-2。 表1-1 EAN-13条码字符与归一化值 表1-2 EAN-13字符编码与归一化值 可以看到条形码编码和归一化值在多数情况下呈现一一对应的关系,只要确定了归一化值就能确定字符值,但是有四种情况例外,在表1-2中知,左侧奇字符和右侧偶字符1,7归一化值均为44,左侧奇字符和右侧偶字符2,8归一化值均为33,左侧偶字符1,7归一化值均为34,左侧偶字符2,8归一化值均为43。这两种情况可以在判别字符时根据,,,进一步判别,根据它们条空宽度特点进行判别。有1728字符标准条空宽度值的特点知:对于左侧奇字符、右侧偶字符1和7可通过与作比较,>者为字符1,反之为7;对于左侧奇字符、右侧偶字符2和8可通过与作比较,>者为字符8,反之为2;对于左侧偶字符1和7可通过与作比较,>者为字符7,反之为1;对于左侧偶字符2和8可通过与作比较,>者为字符2,反之为8。 由上述条码字符识别理论可总结出相似边距离测量法的一般步骤。由条码宽度的计算我们得到了各个条、空的宽度(像素),并通过计算n=/7,=+++得到单位模块的宽度(像素)。各个条空的宽度除以单位模块的宽度就是归一化的条空宽度。而为了方便译码,我们除去起始符3个条空,中间分隔符5个条空,终止符3个条空,对剩下的48个条空每4个条空为一组进行译码。计算相似边之间的距离、从而得到归一化(,)。最后查表可得条码字符。为检验译码的正确性利用校验位对码字进行校验。流程图如图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中加入椒盐噪声。 ⑶ 条码图像被采集进入计算机,由于设备、以及传输过程中的各种因素的影响,一些噪声将会对图像的质量产生影响。任何一幅未经处理的原始图象,都存在一定程度的噪声干扰。不同的噪声干扰,处理方法不同。影响条码图像质量最典型的噪声是椒盐噪声。椒盐噪声的特点是此干扰在图像中是以孤立点的形式存在的。 针对噪声的类型,采用中值滤波。中值滤波是一种非线性信号处理方法。可以克服线性滤波器如最小均方滤波,平均值滤波(平滑滤波)等所带来的图像细节模糊。而且对于脉冲干扰及点状噪声有良好抑制作用,能较好保持图像边缘。它可以起到既消除噪声又保持图像细节的作用。 为了达到好的滤波效果应选择合适的滤波窗口。从条码图像的特征来讨论选择采用的中值滤波窗口。条码图像的特点在于是由纵向一定宽度黑白条空组成,我们建立不同大小的模板,对含有噪声的图像进行滤波处理,比较它们滤除噪声干扰的效果。 在MATLAB中可以使用imfilter函数或filter2函数调用创建好的滤波器(可以是预定义滤波器,也可以是自定义滤波器)对图像进行滤波。 指定了一个阈值T之后,将图像中的像素与阈值作比较,如果图像中某像素的灰度值小于该阈值,则将该像素的灰度值设置为0,否则灰度值设置为255。 按下式对图像进行处理可得到二值图像g(x,y): 在MATLAB中,通过使用函数graythresh和im2bw创建一个新的二值图像bw: level=graythresh(L); bw=im2bw(L,level); 根据上述译码理论,采用相似边距离测量方法对图1-8预处理后的条码图像(二值图像)进行译码,得到如下所示译码结果: 图1-9是第二张需要处理的条码图片。 图1-9 需要处理的条码 根据条码图像预处理的理论知识编译相关的MATLAB程序,得到如图1-10所示的图像预处理结果。 图1-10 条码图像预处理 得到如下所示译码结果: 3.2结果分析 误码率方面,一般情况下条码都能够正确识读。但在由一个字符的归一化的相似边距离、转换为序列值、时,如果、的值为2.5、3.5、4.5之一,系统将不能正确的将其转换为序列值,此时存在最大的误码率,条码几乎不能被正确识读。所以应该尽量避免此种情况的发生,这就要求我们做好图像的预处理工作,防止条码线条过度展宽或细化。 需要指出的是,在实际的译码中还存在着正向译码和反向译码的情况,两种情况下字符编码对应着不同的归一化值。因此译码前需要判别译码方向。本设计直接采用正向译码。最后,译码是编码的反过程,编码技术的熟练掌握对译码工作有着事半功倍的效果。 四、 课程设计总结 通过多次对不同EAN-13条码的识读,证明该条码检测系统速度快、效率高、而误码率却很低,即使在图像预处理上达不到理想的效果,条码仍能正确识读。这是因为我们选择了相似边距离测量的方法。可见,影响条码识别效果的不仅仅是条码图像预处理效果,译码方法更是不可忽视的重要原因。相似边距离测量方法有着其它译码方法无可比拟的优势,它不是根据条码条空宽度的实际值来判别,而是通过所谓的相似边距离来判别。因此,即使条码质量存在欠缺,仍然能够根据相似边距离正确解释条码,有着很强的对实际情况的适应性。 五、 心得体会 在对条码图像作相应的图像预处理之后,对得到的二值条码图像利用上述条码识别算法在MATLAB软件环境下编写了相应的软件程序。通过实验,识别效果不错,误码率低,提高了条码的识别率。本次设计在译码方法上进行了比较选择,确定了相似边距离的测量方法的优越性。这种方法的设计思路是通过对符号中相邻元素的相似边之间距离的测量来判别字符的逻辑值。另外用软件实现条码的识别比硬件具有更好的抗噪声性能,且速度快,效率高。 许多程序都是从网上找到进行改编和变化,由于自己水平不高,只能请大神来修改,改了之后发现自己的水平完全看不懂,只能自己慢慢看了。 在设计中,由于本人在图像处理上的造诣不高,对很多细节、常识方面了解不够导致问题的出现,而且没能采取科学的方法进行错误分析、排查,使得问题小却难以解决。今后在做类似的工作的时候要注重基础知识的学习,并讲究科学的方法。以后的工作和学习中一定打牢基础,再进行处理和设计。 六、 参考文献 [1] 邹永星.条码国家标准汇编[M].北京.中国标准出版社.2004:12-21 [2] 中国自动识别技术协会.条码技术基础[M] .武汉.武汉大学出版社.2008:15-16 [3] 黄红, 黄才骏.条码的奥秘[M]. 北京.中国铁道出版社.2000:69-72 [4] 王雅静.EAN-13 条码图像辨识方法的研究[D].青岛.山东科技大学.2003 [5] 唐莉,刘富强.条码国家标准汇编[M].北京.中国标准出版社.2004:11-25 [6] 百度文库 [7 薛红.条码技术及商业自动化系统-条码技术[M] .北京.中国轻工业出版社.2008:67-69 附录一、源程序 %function code = barcode(pic) %条形码识别 close all 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('123.bmp'); %读输入条形码图片 bar_Gray = rgb2gray(bar); %将RGB图片转换灰度图 figure(1) imshow(bar) title('条形码图') figure(2) subplot(121),imshow(bar_Gray),title('灰度图') subplot(122),imhist(bar_Gray),title('灰度图直方图') bar_Gray= imnoise(bar_Gray, 'salt & pepper', 0.02); figure(3) subplot(121); imshow(bar); title('原图像'); subplot(122); imshow(bar_Gray); title('添加椒盐噪声图像'); bar_Gray = medfilt2(bar_Gray); %进行3*3模板中值滤波 figure(4) imshow(bar_Gray) title('中值滤波之后图片') %for i=1:m %对图像进行二值化处理 %for j=1:n % if bar_Gray(i,j)>150 %选择适当的阈值进行二值化处理 % bar_10(i,j) = 1; %else % bar_10(i,j) = 0; %end %end %end [a_hist x] = imhist(bar_Gray); hist_max = []; if a_hist(1)>a_hist(2) hist_max = [hist_max 1]; end x = max(x); for i=2:x if a_hist(i)>a_hist(i-1) && a_hist(i)>a_hist(i+1) hist_max = [hist_max i]; end end if a_hist(x)<a_hist(x+1) hist_max = [hist_max x+1]; end [m,n] = size(hist_max); k = 0; max_1 = 0; max_2 = 0; for i=1:n if k<a_hist(hist_max(i)) k = a_hist(hist_max(i)); max_1 = hist_max(i); end end temp = a_hist(max_1); a_hist(max_1) = 0; k = 0; for i=1:n if k<a_hist(hist_max(i)) k = a_hist(hist_max(i)); max_2 = hist_max(i); end end a_hist(max_1) = temp; if max_1>max_2 k = max_1; max_1 = max_2; max_2 = k; end T = max_1; k = a_hist(max_1); for i=max_1:max_2 if k>a_hist(i) k = a_hist(i); T = i; end end [m,n] = size(bar_Gray); %求灰度图的大小 for i=1:m %对图像进行二值化处理 for j=1:n if bar_Gray(i,j)>T %选择适当的阈值进行二值化处理 bar_10(i,j) = 1; else bar_10(i,j) = 0; end end end figure(5) imshow(bar_10); title('二值化图') l = 0; %检测59根条形码 for i=1:m k = 1; l = l+1; for j=1:n-1 if bar_10(i,j)~=bar_10(i,j+1) %比较同一行相邻两点的颜色是否一致 %bar_x(l,k) = i; bar_y(l,k) = j; %记录转折点的纵坐标 k = k+1; %准备记录下一个数据点 end if k>61 %点数大于60,该行应该删掉 l = l-1; break end end if k<61 %点数小于60,该行应该删掉 l = l-1; end end [m,n] = size(bar_y); if m<=1 %查看条形码是否有效 code = '0'; fprintf(1,'GameOver!\n'); return end for i=1:m %计算每根条形码的宽度 for j=1:n-1 bar_num(i,j) = bar_y(i,j+1) - bar_y(i,j); if bar_num(i,j)<0 bar_num(i,j) = 0; end end end bar_sum = sum(bar_num)/m; %求每根条形码宽度的平均值 k = 0; for i=1:59 %计算59根条形码的总宽度 k = k + bar_sum(i); end k = k/95; %计算单位条形码的宽度 for i=1:59 %计算每根条形码所占位数 bar_int(i) = round(bar_sum(i)/k); end k = 1; for i=1:59 %将条形码转换成二进制数 if rem(i,2) for j=1:bar_int(i) %黑色条用1表示 bar_01(k) = 1; k = k+1; end else for j=1:bar_int(i) %白色条用0表示 bar_01(k) = 0; k = k+1; end end end if ((bar_01(1)&&~bar_01(2)&&bar_01(3))... %判断起始符是否正确 &&(~bar_01(46)&&bar_01(47)&&~bar_01(48)&&bar_01(49)&&~bar_01(50))... %判断中间分隔符是否正确 &&(bar_01(95)&&~bar_01(94)&&bar_01(93))) %判断终止符是否正确 l = 1; for i=1:6 %将左侧42位二进制数转换为十进制数 bar_left(l) = 0; for k=1:7 bar_left(l) = bar_left(l)+bar_01(7*(i-1)+k+3)*(2^(7-k)); end l = l+1; end l = 1; for i=1:6 %将右侧42位二进制数转换为十进制数 bar_right(l) = 0; for k=1:7 bar_right(l) = bar_right(l)+bar_01(7*(i+6)+k+1)*(2^(7-k)); k = k-1; end l = l+1; end end num_bar = ''; num_first = 0; first = 2; for i=1:6 %从左边数据编码表中查出条形码编码数字 for j=0:1 for k=0:9 if bar_left(i)==check_left(j+1,k+1) num_bar = strcat(num_bar , num2str(k)); switch first %记录左边数据的奇偶顺序 case 2 first = j; break; case 1 num_first = num_first + j*(2^(6-i)); break; case 0 num_first = num_first + ~j*(2^(6-i)); break; otherwise break; end end end end end for i=1:6 %从右边数据编码表中查出条形码编码数字 for j=0:9 if bar_right(i)==check_right(j+1) num_bar = strcat(num_bar , num2str(j)); end end end for i=0:9 %从第一位数据编码表中查出第一位数字 if num_first==first_num(i+1) num_bar = strcat(num2str(i) , num_bar); break; end end if numel(num_bar)~=13 fprintf(1,'Please Turn It Around!\n'); return end check_code = 0; for i=1:12 %计算校验码 if rem(i,2) check_code = check_code + str2num(num_bar(i)); else check_code = check_code + str2num(num_bar(i))*3; end end check_code = rem(check_code,10); if check_code>0 check_code = 10 - check_code; end if check_code==str2num(num_bar(13)) %判断校验码是否正确 disp('识别出的条形码:') code = num_bar else fprintf(1,'Please Turn It Around!\n'); return end 24展开阅读全文
咨信网温馨提示:1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。




条形码的识别图像处理报告.doc



实名认证













自信AI助手
















微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/12072908.html