⛄一、二维条形码识别简介

采用数字图像处理技术对二维条码进行识别, 是二维条形码识别中较常用的方法, 它在处理污损的条形码方面有光电识别方法无法比拟的优势。另外图像式识别方法对识别角度的要求没有光电识别方法那么严格, 对有些二维条形码 (如QR Code码) 可以以任意的角度识别。

1 图像式条形码识别过程
在图像式条形码识别过程中, 首先使用图像采集设备采集二维条形码图像, 然后利用图像处理技术对条形码图像进行去噪和分割处理, 最后调用条码特征读取算法, 读出条码值并显示识别结果, 图3是图像式条形码识别过程, 其中各模块的功能如下:

(1) 图像采集。通过数码相机、扫描仪或专用的图像传感器, 如CCD图像传感器或CMOS图像传感器等设备采集条形码图像。

(2) 图像预处理。图像预处理过程主要包括图像降噪、背景分离、图像校正等环节。由于采集系统或其他原因产生的噪声, 采集的图像有些比较模糊或存在黑白孤立点, 这对条码图像的进一步处理极为不利, 因此要根据条码图像噪声是否严重, 选择一种或多种滤波器进行滤波, 去除噪声。目前采用较多的是中值滤波法。背景分离是将条码区与背景分离, 从而避免在没有有效信息的区域进行特征提取, 提高后续处理的速度。背景分离一般采用标准差阈值跟踪法, 图像条码部分由黑白相间的条块组成, 灰度变化大, 因而标准差较大;而背景部分灰度分布较为平坦, 标准差较小。将条码图像分块, 每个小块的标准差若大于某一阈值, 则该小块中的所有像素点为有效;否则为背景。由于采集进来的图像总会出现一定的倾斜和偏移产生几何畸变, 给快速、正确地识别条码带来困难, 因此必须进行图像校正, 一般方法是:利用行差运算与Hough变换相结合, 快速、准确找到条码图像边界线, 计算出倾斜角度, 通过双线性插值对条码图像进行校正。

图1 图像式条形码识别过程
(3) 二值化处理。条码识别是以二值图像为基础的, 图像二值化算法很多, 条码图像直方图具有很好的双峰特性, 一般采用大津阈值法[4]就能够对于条码图像进行很好地分割。图像二值化之后, 二值图像中“1”像素代表黑条部分, “0”像素代表白条部分。

(4) 边缘检测。条码识别问题的实质是边缘检测的问题, 传统的条码识别算法是根据二阶导数零交叉来检测条码边缘[2,6]。

(5) 条码读取。根据确定的条码边缘确定条码黑白模块宽度, 利用不同的条码编码规则编制相应的译码程序, 确定条码字符值, 这一算法是非常成熟的。

(6) 结果显示和处理。一般由计算机显示条码识别的结果, 并可根据结果进行实际应用中的处理。

2 图像式条码识别技术难点
在图像式的条形码识别过程中, 若能知道条码条空宽度值, 对于不同的条码都有很成熟的算法来确定条码符号值。因此在图像式条码识别过程中, 图像处理部分的算法是十分重要的, 不同的图像处理方法将影响后续的条码识别结果。图像处理过程中的技术难点如下:

(1) 图像模糊问题。因条码印刷质量差、光照较弱、摄像设备质量等原因, 采集的条形码图像比较模糊, 黑白条块之间的边缘不清晰, 甚至黑白条的边缘几乎融合在一起。针对这一问题, 目前国内的一些处理方法都采用各种经典滤波技术对条码图像进行去噪, 如广泛采用的中值滤波技术。当采集图像非常模糊时, 这种处理方法具有一定局限性, 有时甚至导致条码无法识别。

(2) 边缘检测问题。在传统算法中一般是根据二阶导数零交叉来检测条码边缘。由于图像采集、图像滤波过程中在条码图像边缘处会有一定程度的模糊。又由于在条码图像去噪时, 大都选用经典的中值滤波算法, 该算法对椒盐噪声去噪声效果很明显, 但对高斯噪声去噪效果却较差。而在实际应用中, 图像采集产生的模糊基本上都是高斯噪声, 而中值滤波法对该噪声不能有效地去除。在边缘模糊情况下采用二阶导数零交叉来检测条码边缘会有1~2个像素的偏差, 这对条码的条空宽度的确定会产生影响, 从而影响识别。因此边缘模糊是影响条码识别的重要因素。

