【车牌识别】基于matlab GUI模板匹配汽车停车场出入库【含Matlab源码 3032期】

💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞💞💞💞💞💞💥💥💥💥💥💥
在这里插入图片描述
✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进;
🍎个人主页:海神之光
🏆代码获取方式:
海神之光Matlab王者学习之路—代码获取方式

⛳️座右铭:行百里者,半于九十。
更多Matlab图像处理仿真内容点击👇
Matlab图像处理(进阶版)
付费专栏Matlab图像处理(初级版)

⛳️关注优快云海神之光,更多资源等你来!!

⛄一、车牌识别简介

车牌识别技术起源于20世纪80年代初期,图像模式识别和计算机视觉在其中起到至关重要的作用。随着计算机技术的迅速普及和进步,80年代中后期,车牌识别系统逐步投入市场并使用,但识别精度和速度都不理想。目前,发达国家的车牌识别系统已广泛用于市场,其中以色列和新加坡公司的车牌识别系统较为领先。由于车牌设计的不同,不存在一种通用的车牌检测技术。因中国车牌包括汉字,使得国外车牌识别系统不能直接用于国内车牌识别,需要中国自主研发。中国的车牌识别技术研究起步略晚于西方国家。目前国内技术领先的是中科院的“汉王眼”和香港的视觉科技公司。但是,这些投入市场的车牌识别系统的使用都有一定的局限性,在车牌图像质量差、车牌倾斜、光照条件不理想等情况时,识别率会大幅度降低。
为了克服上述问题,本文对不同光照条件下获得的车牌图像进行了识别和分析。由于车牌涉及保密信息,暂时没有公开的大规模数据集可供使用和实验对比。本文先对车牌数据进行采集,统一处理320×240分辨率的图片,建立测试用数据库。数据库分为两类:测试库1为光照条件较好,无阴影车牌;测试库2为光照条件较差,有阴影车牌。采用传统的模板匹配算法建立车牌识别系统,模板图片采用中值滤波算法进行平均处理,统一建立分辨率为20×40的识别模板库。为方便用户使用, 利用Matlab建立了图形用户交互界面(GUI) 。通过对测试库车牌实验, 可以看到车牌成像质量对识别率
有很大影响。因此在建立车牌识别系统时,适当角度的补光可有效提高识别的准确率。
1 图像的预处理
由于车牌多是通过交通监控等条件获得,因周边交通环境、拍摄角度、光照和实时性要求等多种原因,得到的照片直接用于车牌的识别准确率难以得到保证。因此,预处理图像可以提高识别的准确性。
1.1图像的灰度化
由相机拍摄的牌照通常是彩色图像, 即RGB图像为了提高车牌识别系统的速度、节省内存, 先将RGB图像转换为灰度图.红、蓝、绿三种基本颜色按不同的比例可以组成任意一种颜色,所以车牌照片的每一个颜色都可由不同比例的红、蓝、绿组成。灰度图像可以用数组I表示,数组且I的数据类型一般有整数和双精度两种。通常0代表黑色,255代表白色。采用适合于人类视觉系统的转换方法,如公式(1)所示。
在这里插入图片描述
其中,系数a,b,c要大于0,且a+b+c=1,Y表示灰度值,R、G、B分别表示红色、绿色和蓝色,a=0.299、b=0.584、c=0.117.图1显示了带有车牌照片的原始车牌图像,图2显示了在公式(1)的灰度处理之后车牌图像的灰度图像。
在这里插入图片描述
图1 车牌原图
在这里插入图片描述
图2 车牌灰度图
1.2 图像二值化
图像二值化不仅可以大大减少数据量,还可以突出图像的目标轮廓,有利于后续的图像定位和分割处理。在车牌图像的二值化处理中,被确定为目标区域的像素具有大于或等于阈值的灰度值,计算如公式(2)所示。经过测试,当阈值th=0.76时,效果较好,结果如图3所示。
在这里插入图片描述
图3 车牌的二值化图
1.3 图像的边缘检测
本文采用Roberts算子来进行边缘检测。采用该算子的计算量小, 速度快, 便于后续的实时处理, 其模板如表1所示。若梯度幅度G(x,y)大于设定的阈值,则判断为边缘。G(x,y)计算式如公式(3)所示,此处阈值选择为0.15。
表1 Roberts算子模板
在这里插入图片描述
其中,f(x,y)是图像空间(x,y)处的灰度值,G(x,y)是f(x,y)的梯度幅度。图4是边缘检测后的结果。
在这里插入图片描述
图4 车牌的边缘检测图

