【车牌识别】基于matlab GUI模板匹配车牌识别门禁系统【含Matlab源码 1091期】

【车牌识别】基于matlab GUI模板匹配车牌识别门禁系统【含Matlab源码 1091期】一、简介 基于matlab GUI车牌库识别: 该设计主要研究基于MATLAB软件的汽车号牌设别系统设计,系统主要包括图像采集、图像预处理、车牌定位、字符分割、字符识别五大核心部分。系统的图像预处理模

一、简介

基于matlab GUI车牌库识别: 该设计主要研究基于MATLAB软件的汽车号牌设别系统设计,系统主要包括图像采集、图像预处理、车牌定位、字符分割、字符识别五大核心部分。系统的图像预处理模块是将图像经过图像灰度化、图像增强、边缘提取、二值化等操作,转换成便于车牌定位的二值化图像;利用车牌的边缘、形状等特征,再结合Roberts 算子边缘检测、数字图像、形态学等技术对车牌进行定位;字符的分割采用的方法是将二值化后的车牌部分进行寻找连续有文字的块,若长度大于设定的阈值则切割,从而完成字符的分割;字符识别运用模板匹配算法完成。以上每个功能模块用MATLAB软件实现,最后识别出车牌,在研究设计的同时对其中出现的问题进行具体分析、处理,并寻求更优的方法。

二、源代码

function varargout = main(varargin)
% clc;clear;close all;
%% GUI初始化
% 开始初始化代码 - 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



% 结束初始化代码
pause(1);
% 执行之前主要是可见的。
function main_OpeningFcn(hObject, eventdata, handles, varargin)
set(handles.process,'enable','on')
% 此函数没有输出参数,见 OutputFcn.
% main的选择默认的命令行输出
handles.output = hObject;
% 更新handles 结构
guidata(hObject, handles);

backgroundImage =importdata('TIM图片20180108105930.jpg');
axes(handles.axes24);
image(backgroundImage);
axis off
% UIWAIT 等待用户响应 (see UIRESUME)
% uiwait(handles.figure1);

% --- 这个函数的输出返回到命令行。
function varargout = main_OutputFcn(hObject, eventdata, handles) 
tic
% 获得缺省命令行输出的把手结构
varargout{1} = handles.output;

% --- 执行按钮在pushbutton1。
function pushbutton1_Callback(hObject, eventdata, handles)

