基于BP网络的英文字母识别系统
姓名:
学号:
班级:(控制科学与技术专业)
一、实现功能:利用BP神经网络,对大写字母进行识别。
二、使用说明:利用Matlab打开Example1.m文件运行。
1)“网络训练”对样本进行训练。
2)利用“选择图片”来选择要识别的字母图像,同时图像显示于左边。
3)“二值化”实现对图像的预处理和处理结果的显示。
4)“字母识别”实现对图像的识别,识别的结果将显示在编辑框中。
三、核心代码:
1 %Example1 英文字母识别
clear all;
%添加图形窗口
H=figure('Color',[0 0.7 0.6],...
'position',[400 300 500 400],...
'Name','基于BP神经网络的英文字母识别',...
'NumberTitle','off',...
'MenuBar','none');
%画坐标轴对象,显示原始图像
h0=axes('position',[0.1 0.6 0.3 0.3]);
%添加图像打开按钮
h1=uicontrol(H,'Style','push',...
'Position',[350 300 90 50],...
'String','选择图片',...
'FontSize',12,...
'Call','op');
%画坐标轴对象,显示经过预处理之后的图像
h2=axes('position',[0.1 0.2 0.3 0.3]);
%添加预处理按钮
h3=uicontrol(H,'Style','push',...
'Position',[240 240 90 50],...
'String','二值化',...
'FontSize',12,...
'Call','preprocess');
%添加识别按钮
h4=uicontrol(H,'Style','push',...
'Position',[350 240 90 50],...
'String','字母识别',...
'FontSize',12,...
'Call','recognize');
%添加显示识别结果的文本框
h5=uicontrol(H,'Style','edit',...
'Position',[250 80 180 120],...
'String','显示识别结果',...
'FontSize',14,...
'Back',[1 1 1],...
'Fore',[1 0 0]);
%添加训练神经网络按钮
h6=uicontrol(H,'Style','push',...
'Position',[240 300 90 50],...
'String',' 网络训练',...
'FontSize',12,...
'Call','Example1Tr');
2 %Example1Tr
M=1;
N=26*M;%样本数
%获取26个大写字母图像的数据
for kk=0:N-1
p1=ones(16,16);%初始化16*16的二值图像(全白)
m=strcat(int2str(kk),'.bmp');%形成文件名
x=imread(m,'bmp');%读取图像
bw=im2bw(x,0.5);%转换成二值图像数据
%用矩形框截取
[i,j]=find(bw==0);%查找像素为黑的坐标
%取边界坐标
imin=min(i);
imax=max(i);
jmin=min(j);
jmax=max(j);
bw1=bw(imin:imax,jmin:jmax);%截取
%调整比例,缩放成16*16的图像
rate=16/max(size(bw1));
bw1=imresize(bw1,rate);%会存在转换误差
%将bw1转换成标准的16*16图像p1
[i,j]=size(bw1);
i1=round((16-i)/2);
j1=round((16-j)/2);
p1(i1+1:i1+i,j1+1:j1+j)=bw1;
p1=-1.*p1+ones(16,16);
%将p1转换成输入向量
for m=0:15
p(m*16+1:(m+1)*16,kk+1)=p1(1:16,m+1);
end
end
%形成目标向量
for kk=0:M-1
for ii=0:25
t(kk+ii+1)=ii;
end
end
%设置输入向量范围
pr(1:256,1)=0;
pr(1:256,2)=1;
%创建两层BP神经网络,隐层有25个节点
net=newff(pr,[25 1],{'logsig' 'purelin'},'traingdx','learngdm');
net.trainParam.epochs=2500;
net.trainParam.goal=0.001;
net.trainParam.show=10;
%训练神经网络
net=train(net,p,t);
%存储训练好的神经网络
3 %op
%读取图像文件
[filename,pathname]=uigetfile({'*.bmp';'*.jpg';...
'*.gif';'*.*'},...
'Pick an Image File');
X=imread([pathname,filename]);
%显示图像
axes(h0);%将h0设置为当前坐标轴句柄
imshow(X);%在h0上显示原始图像
%preprocess
p1=ones(16,16);
bw=im2bw(X,0.5);%转换成二值图像
%用矩形框截取图像
[i,j]=find(bw==0);
imin=min(i);
imax=max(i);
jmin=min(j);
jmax=max(j);
bw1=bw(imin:imax,jmin:jmax);
%调整比例,变换成16*16图像
rate=16/max(size(bw1));
bw1=imresize(bw1,rate);
[i,j]=size(bw1);
i1=round((16-i)/2);
j1=round((16-j)/2);
p1(i1+1:i1+i,j1+1:j1+j)=bw1;
p1=-1.*p1+ones(16,16);
%显示预处理的结果
axes(h2);
imshow(p1);
4 %recognize
%生成向量形式
for m=0:15
q(m*16+1:(m+1)*16,1)=p1(1:16,m+1);
end
%识别
[a,Pf,Af]=sim(net,q);
a=round(a);
switch a
case 0,ch='A';
case 1,ch='B';
case 2,ch='C';
case 3,ch='D';
case 4,ch='E';
case 5,ch='F';
case 6,ch='G';
case 7,ch='H';
case 8,ch='I';
case 9,ch='J';
case 10,ch='K';
case 11,ch='L';
case 12,ch='M';
case 13,ch='N';
case 14,ch='O';
case 15,ch='P';
case 16,ch='Q';
case 17,ch='R';
case 18,ch='S';
case 19,ch='T';
case 20,ch='U';
case 21,ch='V';
case 22,ch='W';
case 23,ch='X';
case 24,ch='Y';
case 25,ch='Z';
end
%显示识别结果
set(h5,'String',ch,...
'FontSize',30);