基于matlab的车牌号码识别程序代码Word格式.docx
《基于matlab的车牌号码识别程序代码Word格式.docx》由会员分享,可在线阅读,更多相关《基于matlab的车牌号码识别程序代码Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
%转化为灰度图像
subplot(3,2,2),imshow(I1),title('
灰度图像'
I2=edge(I1,'
robert'
0.09,'
both'
%采用robert算子进行边缘检测
subplot(3,2,3),imshow(I2),title('
边缘检测后图像'
se=[1;
1;
1];
%线型结构元素
I3=imerode(I2,se);
%腐蚀图像
subplot(3,2,4),imshow(I3),title('
腐蚀后边缘图像'
se=strel('
rectangle'
[25,25]);
矩形结构元素
I4=imclose(I3,se);
%图像聚类、填充图像
subplot(3,2,5),imshow(I4),title('
填充后图像'
I5=bwareaopen(I4,2000);
%去除聚团灰度值小于2000的部分
subplot(3,2,6),imshow(I5),title('
形态滤波后图像'
[y,x,z]=size(I5);
I6=double(I5);
Y1=zeros(y,1);
fori=1:
y
forj=1:
x
if(I6(i,j,1)==1)
Y1(i,1)=Y1(i,1)+1;
end
end
[tempMaxY]=max(Y1);
figure();
subplot(3,2,1),plot(0:
y-1,Y1),title('
行方向像素点灰度值累计和'
),xlabel('
行值'
),ylabel('
像素'
%%%%%%%求的车牌的行起始位置和终止位置%%%%%%%%%
PY1=MaxY;
while((Y1(PY1,1)>
=50)&
&
(PY1>
1))
PY1=PY1-1;
PY2=MaxY;
while((Y1(PY2,1)>
(PY2<
y))
PY2=PY2+1;
IY=I(PY1:
PY2,:
:
X1=zeros(1,x);
fori=PY1:
PY2
if(I6(i,j,1)==1)
X1(1,j)=X1(1,j)+1;
subplot(3,2,2),plot(0:
x-1,X1),title('
列方向像素点灰度值累计和'
列值'
像数'
%%%%%%%求的车牌的列起始位置和终止位置%%%%%%%%%
PX1=1;
while((X1(1,PX1)<
3)&
(PX1<
x))
PX1=PX1+1;
PX2=x;
while((X1(1,PX2)<
(PX2>
PX1))
PX2=PX2-1;
PX1=PX1-1;
PX2=PX2+1;
%分割出车牌图像%
dw=I(PY1:
PY2,PX1:
PX2,:
subplot(3,2,3),imshow(dw),title('
定位剪切后的彩色车牌图像'
)
%4.2车牌字符分割
%确定车牌位置后下一步的任务就是进行字符切分分离出车牌号码的全部字符图像。
ifisrgb(dw)
I1=rgb2gray(dw);
%将RGB图像转化为灰度图像
elseI1=dw;
end
g_max=double(max(max(I1)));
g_min=double(min(min(I1)));
T=round(g_max-(g_max-g_min)/3);
%T为二值化的阈值
[m,n]=size(I1);
%d:
二值图像
%h=graythresh(I1);
I1=im2bw(I1,T/256);
subplot(3,2,4);
imshow(I1),title('
二值化车牌图像'
I2=bwareaopen(I1,20);
subplot(3,2,5);
imshow(I2),title('
形态学滤波后的二值化图像'
[y1,x1,z1]=size(I2);
I3=double(I2);
TT=1;
%%%%%%%去除图像顶端和底端的不感兴趣区域%%%%%
Y1=zeros(y1,1);
y1
x1
if(I3(i,j,1)==1)
Y1(i,1)=Y1(i,1)+1;
Py1=1;
Py0=1;
while((Y1(Py0,1)<
20)&
(Py0<
y1))
Py0=Py0+1;
Py1=Py0;
while((Y1(Py1,1)>
=20)&
(Py1<
Py1=Py1+1;
I2=I2(Py0:
Py1,:
subplot(3,2,6);
目标车牌区域'
%%%%%%分割字符按行积累量%%%%%%%
X1=zeros(1,x1);
forj=1:
figure(5);
plot(0:
x1-1,X1),title('
累计像素量'
Px0=1;
Px1=1;
%%%%%%%%%%%%分割字符%%%%%%%%%%%%%%%%%%
fori=1:
7
while((X1(1,Px0)<
(Px0<
x1))
Px0=Px0+1;
Px1=Px0;
while(((X1(1,Px1)>
=3)&
(Px1<
x1))||((Px1-Px0)<
10))
Px1=Px1+1;
Z=I2(:
Px0:
Px1,:
switchstrcat('
Z'
num2str(i))
case'
Z1'
PIN0=Z;
Z2'
PIN1=Z;
Z3'
PIN2=Z;
Z4'
PIN3=Z;
Z5'
PIN4=Z;
Z6'
PIN5=Z;
otherwise
PIN6=Z;
figure(3);
subplot(1,7,i);
imshow(Z);
Px0=Px1;
End
4.3车牌字符识别
字符识别方法主要有基于模板匹配算法和基于人工神经网络算法。
基于模板匹配算法是首先将分割后的字符二值化,并将其尺寸缩放为字符数据库中模板的大小,然后与所有模板进行匹配,最后选取最佳匹配作为结果。
建立数字库对该方法在车牌识别过程中很重要,数字库准确才能保证检测出的数据正确。
基于人工神经元网络的算法有两种,一种是先对特征提取待识别字符,然后用所获得的特征训练神经网络分配器;
另一种是直接将待处理图像输入网络由网络自动实现特征提取直至识别结果。
在本程序中用基于人工神经元网络识别车牌字符。
在车牌字符识别部分,字符集中包含约50个汉字,26个大写英文字母及10个阿拉伯数字。
总的字符样本并不太多。
4.3.1构造训练样本如下图所示的数字和字母,
将样本进行归一化为50X20大小,再将图像按列转换成一个1000X1的行向量,将上述18个图像的样本排列在一起构成1000X18的矩阵样本,尽可能多的采集汽车图像提取车牌,部分切分出车牌字符,构造出更多1000X18的矩形样本,用构造好的样本库对神经网络进行训练。
functioninpt=pretreatment(I)
%YUCHULISummaryofthisfunctiongoeshere
%Detailedexplanationgoeshere
ifisrgb(I)
I1=rgb2gray(I);
else
I1=I;
I1=imresize(I1,[5020]);
%将图片统一划为50*20大小
I1=im2bw(I1,0.9);
inpt=zeros(1,m*n);
%%%%%%将图像按列转换成一个行向量
n
m
inpt(1,m*(j-1)+i)=I1(i,j);
4.3.2构造输入样本,按同样的方法,将前面分割出的样本归一化。
4.3.3神经网络进行识别。
closeall;
clearall;
%%%%归一化训练样本%%%%%%
I0=pretreatment(imread('
0.jpg'
));
I1=pretreatment(imread('
1.jpg'
I2=pretreatment(imread('
2.jpg'
I3=pretreatment(imread('
3.jpg'
I4=pretreatment(imread('
4.jpg'
I5=pretreatment(imread('
5.jpg'
I6=pretreatment(imread('
6.jpg'
I7=pretreatment(imread('
7.jpg'
I8=pretreatment(imread('
8.jpg'
I9=pretreatment(imread('
9.jpg'
I10=pretreatment(imread('
A.jpg'
I11=pretreatment(imread('
C.jpg'
I12=pretreatment(imread('
G.jpg'
I13=pretreatment(imread('
L.jpg'
I14=pretreatment(imread('
M.jpg'
I15=pretreatment(imread('
R.jpg'
I16=pretreatment(imread('
H.jpg'
I17=pretreatment(imread('
N.jpg'
P=[I0'
I1'
I2'
I3'
I4'
I5'
I6'
I7'
I8'
I9'
I10'
I11'
I12'
I13'
I14'
I15'
I16'
I17'
];
%输出样本%%%
T=eye(18,18);
%%bp神经网络参数设置
net=newff(minmax(P),[1000,32,18],{'
logsig'
'
},'
trainrp'
net.inputWeights{1,1}.initFcn='
randnr'
;
net.layerWeights{2,1}.initFcn='
net.trainparam.epochs=5000;
net.trainparam.show=50;
%net.trainparam.lr=0.003;
net.trainparam.goal=0.0000000001;
net=init(net);
%%%训练样本%%%%
[net,tr]=train(net,P,T);
%%%%%%%测试%%%%%%%%%
%I=imread('
DSC01323.jpg'
dw=location(I);
%车牌定位
[PIN0,PIN1,PIN2,PIN3,PIN4,PIN5,PIN6]=StringSplit(dw);
%字符分割及处理
%%%%%%%%%%%测试字符,得到识别数值%%%%
PIN0=pretreatment(PIN0);
PIN1=pretreatment(PIN1);
PIN2=pretreatment(PIN2);
PIN3=pretreatment(PIN3);
PIN4=pretreatment(PIN4);
PIN5=pretreatment(PIN5);
PIN6=pretreatment(PIN6);
P0=[PIN0'
PIN1'
PIN2'
PIN3'
PIN4'
PIN5'
PIN6'
fori=2:
T0=sim(net,P0(:
i));
T1=compet(T0);
d=find(T1==1)-1
if(d==10)
str='
A'
elseif(d==11)
C'
elseif(d==12)
G'
elseif(d==13)
L'
elseif(d==14)
M'
elseif(d==15)
R'
elseif(d==16)
H'
elseif(d==17)
N'
else
str=num2str(d);
switchi
case2
str1=str;
case3
str2=str;
case4
str3=str;
case5
str4=str;
case6
str5=str;
otherwise
str6=str;
end
%%%%%%%显示定位后的分割出的车牌彩图,%%%
%%%%%%识别结果以标题形式显示在图上%%%
s=strcat('
渝'
str1,str2,str3,str4,str5,str6);
imshow(dw),title(s);
参考文献: