一、车牌识别简介

车牌识别技术起源于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});
endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
elsegui_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==2PY1=jytexingff(I5)-2;PY2=texingy2(I5)+15;PX1=texingx(I5);PX2=texingx2(I5);
elsePY1=jyxiangsuPY1(I5)-2;PY2=jyxiangsuPY2(I5)+15;PX1=jyxiangsuPX1(I5);PX2=jyxiangsuPX2(I5);
endglobal 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.235d=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~=nwhile s(j)==0j=j+1;endk1=j;while s(j)~=0 && j<=n-1j=j+1;endk2=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] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
[5]呙润华,苏婷婷,马晓伟.BP神经网络联合模板匹配的车牌识别系统[J].清华大学学报(自然科学版),2013,53(9):1221-1226.
[6]鲁扬.基于BP神经网络的车牌识别算法研究[D].大庆:东北石油大学,2018.
[7]李强,张娟.一种改进的基于模板匹配的污损车牌识别方法[J].智能计算机与应用. 2019,9(03).
[8] 梁凯.基于MATLAB的汽车车牌识别系统的设计与实现[D] .哈尔滨:黑龙江大学, 2018.
[9]刘雄飞,朱盛春.车牌字符多特征提取与BP神经网络的识别算法[J].计算机仿真,2014,31(10):161-164,290.
[10] 曾泉, 谭北海.基于SVM和BP神经网络的车牌识别系统[J] .电子科技, 2016, 29(1) :98-101.

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

  1. 【指纹识别】基于模板匹配实现指纹识别门禁系统含Matlab源码

    1 简介 近年来,随着识别技术和网络技术的飞速发展,门禁系统也得到了飞跃式的发展,出现了基于指纹识别的门禁系统.这种系统具有安全性,方便性和易管理性等特点,是确保各重要部门出入口安全的有效措施,现已广 ...

  2. 【人脸识别】基于主成分分析PCA算法人脸识别门禁系统含Matlab源码

    1 简介 人脸是反应人身份的最直接的,最可靠的信息资源.通过人脸我们可以很快辨识一个人,这就是所谓的人脸识别.最初的人脸研究人员是一些从事社会心理学的工作者,从20世纪50年代开始有一些文献资料陆续发 ...

  3. 智能门禁(4)---基于face++和Onenet平台的人脸门禁系统

    基于face++和Onenet平台的人脸门禁系统 前言 第一次见识人脸解锁是在iPhoneX,前两天安卓8.0的小米6把我的手机也可以做到人脸结果.各大公司都推出了自己的人脸识别Api,因为个人兴趣, ...

  4. [附源码]计算机毕业设计Python+uniapp基于android手机设计并实现在线点单系统APPo682z(程序+源码+LW+远程部署)

    [附源码]计算机毕业设计Python+uniapp基于android手机设计并实现在线点单系统APPo682z(程序+源码+LW+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装 ...

  5. 基于JAVA政府机关门禁管理系统计算机毕业设计源码+系统+数据库+lw文档+部署

    基于JAVA政府机关门禁管理系统计算机毕业设计源码+系统+数据库+lw文档+部署 基于JAVA政府机关门禁管理系统计算机毕业设计源码+系统+数据库+lw文档+部署 本源码技术栈: 项目架构:B/S架构 ...

  6. 物联网毕业设计 基于RFID门禁防盗报警系统(源码+论文)

    文章目录 1 简介 2 绪论 2.1 课题背景与目的 3 射频识别 3.1 射频识别技术 3.2 射频识别模块 3.2.1 RFID模块 3.2.2 RFID模块组成 4 系统设计 4.1 系统架构 ...

  7. 基于JAVA国外摇滚乐队交流和周边售卖系统计算机毕业设计源码+数据库+lw文档+系统+部署

    基于JAVA国外摇滚乐队交流和周边售卖系统计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVA国外摇滚乐队交流和周边售卖系统计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: ...

  8. 【车牌识别】基于模板匹配算法的车牌识别门禁系统附matlab代码

    1 简介 随着社会的进步,汽车数量日益增加,城市交通状况越来越受到人们的重视,如何进行有效的交通管理成为目前亟待解决的问题.针对此问题,人们相继研制出了各种交通道路监管系统,各种各样的车牌识别系统也应 ...

  9. 【字符识别】基于matlab GUI模板匹配(区域生长法)字母+数字识别【含Matlab源码 1695期】

    一.手写大写字母识别技术简介 0 引言 在高校教学过程中,考试是最为普遍的一种教学评估.综合练习的教学手段,随着科技进步,考试阅卷的方式也发生了巨大的变革.传统的阅卷方式主要以人工阅卷为主, 存在效率 ...

  10. Python+Django实现基于人脸识别的门禁管理系统,附带源码!!

    已下项目为实战开发经验,微信搜索关注公众号 [ python语言空间 ],获取更多项目源码及资源. 项目介绍 基于人脸识别的门禁管理系统(Python+Django+RESTframework+Jso ...

最新文章

  1. Mac的brew和brew cask区别以及安装brew cask
  2. 计算机软件专业 课程,_计算机软件_专业的课程设置.pdf
  3. linux清理swap内容,Linux如何清理swap.buffer及cache等缓存
  4. 1.7 编程基础之字符串 32 行程长度编码 python
  5. LaTeX youngtab包——组合数学中棋盘格的绘制
  6. H3C DHCP实验
  7. java 重写equals的要点_浅谈java 重写equals方法的种种坑
  8. 学用 ASP.Net 之 System.Collections.Generic 下的容器类
  9. velocity 语法
  10. Linux安装PHPwind
  11. 基于java的仓库管理系统_基于Java的仓库管理系统.doc
  12. 康佳电视维修记 LED55M5580AF
  13. ARM 开发板修改MAC地址
  14. 计算机电子表格考点,计算机一级考试历年常见考点总结:Excel电子表格
  15. 年末去字节跳动面试,居然被面试官问的哑口无言,原因竟然是这个!!!
  16. 1.3双摇杆遥控器电路部分--基本外设电路(ST-link下载、串口、按键、摇杆、电量检测、LED指示灯、0.96寸OLED、NRF24L01)
  17. 智能灯泡的应用及使用场景
  18. 微信小程序(数据可视化、Canvas、绘制线段、图形、太极图、文本、图像、渐变、变形)
  19. vm virtualbox识别U盘并挂载
  20. 迅视财经 如何在“算法过滤”的世界里生活

热门文章

  1. Pycharm community配置Django
  2. Protocol(协议)(二十)
  3. @JVM垃圾收集器种类
  4. 【C#.NET】ASP.NET状态管理之四:Cache
  5. 在C#中列出进程,杀掉进程。
  6. 20200615每日一句
  7. win7 或 win10系统开机启动项设置
  8. 案例:多任务udp聊天器
  9. python语句和语法结构
  10. 一个简单的Matlab面向对象编程实例