天天看點

【二維碼識别】基于matlab GUI 灰階+二值化+校正QR二維碼識别與生成【含Matlab源碼 600期】

一、簡介

1 什麼是QR碼

QR碼屬于矩陣式二維碼中的一個種類,由DENSO(日本電裝)公司開發,由JIS和ISO将其标準化。QR碼的樣子其實在很多場合已經能夠被看到了。

【二維碼識别】基于matlab GUI 灰階+二值化+校正QR二維碼識别與生成【含Matlab源碼 600期】

(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 資料容量、糾錯碼容量對照如下表:

【二維碼識别】基于matlab GUI 灰階+二值化+校正QR二維碼識别與生成【含Matlab源碼 600期】
【二維碼識别】基于matlab GUI 灰階+二值化+校正QR二維碼識别與生成【含Matlab源碼 600期】
【二維碼識别】基于matlab GUI 灰階+二值化+校正QR二維碼識别與生成【含Matlab源碼 600期】

二、源代碼

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.3*I(j,i,1)+0.59*I(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 GUI 灰階+二值化+校正QR二維碼識别與生成【含Matlab源碼 600期】

四、matlab版本及參考文獻

1 matlab版本

2014a

2 參考文獻

[1] 蔡利梅.MATLAB圖像處理——理論、算法與執行個體分析[M].清華大學出版社,2020.

[2]楊丹,趙海濱,龍哲.MATLAB圖像處理執行個體詳解[M].清華大學出版社,2013.

[3]周品.MATLAB圖像處理與圖形使用者界面設計[M].清華大學出版社,2013.

繼續閱讀