% 车牌识别程序主体
clc;
close all;
clear all;
%==========================================================
%说明:
%
%
%===========================================================
% ==============测定算法执行的时间,开始计时=================
tic
%=====================读入图片================================
[fn,pn,fi]=uigetfile('*.jpg','选择图片');
I=imread([pn fn]);
figure;
imshow(I);
title('原始图像');%显示原始图像
%%%%%记录程序运行时间
chepailujing=[pn fn]
I_bai=I;
[PY2,PY1,PX2,PX1]=caitu_fenge(I);
% I=rgb2hsv(I);
% [PY2,PY1,PX2,PX1]=caitu_tiqu(I,I_bai);%用 HSI 模型识别蓝色,用 rgb 模型识别白色
%================分割车牌区域=================================
%===============车牌区域根据面积二次修正======================
[PY2,PY1,PX2,PX1,threshold]=SEC_xiuzheng(PY2,PY1,PX2,PX1);
%==============更新图片=============================
Plate=I_bai(PY1:PY2,PX1:PX2,:);%使用 caitu_tiqu
%==============考虑用腐蚀解决蓝色车问题=============
bw=Plate;figure,imshow(bw);title('车牌图像');%hsv 彩图提取图像
%==============这里要根据图像的倾斜度进行选择这里选择的图片 20090425686.jpg
bw=rgb2gray(bw);figure,imshow(bw);title('灰度图像');
%================倾斜校正======================
qingxiejiao=rando_bianhuan(bw)
bw=imrotate(bw,qingxiejiao,'bilinear','crop');figure,imshow(bw);title('倾斜校正');%取值为负值
向右旋转
%==============================================
bw=im2bw(bw,graythresh(bw));%figure,imshow(bw);
bw=bwmorph(bw,'hbreak',inf);%figure,imshow(bw);
bw=bwmorph(bw,'spur',inf);%figure,imshow(bw);title('擦除之前');
bw=bwmorph(bw,'open',5);%figure,imshow(bw);title('闭合运算');
waitbar(i/5000,h)
bw = bwareaopen(bw, threshold);figure,imshow(bw);title('擦除');
%==================加入进度条================================
% h=waitbar(0,'程序运行中,请稍等......')
% for i=1:10000
%
% end
% close(h);
%wavplay(wavread('程序运行中.wav'),22000);
%==========================================================
bw=~bw;figure,imshow(bw);title('擦除反色');
%=============对图像进一步裁剪,保证边框贴近字体===========
bw=touying(bw);figure;imshow(bw);title('Y 方向处理');
bw=~bw;
bw = bwareaopen(bw, threshold);
bw=~bw;%figure,imshow(bw);title('二次擦除');
[y,x]=size(bw);%对长宽重新赋值
%=================文字分割=================================
fenge=shuzifenge(bw,qingxiejiao)
[m,k]=size(fenge);
%=================显示分割图像结果=========================
figure;
for s=1:2:k-1
subplot(1,k/2,(s+1)/2);imshow(bw( 1:y,fenge(s):fenge(s+1)));
end
%================ 给七张图片定位===============桂 AV6388
=bw( 1:y,fenge(1):fenge(2));
han_zi
zi_mu
=bw( 1:y,fenge(3):fenge(4));
zm_sz_1 =bw( 1:y,fenge(5):fenge(6));
zm_sz_2 =bw( 1:y,fenge(7):fenge(8));
shuzi_1 =bw( 1:y,fenge(9):fenge(10));
shuzi_2 =bw( 1:y,fenge(11):fenge(12));
shuzi_3 =bw( 1:y,fenge(13):fenge(14));
%==========================识别====================================
%======================把修正数据读入==============================
imresize(han_zi, [110 55],'bilinear');
xiuzhenghanzi =
[110 55],'bilinear');
imresize(zi_mu,
xiuzhengzimu =
xiuzhengzm_sz_1=
imresize(zm_sz_1,[110 55],'bilinear');
xiuzhengzm_sz_2 = imresize(zm_sz_2,[110 55],'bilinear');
xiuzhengshuzi_1 = imresize(shuzi_1,[110 55],'bilinear');
xiuzhengshuzi_2 = imresize(shuzi_2,[110 55],'bilinear');
xiuzhengshuzi_3 = imresize(shuzi_3,[110 55],'bilinear');
%============ 把 0-9 , A-Z 以及省份简称的数据存储方便访问====================
hanzishengfen=duquhanzi(imread('cpgui.bmp'),imread('cpguizhou.bmp'),imread('cpjing.bmp'),im
read('cpsu.bmp'),imread('cpyue.bmp'));
%因数字和字母比例不同。这里要修改
shuzizimu=duquszzm(imread('0.bmp'),imread('1.bmp'),imread('2.bmp'),imread('3.bmp'),imread('
4.bmp'),...
imread('5.bmp'),imread('6.bmp'),imread('7.bmp'),imread('8.bmp'),imread('9.bmp'),...
imread('10.bmp'),imread('11.bmp'),imread('12.bmp'),imread('13.bmp'),imread('14.bmp'),...
imread('15.bmp'),imread('16.bmp'),imread('17.bmp'),imread('18.bmp'),imread('19.bmp'),...
imread('20.bmp'),imread('21.bmp'),imread('22.bmp'),imread('23.bmp'),imread('24.bmp'),...
imread('25.bmp'),imread('26.bmp'),imread('27.bmp'),imread('28.bmp'),imread('29.bmp'),...
imread('30.bmp'),imread('31.bmp'),imread('32.bmp'),imread('33.bmp'));
zimu
=
duquzimu(imread('10.bmp'),imread('11.bmp'),imread('12.bmp'),imread('13.bmp'),imread('14.bm
p'),...
imread('15.bmp'),imread('16.bmp'),imread('17.bmp'),imread('18.bmp'),imread('19.bmp'),...
imread('20.bmp'),imread('21.bmp'),imread('22.bmp'),imread('23.bmp'),imread('24.bmp'),...
imread('25.bmp'),imread('26.bmp'),imread('27.bmp'),imread('28.bmp'),imread('29.bmp'),...
imread('30.bmp'),imread('31.bmp'),imread('32.bmp'),imread('33.bmp'));
shuzi
=
duqushuzi(imread('0.bmp'),imread('1.bmp'),imread('2.bmp'),imread('3.bmp'),imread('4.bmp'),...
= shibiehanzi(hanzishengfen,xiuzhenghanzi);shibiejieguo(1,i) =jieguohanzi;
= shibiezimu(zimu,xiuzhengzimu);
shibiezm_sz(shuzizimu,xiuzhengzm_sz_1);
imread('5.bmp'),imread('6.bmp'),imread('7.bmp'),imread('8.bmp'),imread('9.bmp'));
%============================识别结果================================
i=1;%shibiezm_sz 该函数识别数字有问题
jieguohanzi
jieguozimu
i=i+1;
jieguozm_sz_1=
=jieguozm_sz_1;i=i+1;
jieguozm_sz_2=
=jieguozm_sz_2;i=i+1;
jieguoshuzi_1= shibieshuzi(shuzi,xiuzhengshuzi_1);
jieguoshuzi_2= shibieshuzi(shuzi,xiuzhengshuzi_2);
jieguoshuzi_3= shibieshuzi(shuzi,xiuzhengshuzi_3);
%==========================
话
=============================================
shibiejieguo
%%%%========后面的注释掉了(语音读出这一部分)===============
shibiezm_sz(shuzizimu,xiuzhengzm_sz_2);
对
shibiejieguo(1,i) =jieguoshuzi_1;i=i+1;
shibiejieguo(1,i) =jieguoshuzi_2;i=i+1;
shibiejieguo(1,i) =jieguoshuzi_3;i=i+1;
框
显
示
显
示
i=i+1;
shibiejieguo(1,i) =jieguozimu;
shibiejieguo(1,i)
shibiejieguo(1,i)
msgbox(shibiejieguo,'识别结果');
% %=====================导出文本==================
% fid=fopen('Data.xls','a+');
% fprintf(fid,'%s\r\n',shibiejieguo,datestr(now));
% fclose(fid);
% %===================读出声音===================
% duchushengyin(shibiejieguo);
%================读取计时==========================
t=toc %%%记录程序运行时间
%============================================
function bw_fir = touying(imane_bw)
自己编写的子函数
X_yuzhi=1;
[y,x]=size(imane_bw);
Y_touying=(sum((~imane_bw)'))';%往左边投影统计黑点
X_touying=sum((~imane_bw));%往下面投影
%找黑体边缘
Y_up=fix(y/2);
Y_yuzhi=mean(Y_touying((fix(y/2)-10):(fix(y/2)+10),1))/1.6;
while ((Y_touying(Y_up,1)>=Y_yuzhi)&&(Y_up>1))%找到图片上边界
Y_up=Y_up-1;
end
Y_down=fix(y/2);
while ((Y_touying(Y_down,1)>=Y_yuzhi)&&(Y_down
自己编写的子函数
function fenge = shuzifenge(imfenge,qingxiejiao)
[y,x]=size(imfenge);
%===============用函数设定分割阈值========================
SS=x*y
if
SS<=20000
shedingyuzhi=4;
elseif SS>20000&&SS<=30000
shedingyuzhi=4;
elseif SS>30000&&SS<=50000
shedingyuzhi=4;
elseif SS>50000&&SS<=80000
shedingyuzhi=4;
else
shedingyuzhi=4;
end
ganrao=SS/100;
%=========================================================
%定义数组 histogram 存储垂直方向的黑点数
histogram=sum(~imfenge);
%=================文字分割=============================
k=1;
for h=1:x-1
if
((histogram(1,h)<=shedingyuzhi)&&(histogram(1,h+1)>shedingyuzhi))||((h==1)&&histogram(1,h)
>shedingyuzhi)
fenge(1,k)=h;
k=k+1;
elseif
((histogram(1,h)>shedingyuzhi)&&(histogram(1,h+1)<=shedingyuzhi))||((h==x-1)&&histogram(1,
h)>shedingyuzhi)
fenge(1,k)=h+1;
k=k+1;
end
end
k=k-1;%去掉多产生的一个 K 值
if
k<10
msgbox('提取出错','警告');
wavplay(wavread('提取出错.wav'),22000);
pause;
end
%==============================================
if
(sum(histogram(1,fenge(1,1):fenge(1,2)))
function shibiezm_sz=shibiezm_sz(shuzizimu,xiuzhengzm_sz);
[y,x,z]=size(xiuzhengzm_sz);
自己编写的子函数
for k=1:34
sum=0;
for i=1:y
for j=1:x
if
end
end
shuzizimu(i,j,k)==xiuzhengzm_sz(i,j)%统计黑白
sum=sum+1;
end
baifenbi(1,k)=double(sum/(x*y));
end
chepai= find(baifenbi>=max(baifenbi));
chepai=chepai(1,1);
%===================数字直接返回=========================
if (chepai>=1)&&(chepai<=10)
zm_sz=chepai-1;
zm_sz=num2str(zm_sz);
elseif (chepai>=11)&&(chepai<=34)
%==================字母对应序号转字母====================
%=========11-15 ABCDE 16-20FGHIJ 21-25 KLMNP 26-30 QRSTU 31-35 VWXYZ
if
chepai==11
zm_sz='A';
elseif chepai==12
zm_sz='B';
elseif chepai==13
zm_sz='C';
elseif chepai==14
zm_sz='D';
elseif chepai==15
zm_sz='E';
elseif chepai==16
zm_sz='F';
elseif chepai==17
zm_sz='G';
elseif chepai==18
zm_sz='H';
elseif chepai==19
zm_sz='J';
elseif chepai==20