2车牌识别系统的设计
2.1车牌定位

车牌定位采用颜色特征提取,一般的车牌区域都具有很明显的特点,中国的车牌以蓝底白字居多。传统的方法一般根据车牌的色彩特征,彩色像素点统计的方法分割出合理的车牌区域假设经相机采集包含车牌的RGB图像, 水平方向记为y,垂直方向记为x。首先,确定车牌各分量分别对应的颜色范围。其次,计算水平方向上对应的像素数量和车牌的合理面积。然后,计算分割的水平方向区域中垂直方向上该颜色范围内白的像素数量,并为定位设置合理的阈值。最后,根据对应方向的范围确定车牌区域。但是这种方法的准确率较低,本文采用文献[6]提出的颜色特征提取及二值化归类方法进行算法改进,计算方法如公式(4)所示。图5为定位后的车牌。
其中的蓝色特征可用式(4)表示:
在这里插入图片描述
图5 车牌定位图
2.2车牌字符识别
在字符识别前,先对车牌字符分割。字符分割采用阈值分割,主要包含两个步骤【7]。
(1)确定所需要进行分割的阈值。
(2)将阈值与每个点的灰度值对照,以达到分割目的。
将分割后的图像进行归一化处理,可以有效地将字符图像的大小进行缩放以得到大小一致的字符图像,便于后续的字符识别。
模板匹配一般是数字图像处理中最常使用的识别方法之一,先建立模板库,再将字符输入到模板中寻找与之最佳匹配的模板字符。
模板图像大小为20×40,模板库由数字0-9,32个省份的简称汉字和大写英文字母(其中O一般不用作车牌字母)三部分组成。模板的部分图像如图6所示。
在这里插入图片描述
图6 模板库部分图片
在这里插入图片描述

⛄二、部分源代码

function varargout = lpr_gui(varargin)