3 解决技术难点的方法
要解决边缘模糊问题, 必须对噪声进行分析。我们知道平滑的图像主要集中于中低频部分, 噪声信息或边缘信息主要集中在高频段。通常的滤波方法都是不加区分的滤掉高频信息, 不可避免地也会滤掉边缘信息, 从而造成图像边缘模糊。文献[6]提出了一种基于边缘检测的小波去噪方法, 该方法利用小波变换良好的时频特性, 只要沿着梯度方向检测小波变换系数模值的局部极大值点, 即可得到图像的边缘点, 但小波系数的模值极大值点也可能对应着噪声点。因此在检测出小波系数的极大值后, 还要去除与噪声点对应的小波系数。噪声的Lipschitz指数为负, 信号的Lipschitz指数为正, 它们随着尺度的增大信号系数逐渐变大, 而噪声系数逐渐变小。根据这一特点可除去噪声造成的虚假边缘, 将非噪声点的模值极大点连接起来得到图像的边缘。这种方法既可达到去噪目的又可保持图像的边缘, 这种把去噪和边缘检测结合起来的新思路在一定程度上解决了去噪引起图像边缘模糊的难题。

⛄二、部分源代码

function varargout = untitled(varargin)
% UNTITLED M-file for untitled.fig
% UNTITLED, by itself, creates a new UNTITLED or raises the existing
% singleton*.
%
% H = UNTITLED returns the handle to a new UNTITLED or the handle to
% the existing singleton*.
%
% UNTITLED(‘CALLBACK’,hObject,eventData,handles,…) calls the local
% function named CALLBACK in UNTITLED.M with the given input arguments.
%
% UNTITLED(‘Property’,‘Value’,…) creates a new UNTITLED or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before untitled_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to untitled_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE’s Tools menu. Choose “GUI allows only one
% instance to run (singleton)”.
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help untitled

