一、课题介绍

本设计研究的是基于数字图像处理的EAN-13条形码识别算法,通过工具平台MATLAB实现。其中图像处理部分是条码识别重要的前期工作,利用MATLAB强大的图象处理工具箱实现图像的读入、加噪仿真、滤波、二值化处理等工作,最终得到高质量的二值化图像。条码识别就是在二值图像的基础上实现,二值图像的质量直接关系到条码能否正确识读。

二、设计原理及设计方案

2.1、条码译码原理:

如图1-1所示是EAN-13条码的一个字符。条、空宽度的定义如下:图中表示每个字符中四个相邻条、空的宽度,T表示一个字符的宽度。

设一个字符中单位模块的宽度为n,则单位模块的宽度:

2.2条码译码方案:

方案一:宽度测量法

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

方案二:平均值法

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

方案三:相似边距离的测量方法

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

前两种方案对条码图像的要求非常高,因为它们都是测量各元素符号的实际宽度,然后根据查表法得到所代表的码值。如果实际测量值与标准值存在一点偏差,就不能实现正确译码。而第三种方案正是有效的解决了这一问题,因此本文采用相似边距离测量的方法来实现译码功能。下面就简要说明一下这一方法。

由原理知,要想辨识一个条码,必须先测量条码条、空宽度。条码图像经过预处理后得到的是二值图像,该点的颜色信息在阈值变换时已经定义,用255和0表示白和黑色。我们从条码的左边开始取点,若遇到点的灰度值由255变到0即由点的颜色由白色变为黑色,则表示检测到条,记录下该点的坐标值,如果点的颜色由黑色变为白色,则表示检测到空,记录下该点的坐标值。这样经过扫描后得到各个颜色变化点的坐标,然后将相邻两点的横坐标相减得到各个条、空的宽度.由前面所述EAN-13条码的组成知:一个由占3个条空的起始符、3个条空的终止符、4个条空的左侧数据符、5个条空的中间分隔符、20个条空的右侧数据符、4个条空的校验符组成。所以,整个条码字符占的条空总数为59,若条码字符没有发生几何畸变,一行扫描应记录的坐标数为60个。而对于有几何畸变的条码图像,例如条码污染、条码断裂、条码瑕疵等,该扫描行的坐标数将肯定大于60或小于60,这时将不记录该扫描行,对此行不处理。这样利用图像统计方法,逐行扫描图像,获取条码图像信息,比起只由一行获取信息的方式可靠性更高,这样即使个别噪声点存在并不影响图像信息的获取。

(1)条码宽度的计算:

由上述图像条码译码理论可总结出条码条空宽度计算步骤,如图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-2中知,左侧奇字符和右侧偶字符1,7归一化值均为44,左侧奇字符和右侧偶字符2,8归一化值均为33,左侧偶字符1,7归一化值均为34,左侧偶字符2,8归一化值均为43。

三、设计步骤与结果

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结果分析

基于MATLAB的条形码二维码识别系统相关推荐

  1. 基于MATLAB的条码二维码识别系统

    基于MATLAB的条码二维码识别系统 课题介绍 本设计研究的是基于数字图像处理的EAN-13条形码识别算法,通过工具平台MATLAB实现.其中图像处理部分是条码识别重要的前期工作,利用MATLAB强大 ...

  2. 基于主要成分分析的人脸二维码识别系统-含Matlab代码

    目录 一.引言 二.人脸图像信息处理 2.1 主成分分析PCA 2.2 PCA人脸压缩与重构算法分析 三.二维码转换以及识别 3.1 QR码 3.2 将人脸图像生成二维码 3.3 二维码的识别与图像还 ...

  3. 【第 07 章 基于主成分分析的人脸二维码识别MATLAB深度学习实战案例】

    基于主成分分析的人脸二维码识别MATLAB深度学习实战案例 人脸库 全套文件资料目录下载链接–>传送门 本文全文源码下载[链接–>传送门] 如下分析: 主文件 function varar ...

  4. 基于Android的二维码识别系统的研究与实现(eclipse开发)

    目 录 1 Android系统开发背景与意义 1 1.1 Android系统平台的出现 1 1.2 Android系统的发展 1 1.3 Android系统架构的介绍 1 1.4 Android开放系 ...

  5. 条码条形码二维码检错系统供应

     条码条形码二维码检错系统可防止因人为误操作.设备损坏等原因导致的错误,减少产品的退货返工,避免客户的投诉,提高工作效率.减少人力成本.适用于各种需要对条码进行检查的场合,如标签打印检查.装箱前对箱型 ...

  6. 基于springboot的食品二维码溯源系统

    1 简介 今天向大家介绍一个帮助往届学生完成的毕业设计项目,基于springboot的食品二维码溯源系统. 计算机毕业生设计,课程设计需要帮助的可以找我 2 设计概要 21世纪是信息化时代,随着信息技 ...

  7. python zxing 识别条码_Python zxing 库解析(条形码二维码识别)

    各种扫码软件 最近要做个二维码识别的项目,查到二维码识别有好多开源的不开源的软件 Zbar 首先试了一下Zbar,python加载ZBar时各种报错.可能的原因是zbar的dll文件是32位的,而我系 ...

  8. python发票二维码条码识别_Python zxing 库解析(条形码二维码识别)

    各种扫码软件 最近要做个二维码识别的项目,查到二维码识别有好多开源的不开源的软件 http://www.oschina.net/project/tag/238/ Zbar 首先试了一下Zbar,pyt ...

  9. Opencv+Zbar二维码识别(标准条形码/二维码识别)

    使用Opencv+Zbar组合可以很容易的识别图片中的二维码,特别是标准的二维码,这里标准指的是二维码成像清晰,图片中二维码的空间占比在40%~100%之间,这样标准的图片,Zbar识别起来很容易,不 ...

最新文章

  1. Java中的回调函数学习-深入浅出
  2. 新松机器人BG总裁高峰_新松与民航物流公司签署战略合作协议
  3. 用最简单的例子理解策略模式(Strategy Pattern)
  4. 深入 理解 Statement 和 PreparedStatement 【转】
  5. css相关笔记(五)
  6. hadoop练习处理地震数据
  7. 内向的人这样改善人际关系(四)
  8. 实现一个基于Vue的Button小组件
  9. 中国第一代程序员简史:中国龙简晶的程序人生
  10. 配置hadoop 使用fair scheduler调度器
  11. 班级抽签小程序——项目总结
  12. linux 安装 maven
  13. send()、sendto()和recv()、recvfrom()的使用
  14. 不同shp图层合在一起_ps怎么把别的图层的合到一起
  15. TIA博途_数据的保持型与初始化的具体方法和相关问题汇总
  16. python监控端口_python监控设备端口示例
  17. c/c++中 运算符 左结合与右结合
  18. [project X] tiny210(s5pv210)上电启动流程(BL0-BL2)
  19. 居家洁士扫地机器人_如何避免买到“智障”扫地机器人,看这篇
  20. Shell命令初步了解

热门文章

  1. html重置按钮代码用法,HTML Input Reset value用法及代码示例
  2. c 语言 常用语句,c语言六种基本语句是什么
  3. node.js 沙盒逃逸分析
  4. 深度linux_工程师深度:学通Linux内核(含详细代码)
  5. 手写坦克大战联网版(持续更新)
  6. 5款linux下的笔记软件
  7. c语言鸡兔同笼的实训报告的目的,车床实训报告实习目的
  8. .dll 文件编写和使用
  9. QT学习杂项(1)--在connet函数里使用自定义类型
  10. Linux vi简介以及命令