【二维码识别】基于matlab GUI机器学习QR二维码识别与生成【含Matlab源码 600期】

⛄一、简介

1 什么是QR码
QR码属于矩阵式二维码中的一个种类,由DENSO(日本电装)公司开发,由JIS和ISO将其标准化。QR码的样子其实在很多场合已经能够被看到了。
在这里插入图片描述
(1)位置探测图形、位置探测图形分隔符:用于对二维码的定位,对每个QR码来说,位置都是固定存在的,只是大小规格会有所差异;这些黑白间隔的矩形块很容易进行图像处理的检测。

(2)校正图形:根据尺寸的不同,矫正图形的个数也不同。矫正图形主要用于QR码形状的矫正,尤其是当QR码印刷在不平坦的面上,或者拍照时候发生畸变等。

(3)定位图形:这些小的黑白相间的格子就好像坐标轴,在二维码上定义了网格。

(4)格式信息:表示该二维码的纠错级别,分为L、M、Q、H;

(5)数据区域:使用黑白的二进制网格编码内容。8个格子可以编码一个字节。

(6)版本信息:即二维码的规格,QR码符号共有40种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本 每边增加4个模块。

(7)纠错码字:用于修正二维码损坏带来的错误。

2 QR二维码的识别原理

2.1 定位 手机拍摄QR 码图像时,可能会同时采集到条码周围其他的图像。这些干扰图像会增加图像处理的复杂度,因此,可以把这些没必要的干扰图像通过裁切的方式去除。校正后,直接对正方形A’B’C’D’外的区域裁切,就可以去除其余背景。 QR 码符号中有3 个位置探测图形,分别位于符号图像4 个角中的3 个角,每个 4 位置探测图像都是由固定深浅颜色的模块组成。模块深浅颜色顺序为深色—浅色—深色—浅色—深色,各元素宽度的比例为1∶ 1∶ 3∶ 1∶ 1(如下图所示)。

即使图像有旋转,位置探测图像的模块颜色顺序和宽度比例也不变。对二值化后的图像按行、列分别逐点扫描,把同一灰度级的相邻像素记录为线段。如果有5 段线段的长度比例符合1∶ 1∶ 3 ∶ 1 ∶ 1,且深浅颜色顺序为深—浅—深—浅—深,则记录该线段。扫描完后,把行相邻的线段分为1 组,去除与所有线段都不相邻的行线段( 可能是随机的干扰线段) 。同样处理列线段,把行线段组和列线段组中相互交叉的组分类,求出交叉的行、列线段组的中心点,即为位置探测图形的中心。 2.2.2 预处理 基本原理:QR 码作为手机二维码,其应用模式如下图所示。手机等智能设备通过摄像头采集带有条码符号的图像,对图像进行灰度化、二值化、旋转校正等预处理,进行条码检测。如果检测到非QR 码,则重新采集; 如果是QR 码,则进行图像信息的取样。用Reed - Solomon 码的译码算法对取到的数据进行纠错译码,统计出现的错误数量。如果错误数量超出纠错容量,则纠错译码失败,重新采集图像; 如果可以正确进行纠错译码,则把纠错后的信息进行各种数据模式下的译码,恢复出编码信息,继而根据应用模式进行信息输出、发送短信或网址跳转等后续处理。

3 QR码的特点

说到QR码的特点:

一)是高速读取(QR就是取自“Quick Response”的首字母),对读取速度的体验源自于我手机上的一个软件,象上面贴出的码图,通过摄像头从拍摄到解码到显示内容也就三秒左右,对摄像的角度也没有什么要求;

二)是高容量、高密度;理论上内容经过压缩处理后可以存7089个数字,4296 个字母和数字混合字符,2953个8位字节数据,1817个汉字;

三)是支持纠错处理;纠错处理相对复杂,目前我还没有深入了解,按照QR码的标准文档说明,QR码的纠错分为4个级别,分别是:
level L : 最大 7% 的错误能够被纠正;
level M : 最大 15% 的错误能够被纠正;
level Q : 最大 25% 的错误能够被纠正;
level H : 最大 30% 的错误能够被纠正;

四)是结构化;看似无规则的图形,其实对区域有严格的定义,下图就是一个模式2、版本1的QR图结构(关于QR码的"模式"、“版本"将在后面进行介绍):
在上图21*21的矩阵中,黑白的区域在QR码规范中被指定为固定的位置,称为寻像图形(finder pattern) 和 定位图形(timing pattern)。寻像图形和定位图形用来帮助解码程序确定图形中具体符号的坐标。
黄色的区域用来保存被编码的数据内容以及纠错信息码。
蓝色的区域,用来标识纠错的级别(也就是Level L到Level H)和所谓的"Mask pattern”,这个区域被称为“格式化信息”(format information)。

五)是扩展能力。QR码的Structure Append特点,使一个QR码可以分解成多个QR码,反之,也可以将多个QR码的数据组合到一个QR码中来:

4 QR码的模式和版本

前面提到过QR码的模式(Model)和版本(Version)。QR码分为Model1和Model2两种模式,Model1是对QR的初始定义,Model2是对Model1的扩展,目前使用较为普遍的是Model2,本文的所有说明也仅用于Model2。

QR图的大小(size)被定义为版本(Version),版本号从1到40。版本1就是一个2121的矩阵,每增加一个版本号,矩阵的大小就增 加4个模块(Module),因此,版本40就是一个177177的矩阵。(版本越高,意味着存储的内容越多,纠错能力也越强)。

5 QR码支持的编码内容

QR码支持编码的内容包括纯数字、数字和字符混合编码、8位字节码和包含汉字在内的多字节字符。其中:
数字:每三个为一组压缩成10bit。
字母数字混合:每两个为一组,压缩成11bit。
8bit字节数据:无压缩直接保存。
多字节字符:每一个字符被压缩成13bit。

6 QR码编码原理(编码)
编码就是把常见的数字、字符等转换成QR码的方法。说具体的编码之前,先说一下QR码的最大容量问题。

6.1 最大容量
QR码的最大容量取决于选择的版本、纠错级别和编码模式(Mode:数字、字符、多字节字符等)。以版本1、纠错级别为Level Q的QR码为例,可以存储27个纯数字,或17个字母数字混合字符或11个8bit字节数据。如果要存储同样多的内容同时提高纠错级别,则需要采用更高的版本。版本1~9 数据容量、纠错码容量对照如下表:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

⛄二、部分源代码

function varargout = main(varargin)
% MAIN MATLAB code for main.fig
% MAIN, by itself, creates a new MAIN or raises the existing
% singleton*.
%
% H = MAIN returns the handle to a new MAIN or the handle to
% the existing singleton*.
%
% MAIN(‘CALLBACK’,hObject,eventData,handles,…) calls the local
% function named CALLBACK in MAIN.M with the given input arguments.
%
% MAIN(‘Property’,‘Value’,…) creates a new MAIN or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before main_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to main_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 main

% Last Modified by GUIDE v2.5 20-Apr-2014 14:55:44

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct(‘gui_Name’, mfilename, …
‘gui_Singleton’, gui_Singleton, …
‘gui_OpeningFcn’, @main_OpeningFcn, …
‘gui_OutputFcn’, @main_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 main is made visible.
function main_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 main (see VARARGIN)

% Choose default command line output for main
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

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

% — Outputs from this function are returned to the command line.
function varargout = main_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 button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles) %%%%%%%%打开图像
global im;
[filename,pathname]=uigetfile({‘.’;‘.bmp’;'.jpg’;‘.tif’;'.jpg’},‘选择图像’);
if isequal(filename,0)||isequal(pathname,0)
errordlg(‘您还没有选取图片!!’,‘温馨提示’);%如果没有输入,则创建错误对话框
return;
else
image=[pathname,filename];%合成路径+文件名
im=imread(image);%读取图像
figure
imshow(im);%在坐标axes1显示原图像
title(‘原始QR图像’);
end

% 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)

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

% — Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)%%%%%%%%%%%%%%%%%%% QR解码
global I_otsu; %global 定义全局变量
global im;
global KL;
global Ijibian;

I_jiema=Ijibian;
I_jiema=I_otsu; %二值
I_jiema=KL;
I_jiema=im;
%

str=zxing_decode(I_jiema) %解码
%set(handles.edit1,‘string’,[get(handles.edit1,‘string’) str]);
%set(handles.text,‘string’,[get(handles.text,‘string’) str]);
set(handles.edit1,‘String’,str); %显示字符

% — Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles) %%%%%%%%%%%%%%%%%%% 灰度化处理
global im;
global II;

I=im;
[w,h,l]=size(I); %图像大小
II=[];
for i=1:h
for j=1:w
II(j,i)=0.3I(j,i,1)+0.59I(j,i,2)+0.11*I(j,i,3); %灰度化处理公式
end
end

figure,imshow(II,[]) %显示图像
title(‘QR二维码灰度化处理’);