% Last Modified by GUIDE v2.5 03-Nov-2011 13:59:22

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct(‘gui_Name’, mfilename, …
‘gui_Singleton’, gui_Singleton, …
‘gui_OpeningFcn’, @untitled_OpeningFcn, …
‘gui_OutputFcn’, @untitled_OutputFcn, …
‘gui_LayoutFcn’, [] , …
‘gui_Callback’, []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT

% — Executes just before untitled is made visible.
function untitled_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to untitled (see VARARGIN)

% Choose default command line output for untitled
handles.output = hObject;
image1=imread(‘C:\Users\lenovo\Desktop\61602302barcodehcc\barcodehcc\1.bmp’);
axes(handles.axes1);
imshow(image1);

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes untitled wait for user response (see UIRESUME)
% uiwait(handles.figure1);

% — Outputs from this function are returned to the command line.
function varargout = untitled_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;

% — Executes on mouse press over axes background.

% — Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

global im;
%提取条形码区域构成的矩形的左上角坐标
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
image=im;
l1=rgb2gray(image);
level=graythresh(l1);
l2=im2bw(l1,level);
l3=~l2;
l4=bwareaopen(l3,50);
l5=~l4;
l6=edge(l1,‘canny’);
l7=imclose(l6,strel(‘rectangle’,[2,19]));
l8=imopen(l7,strel(‘rectangle’,[2,19]));
l9=imopen(l8,strel(‘rectangle’,[2,19]));
[L,num]=bwlabel(l9,8);
STATS=regionprops(L,‘all’);
a=length(STATS);
%figure,imshow(L);
%hold on;
b=0;
for i=1:a
temp=STATS(i).BoundingBox;
s=temp(3)*temp(4);
if s>b
b=s;
k=i;%记录面积最大的标记区域的索引值
end
end
%rectangle(‘position’,STATS(k).BoundingBox,‘edgecolor’,‘r’);%绘制最大标记区域的外接矩形
temp=STATS(k).BoundingBox;
Rx=round(temp(1));Ry=round(temp(2));%提取条形码区域左上角的坐标
Rwidth=round(temp(3));Rlength=round(temp(4));

%初始化
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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 = im; %读输入条形码图片
bar_Gray = rgb2gray(bar); %将RGB图片转换灰度图

[a_hist x] = imhist(bar_Gray); %绘制灰度直方图,返回直方图数据向量a_hist,和相应的色彩值向量x

%寻找进行二值化处理的阈值,存放在T中
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

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

⛄三、运行结果


⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 赵群礼,周秋平.基于图像的二维条形码识别技术研究[J].合肥师范学院学报. 2010,28(06)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

【条形码识别】基于matlab GUI二维条形码识别【含Matlab源码 607期】相关推荐

  1. 【Matlab条形码识别】二维条形码识别【含GUI源码 607期】

    一.代码运行视频(哔哩哔哩) [Matlab条形码识别]二维条形码识别[含GUI源码 607期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MAT ...

  2. 【信号处理】基于Matlab GUI数字均衡器设计,源码附上

    [信号处理]基于Matlab GUI数字均衡器设计,源码附上 数字均衡器是一种常用于音频信号处理的技术,可以有效地补偿声音中的频率失真,提高音质.在这篇文章中,我们将介绍如何使用Matlab GUI进 ...

  3. 【条形码识别】二维条形码识别【含GUI Matlab源码 607期】

    ⛄一.二维条形码识别简介 采用数字图像处理技术对二维条码进行识别, 是二维条形码识别中较常用的方法, 它在处理污损的条形码方面有光电识别方法无法比拟的优势.另外图像式识别方法对识别角度的要求没有光电识 ...

  4. 【功能超全】基于OpenCV车牌识别停车场管理系统软件开发【含python源码+PyqtUI界面+功能详解】-车牌识别python 深度学习实战项目

    车牌识别基础功能演示 摘要:车牌识别系统(Vehicle License Plate Recognition,VLPR) 是指能够检测到受监控路面的车辆并自动提取车辆牌照信息(含汉字字符.英文字母.阿 ...

  5. 【过程控制】基于matlab GUI串级控制【含Matlab源码 2385期】

    ⛄一.简介 1 交互系统整体外观展示 该系统基于 MATLAB GUI 与 Simulink 联合开发, 实现对串级控制系统特性的研究与分析.学生在学习串级控 制有关知识后可使用该应用进行知识回顾.界 ...

  6. matlab svm 语音识别,【情感识别】基于matlab支持向量机(SVM)的语音情感识别【含Matlab源码 543期】...

    一.简介 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本.非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数 ...

  7. 【条形码识别】基于matlab条形码识别【含Matlab源码 403期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [条形码识别]基于matlab条形码识别[含Matlab源码 403期] (https://download.csdn.net/downl ...

  8. 【芯片识别】基于matlab GUI形态学PCB板芯片识别【含Matlab源码 1820期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[芯片识别]基于matlab GUI形态学 PCB板芯片识别[含Matlab源码 1820期] 点击上面蓝色字体,直接付费下载,即可. 获 ...

  9. 【大米粒计数】基于matlab GUI形态学大米粒颗粒识别【含Matlab源码 915期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[大米粒计数]基于matlab GUI形态学大米粒颗粒识别[含Matlab源码 915期] (https://download.csdn. ...

最新文章

  1. 【PP】其他类型BOM备忘录
  2. 下个软件包可能泄露信用卡信息,Python 包存储库 PyPI 又爆恶意代码,下载达 3 万次,你中招了吗?...
  3. w3c的ajax操作函数,关于ajax的使用方法_例题、ajax的数据处理
  4. css3图片垂直居中
  5. Python之数据分析(random模块的正确用法)
  6. c语言设置一个选择数字的程序,C语言编一个数字益智小游戏
  7. Cry On My Shoulder (背景音乐)
  8. opencv图像分析与处理(15)- 图像压缩中的编码方法:霍夫曼编码、Golomb编码、Rice编码、算术编码及其实现
  9. 数独解题程序的python实现_使用Python编写程序求解数独游戏答案
  10. java开发文档怎么写?教你写java技术文档
  11. 2.ISIS协议原理
  12. 机器学习模型太慢?来看看英特尔(R) 扩展加速 ⛵
  13. PCAN-View如何保存报文?
  14. Yandex-好用的以图搜图网站
  15. cocos 微信小游戏 加载云端资源
  16. 小技巧 大智慧 实例集
  17. 用友vs金蝶产品分析(云星空与YonSuite)
  18. 微信支付服务商,可视化进件特约商户
  19. Mac系统下如何创建锁屏快捷键
  20. 四轮移动机器人(阿克曼底盘)数学建模

热门文章

  1. html上传图片裁剪,基于HTML5+JS实现本地图片裁剪并上传功能
  2. HOOPS/MVO技术概述
  3. VUE类似淘宝选择商品多规格(库存判断)
  4. 【双重注意机制:肺癌:超分】
  5. 损失次数模型-泊松分布
  6. 币氪研报|OMG(OmiseGo)
  7. 【python 爬虫乱码】request请求返回json乱码如何解决
  8. w3shool学习3-PHP 字符串
  9. Ubuntu16.04安装NVIDIA(GeForce1080Ti)显卡驱动
  10. 爬取贝壳平台新房数据并可视化