【交通标志识别】基于matlab GUI模板匹配交通标志识别【含Matlab源码 1059期】

81 阅读2分钟

一、简介

1 概述
模式识别就是通过计算机,用数学模型求解的方法研究模式的自动处理和判读。在模式识别的各种方法中,模板匹配是最容易的一种,其数学模型易于建立,通过模板匹配对数字图像模式识别有助于我们了解数学模型在数字图像中的应用。

2 模板匹配算法
2.1 相似性测度求匹配
模板匹配的实际操作思路很简单:拿已知的模板,和原图像中同样大小的一块区域去对。最开始时,模板的左上角点和图像的左上角点是重合的,拿模板和原图像中同样大小的一块区域去对比,然后平移到下一个像素,仍然进行同样的操作, ……所有的位置都对完后,差别最小的那块就是我们要找的物体。

以上所描述的是相似性测度法求匹配的求解思路,其在计算机中操作的如图2所示。设模板T叠放在搜索图上平移,被模板覆盖搜索图下的那个图像叫做子图Si , j,i , j 为这块子图的左上角像素点在S图的坐标,称为参考点,从图2可知,i , j 的取值范围是:1<i ,j <N- M+1. 现在可以比较T和Si , j的内容。若两者一致,则T和S之差为零. 因此,可用下列公式(1) 和公式(2) 来衡量T和Si , j的相似程度。
在这里插入图片描述
在这里插入图片描述
在(2) 式中第3项表示模板总能量,是一个与(i , j) 无关的常数;第1项是模板覆盖下子图的能量,它随着(i , j) 的位置缓慢地改变;第2项表示的子图与模板的互相关系,随着(i , j) 的改变而改变,当T和Si , j匹配时这项取值最大。因此可用下列相关函数(3) 作相似性测度。
在这里插入图片描述
当矢量t 和S1之间的夹角为0时,即当S1(i , j) =kt 时(k为常量) ,有R(i , j) =1,否则R(i , j) <1. 显然R(i , j) 越大,模板T和Si , j就越相似,点(i , j) 就是我们要寻找的匹配点。

2.2 序贯相似性检测的算法
用相关法求匹配的计算量很大,因为模板要在(N- M+1)2个参考位置上作相关计算,除了在匹配点外,其它点作的都是无用功。因此,人们提出一种叫序贯相似性检测的算法,简称SSDA(Sequential SimiliarityDetectionAlgorithm) 其要点是:
在数字图像中,SSDA法用公式(6) 计算图像f ( x, y) 在点(i , j) 的非相似度m(i , j) 作为匹配尺度。式中(i , j) 表示的不是模板中心坐标,而是它左上角坐标。模板的大小为n ×m。
在这里插入图片描述
如果在(i , j) 处图像中有和模板一致的图案时,则m(i , j) 值很小,反之则很大。特别是模板和搜索图下的子图部分,完全不一致的场合下,如果在模板内的各像素与图像重合部分对应的像素灰度差的绝对值依次增加,其和会急剧增大。 因此,在作加法时,如果灰度差的绝对值部分和超过某一阈值时,就认为这个位置不存在和模板一致的图案,从而转移到下一个位置上计算m(i , j)。并且在这模板下的各像素点计算中止,因此能大幅度地缩短计算时间,提高匹配速度。
根据上述思路,我们可以进一步改进SSDA算法。就是把在图像上的模板移动分为粗检索和细检索2个阶段进行。首先进行粗检索,它不是让模板每次移动1个像素,而是每隔若干的像素把模板和图像重叠,并且计算匹配的尺度,从而求出待寻找的图案大致存在的范围。然后在这个范围内,让模板每隔1个像素移动1次,根据匹配的尺度确定寻找图案的所在位置。这样,整体上计算模板匹配的次数减少了,计算时间缩短,匹配的速度提高了。但用这种方法具有漏掉图像中最恰当位置的危险性。

2.3 相关算法
2个函数的相关性定义,可用公式(7)表示:
在这里插入图片描述
f*表示f 的复共轭。我们知道相关理论类似卷积理论,F( u, v) 和 H( u, v) 分别表示f ( x, y) 和h( x, y)的傅立叶变换. 根据卷积理论有
在这里插入图片描述
可知卷积是空间域过滤和频率域过滤之间的纽带。相关的重要用途在于匹配。在匹配中,f ( x, y) 是一幅包含物体或区域的图像。如果想要确定f 是否包含有感兴趣的物体或区域,让h( x, y) 作为那个物体的区域(通常称该图像为模板)。如果匹配成功,2个函数的相关值会在h找到f 中相应点的位置上达到最大。从上面分析可知,相关算法可以有2种方法:可在空间域进行,也可在频率域进行。

2.4 幅度排序相关算法
这种算法有2个步骤组成:
第1步,把实时图中的各个灰度值按幅度的大小排成列的形式,然后在对它进行二进制(或三进制) 编码,根据二进制排序的序列,把实时图变换为二进制阵列的一个有序的集合{ Cn, n =1,2, …, N}。这一过程称之为幅度排序预处理。
第2步,序贯地将这些二进制序列与基准图进行由粗到细的相关,直到确定出匹配点为止。由于篇幅的限制,这里就不列出例子了。

