clear ;
close all;
%获取图像 装入待处理彩色图像并显示原始图像
[fn,pn,fi]=uigetfile('*.bmp','选择图片');
Scolor=imread([pn fn]);
figure,imshow(Scolor),title('原始图像');
%将彩色图像转换为黑白并显示
Sgray = rgb2gray(Scolor);%rgb2gray转换成灰度图
%figure,imshow(Sgray),title('原始黑白图像');
%c=histeq(Sgray);
%figure,imshow(c);title('直方图均衡化图像');
s=strel('disk',13);%strei函数13
Bgray=imopen(Sgray,s);%打开sgray s图像
%figure,imshow(Bgray);title('背景图像');%输出背景图像
Egray=imsubtract(Sgray,Bgray);%两幅图相减
%figure,imshow(Egray);title('增强黑白图像');%输出黑白图像
grd=edge(Egray,'canny',0.09,'both');
figure,imshow(grd);title('robert算子边缘检测');
se=[1;1;1]; %线型结构元素
I3=imerode(grd,se); %腐蚀图像
figure,imshow(I3),title('腐蚀后边缘图像');
bg1=imclose(I3,strel('rectangle',[8,18]));%取矩形框的闭运算即平滑8,18
figure,imshow(bg1);title('图像闭运算[5,19]');%输出闭运算的图像
bg3=imopen(bg1,strel('rectangle',[8,14]));%取矩形框的开运算8,18
figure,imshow(bg3);title('图像开运算[5,19]');%输出开运算的图像
bg2=bwareaopen(bg3,700);%去除聚团灰度值小于1000的部分800
figure,imshow(bg2);title('从对象中移除小对象');
[y,x,]=size(bg2);
I6=double(bg2);
%绘制行曲线图
Y1=zeros(y,1);%y行1列的零矩阵
for i=1:y
for j=1:x
if(I6(i,j,1)==1)
Y1(i,1)= Y1(i,1)+1;
end
end
end
% figure();
% subplot(1,3,1);
% plot(0:y-1,Y1),title('行像素灰度值累计'),xlabel('行值'),ylabel('像素和');
[temp, MaxY]=max(Y1);
PY1=MaxY;
while ((Y1(PY1,1)>=50)&&(PY1>1))
PY1=PY1-7;
end
PY2=MaxY;
while ((Y1(PY2,1)>=50)&&(PY2<y))
PY2=PY2+7;
end
%绘制列曲线图
X1=zeros(1,x);
for j=1:x
for i=PY1:PY2
if(I6(i,j,1)==1)
X1(1,j)= X1(1,j)+1;
end
end
end
% subplot(1,3,2);
% plot(0:x-1,X1),title('列像素灰度值累计'),xlabel('列值'),ylabel('像数和');
PX1=1;
while ((X1(1,PX1)<3)&&(PX1<x))
PX1=PX1+1;
end
PX2=x;
while ((X1(1,PX2)<3)&&(PX2>PX1))
PX2=PX2-1;
end
DW=Scolor(PY1:PY2,PX1:PX2,:);
%subplot(1,3,3);
figure,imshow(DW),title('车牌定位后图像');
%if isrgb(DW)
I1 = rgb2gray(DW); %将RGB图像转化为灰度图像
%else I1=DW;
%end
%figure,imshow(I1),title('车牌灰度图像');
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);
imane_bw=im2bw(I1,T/256);
figure,imshow(imane_bw),title('二值化车牌图像');
% imane_bw=bwareaopen(I1,3);
% figure,imshow(imane_bw),title('形态学滤波后的二值化图像');
[y1,x1,z1]=size(imane_bw);
I3=double(imane_bw);
TT=1;
%%%%%%%去除图像顶端和底端的不感兴趣区域%%%%%
Y1=zeros(y1,1);
for i=1:y1
for j=1:x1
if(I3(i,j,1)==1)
Y1(i,1)= Y1(i,1)+1 ;
end
end
end
Py1=1;
Py0=1;
while ((Y1(Py0,1)<9)&&(Py0<y1))
Py0=Py0+1;
end
Py1=Py0;
while((Y1(Py1,1)>=9)&&(Py1<y1))
Py1=Py1+1;
end
I2=imane_bw(Py0:Py1,:,:);
figure,imshow(I2),title('目标车牌区域');
% 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割
d=qiege(I2);
[m,n]=size(d);
%figure,subplot(2,1,1),imshow(d),title(n)
k1=1;k2=1;s=sum(d);j=1;
while j~=n
while s(j)==0
j=j+1;
end
k1=j;
while s(j)~=0 && j<=n-1
j=j+1;
end
k2=j-1;
if k2-k1>=round(n/6.5)
[val,num]=min(sum(d(:,[k1+5:k2-5])));
d(:,k1+num+5)=0; % 分割
end
end
% 再切割
d=qiege(d);
% 切割出 7 个字符
y1=10;y2=0.25;flag=0;word1=[];
while flag==0
[m,n]=size(d);
left=1;wide=0;
while sum(d(:,wide+1))~=0
wide=wide+1;
end
if wide<y1 % 认为是左侧干扰
d(:,[1:wide])=0;
d=qiege(d);
else
temp=qiege(imcrop(d,[1 1 wide m]));
[m,n]=size(temp);
all=sum(sum(temp));
two_thirds=sum(sum(temp([round(m/3):2*round(m/3)],:)));
if two_thirds/all>y2
flag=1;word1=temp; % WORD 1
end
d(:,[1:wide])=0;d=qiege(d);
end
end
% 分割出第二个字符
[word2,d]=getword(d);
% 分割出第三个字符
[word3,d]=getword(d);
% 分割出第四个字符
[word4,d]=getword(d);
% 分割出第五个字符
[word5,d]=getword(d);
% 分割出第六个字符
[word6,d]=getword(d);
% 分割出第七个字符
[word7,d]=getword(d);
% figure(9),imshow(word1),title('1');
% figure(10),imshow(word2),title('2');
% figure(11),imshow(word3),title('3');
% figure(12),imshow(word4),title('4');
% figure(13),imshow(word5),title('5');
% figure(14),imshow(word6),title('6');
% figure(15),imshow(word7),title('7');
[m,n]=size(word1);
% 商用系统程序中归一化大小为 40*20,此处演示%%%%%22,14
word1=imresize(word1,[22 14]);
word2=imresize(word2,[22 14]);
word3=imresize(word3,[22 14]);
word4=imresize(word4,[22 14]);
word5=imresize(word5,[22 14]);
word6=imresize(word6,[22 14]);
word7=imresize(word7,[22 14]);
figure,
subplot(3,7,8),imshow(word1),title('1');
subplot(3,7,9),imshow(word2),title('2');
subplot(3,7,10),imshow(word3),title('3');
subplot(3,7,11),imshow(word4),title('4');
subplot(3,7,12),imshow(word5),title('5');
subplot(3,7,13),imshow(word6),title('6');
subplot(3,7,14),imshow(word7),title('7');
imwrite(word1,'1.jpg');
imwrite(word2,'2.jpg');
imwrite(word3,'3.jpg');
imwrite(word4,'4.jpg');
imwrite(word5,'5.jpg');
imwrite(word6,'6.jpg');
imwrite(word7,'7.jpg');
liccode=char(['0':'9' 'A':'Z' '藏川甘赣贵桂黑沪吉济冀津晋京警兰辽领鲁蒙闽宁青琼陕使苏皖湘新学渝豫粤云浙']); %建立自动识别字符代码表
tt=1;
l=1;
for I=1:7
ii=int2str(I);
t=imread([ii,'.jpg']);
t=255-t;
level=graythresh(t);
t=im2bw(t,level);
SegBw2=imresize(t,[22 14],'nearest');
if tt==1 %第一位汉字识别
kmin=37;
kmax=72;
t=~t;
SegBw2=imresize(t,[22 14],'nearest');
elseif tt==2 %第二位 A~Z 字母识别
kmin=11;
kmax=36;
else %第三位以后是字母或数字识别
kmin=1;
kmax=36;
end
for k2=kmin:kmax
fname=strcat('code module\Sam',liccode(k2),'.jpg');
%SamBw2 = imread(fname);
SamBw22 = imread(fname);
SamBw22 = rgb2gray(SamBw22);
SamBw2=imresize(SamBw22,[22 14],'nearest');
level=graythresh(SamBw2);
SamBw2=im2bw(SamBw2,level);
for i=1:22
for j=1:14
SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);
end
end
% 以上相当于两幅图相减得到第三幅图
Dmax=0;
for k1=1:22
for l1=1:14
if ( SubBw2(k1,l1) > 0 || SubBw2(k1,l1) <0 )
Dmax=Dmax+1;
end
end
end
Error(k2)=Dmax;
end
Error1=Error(kmin:kmax);
MinError=min(Error1);
findc=find(Error1==MinError);
if tt==1
findc=findc+36;
end
if tt==2
findc=findc+10;
end
tt=tt+1;
res=liccode(findc);
shibiejieguo(1,l)=res;
l=l+1;
end
%==========================对话框显示显示=============================================
shibiejieguo
msgbox(shibiejieguo,'识别结果');
%===================读出声音===================
%duchushengyin(shibiejieguo);