车牌识别的matlab程序程序讲解模板Word文档下载推荐.docx
《车牌识别的matlab程序程序讲解模板Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《车牌识别的matlab程序程序讲解模板Word文档下载推荐.docx(9页珍藏版)》请在冰豆网上搜索。
subplot(3,2,5),imshow(I_close),title('
填充后图像'
I_final=bwareaopen(I_close,2000);
%去除聚团灰度值小于2000的部分
subplot(3,2,6),imshow(I_final),title('
形态滤波后图像'
%==========================车牌分割=============================
I_new=zeros(size(I_final,1),size(I_final,2));
location_of_1=[];
fori=1:
size(I_final,1)%寻找二值图像中白的点的位置
forj=1:
size(I_final,2)
ifI_final(i,j)==1;
newlocation=[i,j];
location_of_1=[location_of_1;
newlocation];
end
end
mini=inf;
maxi=0;
size(location_of_1,1)
%寻找所有白点中,x坐标与y坐标的和最大,最小的两个点的位置
temp=location_of_1(i,1)+location_of_1(i,2);
iftemp<
mini
mini=temp;
a=i;
iftemp>
maxi
maxi=temp;
b=i;
first_point=location_of_1(a,:
%和最小的点为车牌的左上角
last_point=location_of_1(b,:
%和最大的点为车牌的右下角
x1=first_point
(1)+4;
%坐标值修正
x2=last_point
(1)-4;
y1=first_point
(2)+4;
y2=last_point
(2)-4;
I_plate=I(x1:
x2,y1:
y2);
I_plate=OTSU(I_plate);
%以OTSU算法对分割出的车牌进行自适应二值化处理
I_plate=bwareaopen(I_plate,50);
figure,imshow(I_plate),title('
车牌提取'
)%画出最终车牌
%=========================字符分割============================
X=[];
%用来存放水平分割线的横坐标
flag=0;
forj=1:
size(I_plate,2)
sum_y=sum(I_plate(:
j));
iflogical(sum_y)~=flag%列和有变化时,记录下此列
X=[Xj];
flag=logical(sum_y);
figure
forn=1:
7
char=I_plate(:
X(2*n-1):
X(2*n)-1);
%进行粗分割
fori=1:
size(char,1)%这两个for循环对分割字符的上下进行裁剪
ifsum(char(i,:
))~=0
top=i;
break
size(char,1)
ifsum(char(size(char,1)-i,:
bottom=size(char,1)-i;
char=char(top:
bottom,:
subplot(2,4,n);
imshow(char);
char=imresize(char,[32,16],'
nearest'
%归一化为32*16的大小,以便模板匹配
eval(strcat('
Char_'
num2str(n),'
=char;
'
));
%将分割的字符放入Char_i中
%==========================字符识别=============================
char=[];
store1=strcat('
京'
'
津'
沪'
渝'
冀'
晋'
辽'
吉'
黑'
苏'
浙'
...%汉字识别
'
皖'
闽'
赣'
鲁'
豫'
鄂'
湘'
粤'
琼'
川'
贵'
云'
陕'
...
甘'
青'
藏'
桂'
新'
宁'
港'
蒙'
34
Im=Char_1;
Template=imread(strcat('
chinese\'
num2str(j),'
.bmp'
%chinese文件附在最后
Template=im2bw(Template);
Differ=Im-Template;
Compare(j)=sum(sum(abs(Differ)));
index=find(Compare==(min(Compare)));
char=[charstore1(index)];
store2=strcat('
A'
B'
C'
D'
E'
F'
G'
H'
J'
K'
L'
M'
N'
P'
Q'
R'
S'
T'
U'
V'
W'
X'
Y'
Z'
0'
1'
2'
3'
4'
5'
6'
7'
8'
9'
fori=2:
7%字母数字识别
35
Im=eval(strcat('
num2str(i)));
cha&
num\'
%cha&
num文件附在最后
char=[charstore2(index)];
figure,imshow(I),title(strcat('
车牌为:
char))
信研-11XX2011301XXXXXX
模式识别作业—车牌识别
1、作业要求:
要求:
任给一幅符合假定的图片,自动识别出车牌号。
如:
给定如下图片,自动输出(京JX9168)
2、设计步骤:
所设计的车牌识别的流程包括图像预处理,车牌分割,字符分割,及字符识别。
详见matalb程序。
3、程序讲解
1)第一部分为图像的预处理。
此部分借鉴了别人的程序,将灰度图像以sobel算子检测边缘;
再对边缘图像进行腐蚀,去除掉细的,间断的边缘;
对剩下的区域进行闭合以填充图像,此时可以看到车牌区域形成了一个大的连通域;
调用bwareaopen函数去掉小的连通域,此时整个二值图像只b剩下了车牌区域为1。
如下图所示:
2)第二部分为车牌的提取
此部分的工作为将上一步的白色区域取出,其对应的就是车牌区域。
设计思路如下:
首先将二值图像f中所有为1的点的坐标放入数组location_of_1中,对这些坐标遍历计算,寻找x坐标与y坐标之和最大的点a与最小的点b,a即为车牌的左上角,b为车牌的右下角。
通过这两个坐标将车牌分割出来,并对灰度车牌图像以OTSU算法进行自适应二值化分割。
最终效果如下:
3)第三部分为字符分割
此部分的工作是将车牌里的7个字符分别提取出来。
方法如下:
对该二值图从左向右像按列z遍历,计算每一列之和,没有白点的列和为0,有白点的列和非零,转换为逻辑1,记录下所有列和在0与1转换的列,即为需要切割的列,共有14列,可切出7个字符。
切割出单个字符后,放入char_(i)中,并切割掉每个字符的上下的空白区域,完成精确切割,效果如下:
4)第四部分为字符的识别
识别的方法主要有模板匹配字符识别算法,统计特征匹配算法,神经网络字符识别算法和支持向量机模式识别算法。
由于分割的字符效果较好,为明显畸变,模k板维数低(32*16),且因为时间关系,这里采用了模板匹配识别算法。
该程序把切割出的字符与库里的汉字和字符的模板做减法运算,找到差别点最少的模板为对应模板,输出该模板对应的字符,最后识别出其为“京JX9168”。
如下:
Chinese模板文件:
Cha&
num模板文件:
(将图片放入文件夹中,放在程序目录下)
OTSU.m文件:
functionJ=OTSU(I)
Hi=imhist(I);
%直方图
sum1=sum(Hi);
255
w1=sum(Hi(1:
i))/sum1;
%第一类概率
w2=sum(Hi((i+1):
256))/sum1;
%第二类概率
m1=(0:
(i-1))*Hi(1:
i)/sum(Hi(1:
i));
%第一类平均灰度值
m2=(i:
255)*Hi((i+1):
256)/sum(Hi((i+1):
256));
%第二类平均灰度值
Jw(i)=w1*w2*(m1-m2)^2;
[maxm,thresh]=max(Jw);
%寻找阈值
%subplot(2,2,1);
imshow(I);
title('
原图像'
%subplot(2,2,[3,4]);
imhist(I);
holdon;
plot(thresh,3,'
+r'
title((strcat('
阈值为'
num2str(thresh))));
I(find(I<
=thresh))=0;
I(find(I>
thresh))=256;
%二值化
J=I;
%subplot(2,2,2),imshow(I),title('
二值化图像zk'