2.5 分层搜索的序惯判决算法
这种分层搜索算法是直接基于人们先粗后细寻找事物的惯例而形成的,例如,在中国地图上找肇庆的位置时,可以先找广东省这个地域,这过程称为粗相关。然后在这个地域中,再仔细确定肇庆的位置,这叫做细相关。很明显,利用这种方法,可以很快找出肇庆的位置。因为在这过程中省略了寻找广东省以外区域所需的时间,这种方法称为分层搜索的序贯判决法,利用这种思想形成的分层算法具有相当高的搜索速度。限于篇幅,这里只给出这种操作的一般思路。

3 总结
模式匹配本质就是应用数学。模板匹配过程如下:①将图像数字化,按顺序取出每个点的像素值;②代入事先建立的数学模型进行预处理;③选择一种合适的算法进行模式匹配;④将匹配后图像的坐标列出或直接在原图显示.。在模板匹配操作中最为关键的是如何建立数学模型,这是正确匹配的核心。

二、源代码

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

% Last Modified by GUIDE v2.5 19-Feb-2021 15:53:44

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @trsUI_OpeningFcn, ...
                   'gui_OutputFcn',  @trsUI_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 trsUI is made visible.
function trsUI_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 trsUI (see VARARGIN)

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

% Update handles structure
guidata(hObject, handles);

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


% --- Outputs from this function are returned to the command line.
function varargout = trsUI_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;

global I1;
global mb1;
global mb2;
global x;
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
    %m_file_open (hObject, eventdata, handles);
    [FileName,PathName ]= uigetfile({'*.bmp';'*.png';'*.jpg';'*.*'},'Select an image');
    axes(handles.axes1);%用axes命令设定当前操作的坐标轴是axes_src
    fpath=[PathName FileName];%将文件名和目录名组合成一个完整的路径
    %I1 = imread(FileName);
    global I1;
    I1 = imread(FileName);
    imshow(I1);

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


% 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 pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
    global I;
    global mb1;
    global mb2;
    I=imread('禁止停车.bmp');
    mb1=tuxiangchuli(I);
    I=imread('禁止驶入.bmp');
    mb2=tuxiangchuli(I);
    

% 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)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
    global I1;
    global x;
    x=tuxiangshibie(I1);
    set(handles.xData,'string',num2str(x));
    guidata(hObject, handles);   
    drawnow;
%function zuavg = tuxiangchuli(I)
I=imread('禁止停车.bmp'); 
%I=imadjust(I,[0.3,0.8],[0,1],0.5);
%imshow(I);
%I1=rgb2hsi(I);%figure,imshow(I1);
%I2=histeq(I(:,:,3));% figure,imshow(I2);
%I1(:,:,3)=double(I2)/255; %figure,imshow(I1);
%I3=hsi2rgb(I1);I4= im2uint8(mat2gray(I3));%figure,imshow(I4);
I5=((I(:,:,1)-I(:,:,2)>30)&(I(:,:,1)-I(:,:,3)>30));%|(I(:,:,1)<30&I(:,:,2)<30&I(:,:,3)<30);
%figure,imshow(I5);
I6=medfilt2(I5);%figure,imshow(I6);
[I7,num]=bwlabel(I6,8);%figure,imshow(I7);
I8=bwareaopen(I7,500);%figure,imshow(I8);
[I9,num]=bwlabel(I8,8);%figure,imshow(I9);
a=regionprops(I9,'area');
area=cat(1,a.Area);
p=regionprops(I9,'perimeter');
perimeter=cat(1,p.Perimeter);
C=4*pi*(area)./(perimeter.*perimeter);
I10=ismember(I9,(find(C)>0.5));%figure,imshow(I10);
se=strel('square',4);
I11=imerode(I10,se);%figure,imshow(I12);
se=strel('square',3);
I12=imdilate(I11,se);%figure,imshow(I11);
I13=I12==0;%figure,imshow(I13);
I14=bwareaopen(I13,50);%figure,imshow(I14);
I15=I14==0;%figure,imshow(I15);
I16=mat2gray(I15);%figure,imshow(I16);
I17=bwperim(I16,8);%figure,imshow(I17);
%h=fspecial('gaussian',5); I18=edge(I17,'zerocross',[],h);figure,imshow(I18);
I18=zs(I17);%figure,imshow(I18);
c=0;
[m,n]=size(I18);
for i=1:1:m
    for j=1:1:n
        if I18(i,j)==1
            c=i;
            break;
        end
    end
    if c>0 
        break
    end
        
end
for i=c:1:m
    for j=1:1:n
        if I18(i,j)==1
            e=i;
            break;
        end
    end
    if e>0 
      e=0;
      d=i;
    end
        
end
c1=0;
for j=1:1:n
    for i=1:1:m
        if I18(i,j)==1
            c1=j;
            break;
        end
    end
    if c1>0 
        break
    end
        
end
for j=c1:1:n
    for i=1:1:m
        if I18(i,j)==1
            e2=j;
            break;
        end
    end
    if e2>0 
        e2=0;
        d1=j;
    end
        
end

三、运行结果

在这里插入图片描述
在这里插入图片描述

四、备注

版本:2014a