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

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

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

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

⛄一、车牌识别简介

车牌识别技术起源于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 = 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_flag1
[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

⛄三、运行结果

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

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 曾泉,谭北海.基于SVM和BP神经网络的车牌识别系统[J] .电子科技, 2016, 29(1) :98-101.

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 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

海神之光

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

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

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

打赏作者

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

抵扣说明:

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

余额充值