gui_Singleton = 1;
gui_State = struct(‘gui_Name’, mfilename, …
‘gui_Singleton’, gui_Singleton, …
‘gui_OpeningFcn’, @lpr_gui_OpeningFcn, …
‘gui_OutputFcn’, @lpr_gui_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

function lpr_gui_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
set(handles.axes1,‘visible’,‘off’)
set(handles.axes2,‘visible’,‘off’)
set(handles.text2,‘visible’,‘off’)
set(handles.text6,‘visible’,‘off’)
set(handles.text3,‘visible’,‘off’)

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

function pushbutton1_Callback(hObject, eventdata, handles)

%% ͼƬ
global img;

set(handles.axes1,‘visible’,‘off’)
set(handles.axes2,‘visible’,‘off’)
set(handles.text6,‘visible’,‘off’)
set(handles.text3,‘visible’,‘off’)
set(handles.text5,‘visible’,‘off’)
set(handles.text2,‘visible’,‘on’)
[filename,pathname]=uigetfile({‘.jpg’;'.bmp’;‘*.gif’},‘ѡ ͼƬ’);
if isequal(filename,0)
disp(‘Users Selected Canceled’);
else
str=[pathname filename];
img = imread(str);
axes(handles.axes1);%axes1 ı ʾ
% set(handles.axes1,‘visible’,‘on’)

imshow(img);
end;

function pushbutton2_Callback(hObject, eventdata, handles)
global img;
set(handles.axes2,‘visible’,‘off’)
axes(handles.axes1);%axes1 ı ʾ
% set(handles.axes1,‘visible’,‘on’)
imshow(img);
I1=rgb2gray(img);
%subplot(2,3,2),imshow(I1);title(’ Ҷ ͼ’);
%subplot(2,3,3),imhist(I1);title(’ Ҷ ͼֱ ͼ’);
I2=edge(I1,‘canny’,[0.2,0.55]);
%subplot(2,3,4);imshow(I2);title('canny ӱ Ե ‘)
se=[1;1;1];
I3=imerode(I2,se);
%subplot(2,3,5);imshow(I3);title(’ ʴ ͼ ');
se=strel(‘rectangle’,[30,30]);
I4=imclose(I3,se);
% figure(5),imshow(I4);title('ƽ ͼ ‘);
I5=bwareaopen(I4,3500);
%subplot(2,3,6);imshow(I5);title(’ Ӷ Ƴ С ');
[y,x,~]=size(I5);
myI=double(I5);
%begin ɨ
Blue_y=zeros(y,1);
for i=1:y
for j=1:x
if(myI(i,j,1)==1)
% myI(i,j,1) myIͼ Ϊ(i,j) ĵ Ϊ ɫ
% Blue_y Ӧ е Ԫ white_y(i,1)ֵ 1
Blue_y(i,1)= Blue_y(i,1)+1;% ɫ ص ͳ
end
end
end
[~,MaxY]=max(Blue_y);%tempΪ white_y Ԫ е ֵ MaxYΪ ֵ е λ ã
PY1=MaxY;
while ((Blue_y(PY1,1)>=50)&&(PY1>1))
PY1=PY1-1;
end
PY2=MaxY;
while ((Blue_y(PY2,1)>=10)&&(PY2<y))
PY2=PY2+1;
end
% IY=img(PY1:PY2,:😅;
%IYΪԭʼͼ I н ȡ PY1 PY2֮ IJ
%end ɨ
%begin ɨ
Blue_x=zeros(1,x);% һ ȷ x ij
for j=1:x
for i=PY1:PY2
if(myI(i,j,1)==1)
Blue_x(1,j)= Blue_x(1,j)+1;
end
end
end
PX1=1;
while ((Blue_x(1,PX1)❤️)&&(PX1<x))
PX1=PX1+1;
end
PX2=x;
while ((Blue_x(1,PX2)❤️)&&(PX2>PX1))
PX2=PX2-1;
end
PX1=PX1+3;
% PX2=PX2;
% PY1=PY1-2.5;
PY1=PY1-2;
%end ɨ
dw=img(PY1:PY2,PX1:PX2,:);

%% ƶ λ

bw=rgb2gray(dw);
bw1=edge(bw,‘sobel’,‘horizontal’);
theta=0:179;
r=radon(bw1,theta);
[m,n]=size®;
c=1;
for i=1:m
for j=1:n
if r(1,1)<r(i,j)
r(1,1)=r(i,j);
c=j;
end
end
end
rot=90-c+2;
pic=imrotate(bw,rot,‘crop’);
%zzz=figure(2),subplot(3,2,1),imshow(bw),title('1. λ ij ƻҶ ͼ ');
%subplot(3,2,2),imshow(pic),title('2. radon ˮƽ ');

%%
% ַ ָ ǰ Ԥ

d=im2bw(pic,graythresh(pic)); % d: ֵͼ
%subplot(3,2,3),imshow(d),title('2. ֵ ˲ ')
% ijЩͼ в
% ͻ ʴ
% se=strel(‘square’,3); % ʹ һ 3X3 ν Ԫ ض Դ ͼ
se=eye(2); % eye(n) returns the n-by-n identity matrix λ
[m,n]=size(d);
if bwarea(d)/m/n>=0.365
d=imerode(d,se);
elseif bwarea(d)/m/n<=0.235
d=imdilate(d,se);
end
% subplot(3,2,4),imshow(d),title('3. ͻ ʴ ')
% ͼ ı߿ вü ֻ Ч ַ
[y1,x1,~]=size(d);
I3=double(d);
TT=1;
Y1=zeros(y1,1);
for i=1:y1
for j=1:x1
if(I3(i,j,1)==1)
Y1(i,1)= Y1(i,1)+1 ;
end
end
end
Py1=1;
Py0=1;
while ((Y1(Py0,1)<30)&&(Py0<y1))
Py0=Py0+1;
end
Py1=Py0;
while((Y1(Py1,1)>=30)&&(Py1<y1))
Py1=Py1+1;
end
d=d(Py0:Py1,:😅;
I3=double(d);
[y1,x1,z1]=size(d);

% ǰ׵

for j=round(x10.28):round(x10.33)
for i=1:y1
d(i,j)= 0;
end
end

axes(handles.axes2);%axes1 ı ʾ
imshow(d);

% subplot(2,2,4);
% imshow(d),title('4.Ŀ 공 ');
% з Ͻ лҶ ֵ ۼ
X1=zeros(1,x1);
for j=1:x1
for i=1:y1
if(d(i,j,1)==1)
X1(1,j)= X1(1,j)+1;
end
end
end

% plot(0:x1-1,X1),title(’ з ص Ҷ ֵ ۼƺ ‘),xlabel(’ ֵ’),ylabel(’ ۼ ');
Px0=1;
Px1=1;
%subplot(3,2,4),imshow(d),title('3. ͻ ʴ ')

% ߸ ַ зָ
for i=1:7

if i<=1
    t1=20;
else
    t1=13;
end

while ((X1(1,Px0)<3)&&(Px0<x1))
    Px0=Px0+1;
end
Px1=Px0;
while (((X1(1,Px1)>=3)&&(Px1<x1))||((Px1-Px0)<10))
    Px1=Px1+1;
end

if Px1-Px0<t1
    Px0=Px1;
    
    
    while ((X1(1,Px0)<3)&&(Px0<x1))
        Px0=Px0+1;
    end
    Px1=Px0;
    while (((X1(1,Px1)>=3)&&(Px1<x1))||((Px1-Px0)<10))
        Px1=Px1+1;
    end
          
end   
Z=d(:,Px0:Px1,:);
word=imresize(Z,[200 100]);

%%    Ҫд   ָ õ  ַ ,         е ע  ȥ  

  %path = [num2str( round(1000*rand())),'_.bmp'];
  %imwrite(word,path);
 %%
switch strcat('Z',num2str(i))
    case 'Z1'
        plate_word(:,:,1)=word;
    case 'Z2'
        plate_word(:,:,2)=word;
    case 'Z3'
        plate_word(:,:,3)=word;
    case 'Z4'
        plate_word(:,:,4)=word;
    case 'Z5'
        plate_word(:,:,5)=word;
    case 'Z6'
        plate_word(:,:,6)=word;
    otherwise
        plate_word(:,:,7)=word;
end

% plate_word(:,:,1);

%     figure(3);
% subplot(3,7,i+14);   
%imshow(Z);
Px0=Px1;

end

liccode=char([‘0’:‘9’ ‘A’:‘H’ ‘J’:‘N’ ‘P’:‘Z’ ’ ’ ‘u’]); % Զ ʶ ַ
plate = char([’ ’ ‘A’:‘F’]);
for num=1:7
t=plate_word(:,:,num);
SegBw2=imresize(t,[40 20],‘nearest’); %ʵ ڲ ֵ Ŵ ͼ
if num1 % һλ ʶ
kmin=35;
kmax=38;
elseif num
2 % ڶ λ A~Z ĸʶ
kmin=11;
kmax=34;
else num>=3; % λ Ժ ĸ ʶ
kmin=1;
kmax=34;
end
Error = 1000001:1000039;

    for i=1:500
        Error(i)=666666;
    end        
    for k2=kmin:kmax
        fname=strcat('ģ  \1\',liccode(k2),'.bmp');   
        SamBw2 = imread(fname);
        SamBw2=imresize(SamBw2,[40 20],'nearest');  %ʵ      ڲ ֵ   Ŵ ͼ  
        SubBw2 = zeros(40,20);
        SegBw2 = double(SegBw2);
        SamBw2 = double(SamBw2);
        
        for  i=1:40
            for j=1:20
                SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);
            end
        end
               
       %      ൱      ͼ    õ       ͼ
            Dmax=0;
                for k1=1:40
                    for l1=1:20
                        if  ( SubBw2(k1,l1) ~=0 )
                            Dmax=Dmax+1;
                        end
                    end
                end
        Error(k2)=Dmax;
    end
    for k2=kmin:kmax
        fname=strcat('ģ  \2\',liccode(k2),'.bmp');   
        SamBw2 = imread(fname);
        SamBw2=imresize(SamBw2,[40 20],'nearest');  %ʵ      ڲ ֵ   Ŵ ͼ  
        SubBw2 = zeros(40,20);
        SegBw2 = double(SegBw2);
        SamBw2 = double(SamBw2);           
        for  i=1:40
            for j=1:20
                SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);
            end
        end
               
       %      ൱      ͼ    õ       ͼ
            Dmax=0;
                for k1=1:40
                    for l1=1:20
                        if  ( SubBw2(k1,l1) ~=0 )
                            Dmax=Dmax+1;
                        end
                    end
                end
        Error(k2+100)=Dmax;
    end
   [~,index]=min(Error);
   
   if(index>200)
       index = index -200;
   elseif(index>100)
       index = index -100;
   end       
   plate(num) = liccode(index);        

end

⛄三、运行结果

在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]李强,张娟.一种改进的基于模板匹配的污损车牌识别方法[J].智能计算机与应用. 2019,9(03).

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

🍅 仿真咨询
1 各类智能优化算法改进及应用

生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化

2 机器学习和深度学习方面
卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断

3 图像处理方面
图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知

4 路径规划方面
旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化

5 无人机应用方面
无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配

6 无线传感器定位及布局方面
传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化

7 信号处理方面
信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化

8 电力系统方面
微电网优化、无功优化、配电网重构、储能配置

9 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长

10 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

海神之光

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

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

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

打赏作者

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

抵扣说明:

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

余额充值