function varargout = chepaishibie(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @chepaishibie_OpeningFcn, ...
'gui_OutputFcn', @chepaishibie_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% --- Executes just before chepaishibie is made visible.
function chepaishibie_OpeningFcn(hObject, eventdata, handles, varargin)
% Choose default command line output for chepaishibie
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% --- Outputs from this function are returned to the command line.
function varargout = chepaishibie_OutputFcn(hObject, eventdata, handles)
% Get default command line output from handles structure
varargout{1} = handles.output;
% --- 选择车牌
function pushbutton1_Callback(hObject, eventdata, handles)
cla;
global I;
[filename,pathname]=uigetfile({'*.jpg;*.png'},'select car:');%选择车牌
str=[pathname,filename];
I=imread(str);%读取车牌图片
axes(handles.axes1);%使用第1个axes
imshow(I);%显示原车牌图片
axes(handles.axes2);
reset(gca);
% --- 灰度化
function pushbutton3_Callback(hObject, eventdata, handles)
global I;
global I1;
I1=rgb2gray(I);
axes(handles.axes2);%使用第2个axes
imshow(I1);%显示灰度化后的车牌图片
% --- 边缘检测
function pushbutton4_Callback(hObject, eventdata, handles)
global I1;
global I2;
I2=edge(I1,'roberts',0.08,'both');%roberts算子边缘检测
axes(handles.axes2);%使用第2个axes
imshow(I2);%显示经过roberts算子边缘检测后的车牌图片
% --- 车牌定位
function pushbutton5_Callback(hObject, eventdata, handles)
global I;
global I2;
global dw;
se=[1;1;1];
I3=imerode(I2,se);%腐蚀后图像
se=strel('rectangle',[40,40]);%生成一个矩阵
I4=imclose(I3,se); %闭运算
I5=bwareaopen(I4,2000);%从对象中移除小对象
[y,x]=size(I5);
myI=double(I5);
%begin横向扫描
white_y=zeros(y,1);
for i=1:y
for j=1:x
if(myI(i,j,1)==1)
%如果myI(i,j,1)即myI图像中坐标为(i,j)的点为白色
%则相应行的元素white_y(i,1)值加1
white_y(i,1)= white_y(i,1)+1;%白色像素点统计
end
end
end
[temp, MaxY]=max(white_y);%temp为向量white_y的元素中的最大值,MaxY为该值的索引
PY1=MaxY;
while ((white_y(PY1,1)>=120)&&(PY1>1))
PY1=PY1-1;
end
PY2=MaxY;
while ((white_y(PY2,1)>=40)&&(PY2<y))
PY2=PY2+1;
end
%end横向扫描
%begin纵向扫描
white_x=zeros(1,x);%进一步确定x方向的车牌区域
for j=1:x
for i=PY1:PY2
if(myI(i,j,1)==1)
white_x(1,j)= white_x(1,j)+1;
end
end
end
PX1=1;
while ((white_x(1,PX1)<3)&&(PX1<x))
PX1=PX1+1;
end
PX2=x;
while ((white_x(1,PX2)<3)&&(PX2>PX1))
PX2=PX2-1;
end
%end纵向扫描
dw=I(PY1:PY2,PX1:PX2,:);%截取原图像I中的部分
axes(handles.axes2);%使用第2个axes
imshow(dw);%显示经过定位后的车牌图片
% --- 车牌预处理
function pushbutton6_Callback(hObject, eventdata, handles)
global dw;
global d;
b=rgb2gray(dw);%灰度化
%二值化
g_max=double(max(max(b)));
g_min=double(min(min(b)));
T=round(g_max-(g_max-g_min)/3); % T 为二值化的阈值
d=(double(b)>=T); % d为车牌二值图像
% 滤波
h=fspecial('average',3);%均值滤波器
d=im2bw(round(filter2(h,d)));%im2bw(I, level) 将灰度图像 I 转换为二进制图像,
%将输入图像中亮度值大于 level 的像素替换为值1 (白色),其他替换为值0(黑色)
% 膨胀或腐蚀
se=eye(2); % eye(n) returns the n-by-n identity matrix 单位矩阵
[m,n]=size(d);
if bwarea(d)/m/n>=0.365 %计算面积
d=imerode(d,se); %imerode 实现图像腐蚀 d为待处理图像,se是结构元素对象
elseif bwarea(d)/m/n<=0.235
d=imdilate(d,se); %imdilate 图像膨胀
end
axes(handles.axes2);%使用第2个axes
imshow(d);%显示经过预处理后的车牌图片
% --- 车牌提取
function pushbutton7_Callback(hObject, eventdata, handles)
global d;
%切割
d=qiege(d);
[m,n]=size(d);
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);
axes(handles.axes2);%使用第2个axes
imshow(d);%显示提取的车牌图片
% --- 字符分割
function pushbutton8_Callback(hObject, eventdata, handles)
global d;
global word1;
global word2;
global word3;
global word4;
global word5;
global word6;
global word7;
global h1;
global h2;
global h3;
global h4;
global h5;
global h6;
% 切割出 7 个字符
y1=10;y2=0.25;flag=0;word1=[];
while flag==0
[m,n]=size(d);
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; % word1
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);
%归一化大小为 40*20
word1=imresize(word1,[40 20]);
word2=imresize(word2,[40 20]);
word3=imresize(word3,[40 20]);
word4=imresize(word4,[40 20]);
word5=imresize(word5,[40 20]);
word6=imresize(word6,[40 20]);
word7=imresize(word7,[40 20]);
%保存车牌字符
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');
axes(handles.axes2);%使用第2个axes
cla;%清除当前坐标轴对象
axes('position',[0.06,0.35,0.02,0.06]);
imshow(word1);%显示第1个字符
h1=gca();%获得当前坐标轴句柄
axes('position',[0.08,0.35,0.02,0.06]);
imshow(word2);%显示第2个字符
h2=gca();%获得当前坐标轴句柄
axes('position',[0.1,0.35,0.02,0.06]);
imshow(word3);%显示第3个字符
h3=gca();%获得当前坐标轴句柄
axes('position',[0.12,0.35,0.02,0.06]);
imshow(word4);%显示第4个字符
h4=gca();%获得当前坐标轴句柄
axes('position',[0.14,0.35,0.02,0.06]);
imshow(word5);%显示第5个字符
h5=gca();%获得当前坐标轴句柄
axes('position',[0.16,0.35,0.02,0.06]);
imshow(word6);%显示第6个字符
h6=gca();%获得当前坐标轴句柄
axes('position',[0.18,0.35,0.02,0.06]);
imshow(word7);%显示第7个字符
% --- 字符识别
function pushbutton9_Callback(hObject, eventdata, handles)
global h1;
global h2;
global h3;
global h4;
global h5;
global h6;
delete(h1);
delete(h2);
delete(h3);
delete(h4);
delete(h5);
delete(h6);%清除坐标轴中的对象
global dw;
liccode=char(['0':'9' 'ABCDEFGHJKLMNOPQRSTUVWXYZ' '京陕苏吉晋桂鲁鄂浙湘赣云豫辽粤渝冀闽']); %建立自动识别字符代码表
for n=1:7
m=int2str(n); %将整数转换为字符串
ii=strcat('F:\MATLAB\workspace\',m,'.jpg');
t=imread(ii);
SegBw2=imresize(t,[40 20],'nearest'); %使用最近邻插值法放大图像
SegBw=bwdist(SegBw2); %待识别字符
if n==1 %第一位汉字识别
kmin=36;
kmax=53;
elseif n==2 %第二位 A~Z 字母识别
kmin=11;
kmax=35;
else %第三位以后是字母或数字识别
kmin=1;
kmax=35;
end
p=zeros(1,40);
for k2=kmin:kmax
fname=strcat('F:\MATLAB\workspace\字符模板\',liccode(k2),'.jpg');
SamBw2 = imread(fname);
SamBw=bwdist(SamBw2);%模板字符
p(1,k2)=corr2(SegBw,SamBw);%计算相关系数
end
[dest,I
评论0