【车牌识别】基于matlab GUI模板匹配车牌库识别【含Matlab源码 416期】
一、车牌识别简介
车牌识别技术起源于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 模板库部分图片
二、部分源代码
close all;
clc[fn,pn,fi] = uigetfile('*.jpg','请选择所要识别的图片');
I = imread([pn fn]); % 读取图像 参数为图像名称和图像路径
figure,imshow(I);
title('原始图像'); %显示原始图像 figure(1),imshow(I);title('原图');%显示原始图像
I1=rgb2gray(I);%将彩图转换位灰度图I1
figure(2),subplot(1,2,1),imshow(I1);title('灰度图');%创建显示I1图像,做图1的坐标轴
figure(2),subplot(1,2,2),imhist(I1);title('灰度直方图');%创建显示I1的柱状图,做图2的坐标轴
I2=edge(I1,'roberts',0.16,'both');
figure(3),subplot(2,2,1),imshow(I2);title('roberts算子边缘检测')
se=[1;1;1];
I3=imerode(I2,se);
figure(3),subplot(2,2,2),imshow(I3);title('腐蚀后图像');
se=strel('rectangle',[25,25]);
I4=imclose(I3,se);
figure(3),subplot(2,2,3),imshow(I4);title('平滑图像的轮廓');
I5=bwareaopen(I4,2000);
figure(3),subplot(2,2,4),imshow(I5);title('从对象中移除小对象');%------车牌定位,并得到车牌的上边界PY1、下边界PY2、左边界PX1、右边界 PX2
[PY2,PY1,PX2,PX1] = Dingwei_Chepai(I); % 1.定位车牌边界%------车牌修正,将车牌轮廓稍微扩张 % 2.修正边界
[PY2,PY1,PX2,PX1,threshold] = Xiuzheng_Chepai(PY2,PY1,PX2,PX1);%------框选出车牌信息,得到车牌图像
bw = I(PY1:PY2,PX1:PX2,:); % 3.裁剪车牌照
figure,subplot(121),imshow(bw);
title('车牌图像'); %------车牌图像灰度处理 % 4. 灰度处理
bw = rgb2gray(bw); % 车牌灰度图像
subplot(122),imshow(bw); % 显示车牌灰度图像
title('灰度图像'); % 图像标题% I = bw;
% [m n]=size(I); % m n分别为图像的行 列数
%--- 进行垂直灰度投影
% for y=1:n
% V(y)=sum(I(1:m,y));
% end
% y=1:n;
% figure
% subplot(211), plot(y,V(y));
% title('垂直灰度投影');
% % 进行水平灰度投影
% for x=1:m
% L(x)=sum(I(x,:));
% end
% x=1:m;
% subplot(212),plot(x,L(x));
% title('水平灰度投影'); %------对车牌倾斜位置矫正
qingxiejiao = rando_bianhuan(bw); % 5. 获得图像倾斜角
bw = imrotate(bw,qingxiejiao,'bilinear','crop'); % 6.位置矫正
%图像进行位置矫正:取值为负值向右旋转 并选区双线性插值 并输出同样尺寸的图像
figure,subplot(121),imshow(bw); % 显示修正后的图像
title('倾斜校正');%------转化为二值化图像
bw = imbinarize(bw,graythresh(bw)); % 7.二值化处理
subplot(122), imshow(bw);
title('二值图像');%------形态学处理
bw = Xingtaixue_Chuli(bw,threshold); % 8.形态学操作%------裁剪使得字体紧贴边界
bw = touying(bw); % 9. 贴近字符裁剪
%对图像进一步裁剪,保证边框贴近字体
figure,subplot(121),imshow(bw);
title('上下边界裁剪');
bw=~bw;
bw = bwareaopen(bw, threshold);
% 移除小面积对象函数 删除二值图像BW中面积小于threshold的对象
bw=~bw; % 10. 擦除
subplot(122),imshow(bw);
title('擦除');%------分割车牌字符
[y,x] = size(bw); % 11. 单个字符边界分割,并将边界信息赋值与fenge数组中
fenge = shuzifenge(bw,qingxiejiao);%----拆分过的车牌字符 % 12. 利用fenge数组显示七个字符
[m,k]=size(fenge);
for s=1:2:k-1subplot(1,k/2,(s+1)/2);imshow(bw( 1:y,fenge(s):fenge(s+1)));
endfunction varargout = GUI(varargin)gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...'gui_Singleton', gui_Singleton, ...'gui_OpeningFcn', @GUI_OpeningFcn, ...'gui_OutputFcn', @GUI_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
% End initialization code - DO NOT EDIT% --- Executes just before GUI is made visible.
function GUI_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 GUI (see VARARGIN)% Choose default command line output for GUI
handles.output = hObject;global I
global Icp
global threshold
global qingxiejiao
global xiuzhenghanzi
global xiuzhengzimu
global xiuzhengzm_sz_1
global xiuzhengzm_sz_2
global xiuzhengshuzi_1
global xiuzhengshuzi_2
global xiuzhengshuzi_3 % Update handles structure
guidata(hObject, handles);% UIWAIT makes GUI wait for user response (see UIRESUME)
% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line.
function varargout = 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;% --- Executes on button press in duqu.
function duqu_Callback(hObject, eventdata, handles)global I
global Img_0
global Img_1axes(handles.YuanTuXiang)
[fn,pn,~] = uigetfile('*.jpg','请选择所要识别的图片');
I = imread([pn fn]); % 读取图像 参数为图像名称和图像路径 =====1
% =========================================================================
Img_0 = rgb2gray(I); %*****灰度处理 =====2
Img_1 = edge(Img_0,'roberts'); %********roberts算子边缘检测 =====3
% =========================================================================
imshow(I)
title('原图像');function Huidu_Callback(hObject, eventdata, handles)
% hObject handle to Huidu (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global Img_0
axes(handles.Hui)
imshow(Img_0)
title('灰度处理');function Zhifang_Callback(hObject, eventdata, handles)
% hObject handle to Zhifang (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global Img_0
axes(handles.Zhi)
imhist(Img_0)
title('直方图');% --- Executes on button press in Bianyuanjiance.
function Bianyuanjiance_Callback(hObject, eventdata, handles)
% hObject handle to Bianyuanjiance (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global Img_1
axes(handles.Bian)
imshow(Img_1)
title('边缘检测');% --- Executes on button press in chepaidingwei.
function chepaidingwei_Callback(hObject, eventdata, handles)global I
global Icp
global threshold
global qingxiejiao
global bw
global Img_2
global Img_3
global bw_0
global bw0
global bw1
global bw2% =========================================================================
[PY2,PY1,PX2,PX1] = Dingwei_Chepai(I); % 1.定位车牌边界%------车牌修正,将车牌轮廓稍微扩张 % 2.修正边界
[PY2,PY1,PX2,PX1,threshold] = Xiuzheng_Chepai(PY2,PY1,PX2,PX1);%------框选出车牌信息,得到车牌图像
I = I(PY1:PY2,PX1:PX2,:);
Img_2 = I; %************预定位的车牌
% =========================================================================
bw = rgb2gray(I); %车牌灰度处理qingxiejiao = rando_bianhuan(bw);
Icp = imrotate(I,qingxiejiao,'bilinear','crop');
Img_3 = Icp; %********矫正后的车牌
% =========================================================================
% =========================================================================%------转化为二值化图像
bw = im2bw(Icp,graythresh(Icp)); %******二值图像
bw_0 = bw;
% =========================================================================
%------形态学处理:断开H连接,移除毛刺,先腐蚀后膨胀,擦除,取反
bw = Xingtaixue_Chuli(bw,threshold);
bw0 = bw; %******形态学处理
% =========================================================================
%------对图像进一步裁剪,保证边框贴近字体
bw = touying(bw); %******定位剪切
bw1 = bw;
% =========================================================================
% -----移除小面积对象函数 删除二值图像BW中面积小于threshold的对象
bw=~bw;
bw = bwareaopen(bw, threshold);
bw=~bw;
bw2 =bw; %******移除噪声
% =========================================================================
% =========================================================================
axes(handles.Yu)
imshow(Img_2);
title('车牌预定位','color','b');% --- Executes on button press in pushbutton21.
function pushbutton21_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton21 (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 ZifuFeng.
global Img_3
axes(handles.Jiao)
imshow(Img_3);
title('矫正车牌','color','b');% --- Executes on button press in pushbutton23.
function pushbutton23_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton23 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global IcpI = rgb2gray(Icp);
[m n]=size(I); % m n分别为图像的行 列数--- 进行垂直灰度投影
for y=1:nV(y)=sum(I(1:m,y));
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源码 416期】相关推荐
- 【图像处理】基于matlab GUI多功能图像处理系统【含Matlab源码 1876期】
⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[图像处理]基于matlab GUI多功能图像处理系统[含Matlab源码 1876期] 点击上面蓝色字体,直接付费下载,即可. 获取代码 ...
- 【机械仿真】基于matlab GUI曲柄摇杆机构运动仿真【含Matlab源码 1608期】
一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[机械仿真]基于matlab GUI曲柄摇杆机构运动仿真[含Matlab源码 1608期] 点击上面蓝色字体,直接付费下载,即可. 获取代码 ...
- 【光学】基于matlab GUI光栅条纹投影生成【含Matlab源码 2118期】
⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI光栅条纹投影生成[含Matlab源码 2118期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...
- 【机械仿真】基于matlab GUI直齿圆柱齿轮应力计算【含Matlab源码 2077期】
⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[机械仿真]基于matlab GUI直齿圆柱齿轮应力计算[含Matlab源码 2077期] 点击上面蓝色字体,直接付费下载,即可. 获取代 ...
- 【天体学】基于matlab GUI太阳天顶角计算【含Matlab源码 2229期】
一.⛄获取代码方式 获取代码方式1: 完整代码已上传我的资源:[天体学]基于matlab GUI太阳天顶角计算[含Matlab源码 2229期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...
- 基于java软考在线题库系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
基于java软考在线题库系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 基于java软考在线题库系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 本源码技术栈: ...
- 【车牌识别】模板匹配车牌库识别【含GUI Matlab源码 416期】
⛄一.车牌识别简介 车牌识别技术起源于20世纪80年代初期,图像模式识别和计算机视觉在其中起到至关重要的作用.随着计算机技术的迅速普及和进步,80年代中后期,车牌识别系统逐步投入市场并使用,但识别精度 ...
- 【字符识别】基于matlab GUI模板匹配(区域生长法)字母+数字识别【含Matlab源码 1695期】
一.手写大写字母识别技术简介 0 引言 在高校教学过程中,考试是最为普遍的一种教学评估.综合练习的教学手段,随着科技进步,考试阅卷的方式也发生了巨大的变革.传统的阅卷方式主要以人工阅卷为主, 存在效率 ...
- 【语音去噪】基于matlab GUI IIR滤波器语音去噪【含Matlab源码 1864期】
一.语音处理简介 语言是人们获得各类有效信息的主要途径, 而语音是语言的表现形式.语音在一定程度上可影响人们的生活, 因此, 语音信号的研究对科学领域和人们日常生活具有一定的研究价值和意义.噪声广泛存 ...
- 【数学建模】基于matlab GUI平行停车模拟仿真【含Matlab源码 1877期】
一.平行停车模拟仿真简介 近年来, 随着我国经济的快速发展, 机动车保有量也迅速增长.截至2012年底, 全国机动车保有量已达2.4亿辆, 城市"停车难"的问题日趋严重.统计结果表 ...
最新文章
- RxJS mergeMap 学习笔记
- JAVA中.jsp模板文件AJAX异步请求 - 数据渲染问题
- 【opencv学习】【hough圆检测】
- linux设置ipsan_linux 配置IPSAN存储
- java设计模式之单例模式详解
- 国家集训队论文99~08年全版
- html absolute溢出,position:absolute溢出处理
- 用PS将图片或表格中的英文变成中文
- c语言和java哪个好学_学java前要学C语言吗?java和C语言哪个好学?
- 2020年UI和UE的设计流行趋势揭秘!设计师最爱的是?
- python多窗口传递信息_PyQT5 中两个界面之间数据传递
- Vue3 的 ref 和 reactive 问题
- android 模拟器监听短信,android模拟器用命令和DDMS模拟来电和短信
- koa2使用ioredis存储session
- 激光测距仪构造原理及激光安全说明——TFN BKD系列双目军绿激光测距测高仪
- keep T 不是 KG等级_宅家锻炼堪比健身房,一对一“私教”,Keep 智能动感单车体验...
- iOS在image上画文字-画图片
- CDH /HDP 何去何从?
- antdv select下拉菜单自由扩展—添加输入框的使用问题
- Unity3D Shader系列之全息投影
热门文章
- mysql集群系统_轻松构建Mysql高可用集群系统
- linux下配置tomcat(详细)
- 2019如何新建流程图_如何用ppt制作海报和流程图
- vuejs 传参 向 子组件 父组件_Vue 2.6发布:新语法、性能改进、向3.0看齐
- qt 读取mysql数据库_qt 读取mysql数据库
- 在Nginx中配置SSL证书
- Python Selenium set Chrome Preference Download Location.
- js通过FormData对象 异步提交文件 实现文件上传(附带参数)
- Linux内核分析——第七章 链接
- Java关键字this的使用方法解析大全