% — Executes on button press in pushbutton5.
function pushbutton5_Callback(hObject, eventdata, handles)%%%%%%%%%%%%%%%%%%% 平滑处理
global II;
global I3;
III=uint8(II); %图像转换0-255
Ix=imnoise(III,‘salt & pepper’,0.02); %对灰度化图像人为加噪声
I3=medfilt2(Ix,[3,3]); %平滑处理
figure
imshow(Ix)
title(‘QR二维码加噪处理’);
figure
imshow(I3)
title(‘QR二维码平滑处理’);

% — Executes on button press in pushbutton6.
function pushbutton6_Callback(hObject, eventdata, handles)%%%%%%%%%%%%%%%%%%% 二值化处理
global I3;
global I_otsu;
I_otsu=otsut(I3); %二值化处理
figure
imshow(I_otsu,[])
title(‘QR二维码二值化处理’);

function edit1_Callback(hObject, eventdata, handles)
% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Hints: get(hObject,‘String’) returns contents of edit1 as text
% str2double(get(hObject,‘String’)) returns contents of edit1 as a double

% — Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,‘BackgroundColor’), get(0,‘defaultUicontrolBackgroundColor’))
set(hObject,‘BackgroundColor’,‘white’);
end

% — Executes on button press in pushbutton7.
function pushbutton7_Callback(hObject, eventdata, handles) %%%% 旋转校正 4.bmp
global im;
%倾斜校正 :二值化,取边缘,Hough变换得到角度,旋转
I=im;
bw=rgb2gray(I); %rgb转换为灰度图
bw=im2bw(I,graythresh(bw)); %二值化过程
bw=double(bw);
BW=edge(bw,‘canny’); %canny边缘处理
BW1=BW;
figure
imshow(BW1);title(‘canny 边界图像’); %显示图像
[H,T,R]=hough(BW);
figure,imshow(H,[],‘XData’,T,‘YData’,R,‘InitialMagnification’,‘fit’);
xlabel(‘\theta’),ylabel(‘\rho’);
axis on, axis normal,hold on;
P=houghpeaks(H,4,‘threshold’,ceil(0.3*max(H(😃))); %hough变化峰值检测
x=T(P(:,2)); y = R(P(:,1));
plot(x,y,‘s’,‘color’,‘white’);
lines=houghlines(BW,T,R,P,‘FillGap’,50,‘MinLength’,7); %hough检测线段
figure,imshow(BW),title(‘直线标识图像’);
max_len = 0;
hold on;
for k=1:length(lines) %主要把线条和点显示出来
xy=[lines(k).point1;lines(k).point2];
% 标出线段
plot(xy(:,1),xy(:,2),‘LineWidth’,2,‘Color’,‘green’);
% 标出线段的起始和终端点
plot(xy(1,1),xy(1,2),‘x’,‘LineWidth’,2,‘Color’,‘yellow’);
plot(xy(2,1),xy(2,2),‘x’,‘LineWidth’,2,‘Color’,‘red’);
len=norm(lines(k).point1-lines(k).point2);
Len(k)=len;
if (len>max_len)
max_len=len;
xy_long=xy;
end
end

⛄三、运行结果

在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.

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

  • 5
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
基于MATLAB GUI的灰度二值化、校正QR二维码识别生成的实现步骤如下: 一、灰度化与二值化: 1. 使用MATLAB中的imread函数读取原始图像; 2. 使用灰度转换函数rgb2gray将原始图像转为灰度图像; 3. 使用imbinarize函数对灰度图像进行二值化处理,将图像转为黑白图像; 4. 根据二值化结果提取QR码的轮廓。 二、校正QR二维码: 1. 使用MATLAB中的regionprops函数获取二值图像中的所有边界信息; 2. 利用边界信息计算QR码的边界框; 3. 对边界框进行旋转矫正,使QR码水平; 4. 绘制校正后的二维码边界。 三、QR二维码识别生成: 1. 利用MATLAB中的QR识别库zxing,读取校正后的QR码图像; 2. 使用zxing库的函数decode对图像进行解码,获取二维码中的信息; 3. 针对解码结果,可以进行进一步的处理或展示。 四、GUI设计与交互: 1. 使用MATLAB GUI工具,设计界面,并添加必要的按钮、文本框等元素; 2. 将上述的灰度化、二值化、校正、识别生成的过程封装为函数; 3. 在GUI界面设计中,为按钮等元素添加回调函数,实现与上述函数的交互; 4. 将处理过程中的中间结果或最终结果展示在GUI界面上。 通过以上步骤,我们可以实现基于MATLAB GUI的灰度二值化、校正QR二维码识别生成功能。用户可以通过GUI界面上传或拍摄二维码图像,并通过按钮触发相应的功能,实现对二维码图像的处理与识别。在界面上显示二维码的解码结果,方便用户进行交互与展示。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海神之光

有机会获得赠送范围1份代码

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值