[filename pathname]=uigetfile({'*.jpg';'*.bmp'}, 'File Selector');         %打开需要识别的车牌图片
I = imread([pathname '\' filename]); handles.I = I; % 更新处理结构 guidata(hObject, handles); axes(handles.axes1); imshow(I);title('原始图片') set(handles.process,'enable','on')
% --- 执行过程中按下按钮。
%% 开始车牌图像处理
function process_Callback(hObject, eventdata, handles)
I = handles.I;
I1=rgb2gray(I);                                                            %rgb2gray转换成灰度图,减小处理工作量,方便二值化处理                                
guidata(hObject, handles);
axes(handles.axes2);
imshow(I1);title('灰度图');
axes(handles.axes3);
imhist(I1);title('灰度图直方图');                                           %提取灰度图中的直方图信息
%继续
pause(2);
I2=edge(I1,'roberts',0.15,'both');
guidata(hObject, handles);
axes(handles.axes2);
imshow(I2);title('robert算子边缘检测');                                     %依据边缘上的像素一阶导数较大,二阶倒数在边缘检测出值为0来边缘检测,选用roberts算子,间距0.15,水平垂直两个方向
pause(2);
se=[1;1;1];
I3=imerode(I2,se);
guidata(hObject, handles);
axes(handles.axes3);
imshow(I3);title('腐蚀后图像');                                             %构建一个维度矩阵,进行图像腐蚀以实现图像增强
%继续
pause(2);
se=strel('rectangle',[10,25]);%生成一个矩阵
I4=imclose(I3,se);%闭运算
guidata(hObject, handles);
axes(handles.axes2);
imshow(I4);title('平滑图像的轮廓');                                         %构建10*25的长方形结构体图,通过闭运算平滑轮廓修补缝隙
%继续
pause(2);
I5=bwareaopen(I4,2000);%小于2000的对象都被删除                              %移除不必要的小对象 
guidata(hObject, handles);
axes(handles.axes2);
imshow(I5);title('从对象中移除小对象');
%继续
pause(2);    

alg_flag=3;

alg_flag=get(handles.edit3,'string');
alg_flag=str2double(alg_flag);
if alg_flag==1
[PY2,PY1,PX2,PX1]=chepai_fenge(I5);%调用分割车牌                             %对车牌矩阵中非零值进行搜索,根据阈值判定车牌在图片中的X、Y位置
elseif alg_flag==2
    PY1=jytexingff(I5)-2;
    PY2=texingy2(I5)+15;
    PX1=texingx(I5);
    PX2=texingx2(I5);
else
    PY1=jyxiangsuPY1(I5)-2;
    PY2=jyxiangsuPY2(I5)+15;
    PX1=jyxiangsuPX1(I5);
    PX2=jyxiangsuPX2(I5);
end

global threshold;
[PY2,PY1,PX2,PX1,threshold]=chepai_xiuzheng(PY2,PY1,PX2,PX1);%调用车牌校正   %根据车牌的位置面积大小进行车牌校正
IY=I(PY1:PY2,:,:);
Plate=I5(PY1:PY2,PX1:PX2);%使用caitu_tiqu                                    %将车牌从图片中提取出来
 global dw;
 dw=Plate;
PX1=PX1-1;%对车牌区域的校正
 PX2=PX2+1;
  dw=I(PY1:PY2-8,PX1:PX2,:);
  axes(handles.axes2);
  imshow(dw),title('车牌区域的校正');
 pause(2);
 t=tic;
guidata(hObject, handles);
axes(handles.axes2);
imshow(IY),title('水平方向合理区域');                                         %将车牌在图片中的水平位置,前面已经将车牌提取,因此这里可以去掉
axes(handles.axes3);
imshow(dw),title('定位剪切后的彩色车牌图像');




pause(2);
imwrite(dw,'New number plate.jpg');                                          %保存定位剪切后的彩色车牌图像
% [filename,filepath]=uigetfile('New number plate.jpg','输入一个定位裁剪后的车牌图像');%打开定位剪切后的彩色车牌图像
% jpg=strcat(filepath,filename);
a=imread('New number plate.jpg');
b=rgb2gray(a);                                                               %对定位后的车牌灰度化                                  
figure(3),subplot(3,2,1),imshow(b),title('车牌灰度图像');
g_max=double(max(max(b)));
g_min=double(min(min(b)));
T=round(g_max-(g_max-g_min)/2);                                              %二值化灰度车牌
[m,n]=size(b);
d=(double(b)>=T);  %  d:二值图像
figure(3),subplot(3,2,2),imshow(d),title('车牌二值图像');
figure(3),subplot(3,2,3),imshow(d),title('均值滤波前');  
pause(1);
h=fspecial('average',3); %均值滤波器
d=im2bw(round(filter2(h,d)));
figure(3),subplot(3,2,4),imshow(d),title('均值滤波后');                      %均值滤波去噪,可以从前后图中看出去除了大部分噪声
se=eye(2); % eye(n) returns the n-by-n identity matrix 单位矩阵  
%字符面积与车牌面积之比在(0.235,0.365)之间
[m,n]=size(d);  %如果大于0.365则对图像进行腐蚀,如果小于0.235则对图像进行膨胀
if bwarea(d)/m/n>=0.365%计算面积
    d=imerode(d,se);%imerode 实现图像腐蚀 d为待处理图像,se是结构元素对象
elseif bwarea(d)/m/n<=0.235
    d=imdilate(d,se);%imdilate 图像膨胀
end
figure(3),subplot(3,2,5),imshow(d),title('膨胀或腐蚀处理后');                %根据车牌面积与总面积的比判定膨胀或腐蚀处理,腐蚀:消除小物体,膨胀:填充小空洞,车牌增强
pause(2);
                                                                            % 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割
d=zifufenge(d);
[m,n]=size(d);
guidata(hObject, handles);
axes(handles.axes3);imshow(d);
k1=1;k2=1;s=sum(d);j=1;
while j~=n
    while s(j)==0
        j=j+1;
    end
    k1=j;
    while s(j)~=0 && j<=n-1
        j=j+1;
    end
    k2=j-1;
    if k2-k1>=round(n/6.5)                                                  %一共7个字符,故这里取6.5
        [val,num]=min(sum(d(:,[k1+5:k2-5])));                               % 调整K1,K2的值,求和取最小值,确定最小区域                    
        d(:,k1+num+5)=0  % 分割                                             % 将两个字符中间的干扰赋零,消除干扰,进行下一次分割     
    end
end

三、运行结果

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

四、备注

版本:2014a

今天的文章【车牌识别】基于matlab GUI模板匹配车牌识别门禁系统【含Matlab源码 1091期】分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/23686.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注