一、简介
基于matlab车牌识别系统GUI界面设计,车牌识别的难点主要有两部分:第一部分是车牌照片本身的问题,第二部分是系统的问题。
车牌照片的原因:在车牌识别系统中,有许多汽车图片都是在汽车行驶的过程中拍摄的,这就会使得汽车图像本身存在着大量的问题,比如图像模糊,难以对它进行处理。还有是光线的原因,光线照射在汽车图片上,图片反光也就模糊了图像,使得字符不清晰。还有就是环境的变换,也会导致图像变得不可辨别,一些灰尘或者是水滴,这都会让图像变得模糊。以上都是因为汽车图像本身的原因,会让识别的效果变得很差。
系统的原因有:我国对车牌的理没有统一的标准,字符和背景的颜色有各种各样的,所以在识别的过程中,对车牌上的文字分割这方面的难度比较大。在我国的车牌图片上,它的信息比较多,有汉字、数字和字母,它们字符的种类比较多,所以正确的识别它们是比较困难的,这也会提高对车牌识别的难度。还有最后的一点就是车牌在汽车上的位置不是固定的,比如轿车和卡车,它们所在的位置就有很大区别。这些都是车牌在识别过程中,遇到的难点。
二、部分源码
function varargout = main(varargin)
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
[filename, pathname] = uigetfile({'*.jpg;*.tif;*.png;*.gif', 'All Image Files';...
'*.*', '所有文件' }, '选择图像文件', fullfile(pwd, 'images/川F1A666.jpg'));
if filename == 0
return;
end
% 文件名
file = fullfile(pathname, filename);
% 图像矩阵
Img = imread(file);
%激活第一个轴对象
axes(handles.axes1);
imshow(Img, []);
%激活第二个轴对象
axes(handles.axes2);
imshow(Img, []);
%保存为全局变量
handles.Img = Img;
guidata(hObject, handles);
% --- Executes on button press in pushbutton2.
Img=handles.Img;
%对图像I进行灰度处理
I_gray=rgb2gray(Img);
axes(handles.axes3);
imshow(I_gray);
title('灰度图像');
%利用Sobel算子进行边缘检测
I_edge=edge(I_gray,'sobel');
axes(handles.axes4);
imshow(I_edge)
title('边缘检测后图像');
se=[1;1;1];
%对边缘图像进行腐蚀
I_erode=imerode(I_edge,se);
axes(handles.axes5);
imshow(I_erode);
title('腐蚀后边缘图像');
se=strel('rectangle',[25,25]);
%填充图像
I_close=imclose(I_erode,se);
axes(handles.axes6);
imshow(I_close)
title('填充后图像');
%去除聚团灰度值小于1500的部分
I_final=bwareaopen(I_close,1500);
axes(handles.axes7);
imshow(I_final);
title('形态滤波后图像');
I_new=zeros(size(I_final,1),size(I_final,2));
location_of_1=[];
%寻找二值图像中白的点的位置
for i=1:size(I_final,1)
for j=1:size(I_final,2)
if I_final(i,j)==1;
newlocation=[i,j];
location_of_1=[location_of_1;newlocation];
end
end
end
mini=inf;maxi=0;
%寻找所有白点中,x坐标与y坐标的和最大,最小的两个点的位置
for i=1:size(location_of_1,1)
temp=location_of_1(i,1)+location_of_1(i,2);
if temp<mini
mini=temp;
a=i;
end
if temp>maxi
maxi=temp;
b=i;
end
end
%和最小的点为车牌的左上角
first_point=location_of_1(a,:);
%和最大的点为车牌的右下角
last_point=location_of_1(b,:);
%坐标值修正
x1=first_point(1)+10;
x2=last_point(1)-4;
y1=first_point(2)+10;
y2=last_point(2)-4;
I_plate=Img(x1:x2,y1:y2);
g_max=double(max(max(I_plate)));
g_min=double(min(min(I_plate)));
% T为二值化的阈值
T=round(g_max-(g_max-g_min)/3);
I_plate =im2bw (I_plate,T/256);
I_plate=bwareaopen(I_plate,20);
I_plate(: ,y2)=0;
axes(handles.axes8);
I_plate=bwareaopen(I_plate,100);
%画出最终车牌
imshow(I_plate)
title('车牌提取')
三、运行结果
四、matlab版本
MATLAB R2019a
五、学习与交流
文中不足之处请大家多多指教,学习与交流可以联系企鹅:3752243968
文中部分源码仅供参考,若需要全部代码可以私信(有偿)