【车牌识别】基于matlab GUI模板匹配车牌库识别【含Matlab源码 416期】

举报
海神之光 发表于 2022/05/29 23:28:07 2022/05/29
【摘要】 一、车牌识别简介 车牌识别技术起源于20世纪80年代初期,图像模式识别和计算机视觉在其中起到至关重要的作用。随着计算机技术的迅速普及和进步,80年代中后期,车牌识别系统逐步投入市场并使用,但识别精度和速...

一、车牌识别简介

车牌识别技术起源于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-1
    subplot(1,k/2,(s+1)/2);
    imshow(bw( 1:y,fenge(s):fenge(s+1)));
end

function 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});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_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_1

axes(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 Icp

I = rgb2gray(Icp);
[m n]=size(I); % m n分别为图像的行 列数--- 进行垂直灰度投影
for y=1:n
     V(y)=sum(I(1:m,y));
end


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283

三、运行结果

在这里插入图片描述

四、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.

文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。

原文链接:qq912100926.blog.csdn.net/article/details/114220994

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。