1.完整项目描述和程序获取
>面包多安全交易平台:https://mbd.pub/o/bread/Y5qUk59y
>如果链接失效,可以直接打开本站店铺搜索相关店铺:
>如果链接失效,程序调试报错或者项目合作也可以加微信或者QQ联系。
2.部分仿真图预览
3.算法概述
OCR(Optical Character Recognition)即光学字符识别技术,是通过扫描仪把印刷体或手写体文稿扫描成图像,然后识别成相应的计算机可直接处理的字符。OCR是模式识别的一个分支,按字体分类主要分为印刷体识别和手写体识别两大类。对于印刷体识别又可以分成单一字体单一字号和多种字体多种字号几类。而手写体识别又可分为受限手写体和不受限手写体两类;按识别方式可分为在线识别和脱机识别两类。
字符识别处理的信息可分为两大类:一类是文字信息,处理的主要是用各国家、各民族的文字(如:汉字,英文等)书写或印刷的文本信息,目前在印刷体和联机手写方面技术已趋向成熟,并推出了很多应用系统;另一类是数据信息,主要是由阿拉伯数字及少量特殊符号组成的各种编号和统计数据,如:邮政编码、统计报表、财务报表、银行票据等等,处理这类信息的核心技术是手写数字识别。
4.部分源码
p1 = bwmorph(p1,'thin',inf);%图像细化
% figure,imshow(p1);
for m=0:15
if(0<=m&&m<=3)
mm=(m+1)*4;
p(m+1,kk+1)=length(find(p1(1:4,mm-3:mm)==1));%第一到第四块方格内像素值为1的总数
end
if(4<=m&&m<=7)
mm=(m-3)*4;
p(m+1,kk+1)=length(find(p1(5:8,mm-3:mm)==1));%第五到第八块方格内像素值为1的总数
end
if(8<=m&&m<=11)
mm=(m-7)*4;
p(m+1,kk+1)=length(find(p1(9:12,mm-3:mm)==1));%第九到第十二块方格内像素值为1的总数
end
if(12<=m&&m<=15)
mm=(m-11)*4;
p(m+1,kk+1)=length(find(p1(13:16,mm-3:mm)==1));%第十三到十六块方格内像素值为1的总数
end
end
p(17,kk+1)=length(find(p1(4 ,1:16)==1));%第四行线上像素值为1的总数
p(18,kk+1)=length(find(p1(8 ,1:16)==1));%第八行线上像素值为1的总数
p(19,kk+1)=length(find(p1(12,1:16)==1));%第十二行线上像素值为1的总数
p(20,kk+1)=length(find(p1(1:16, 4)==1));%第四列线上像素值为1的总数
p(21,kk+1)=length(find(p1(1:16, 8)==1));%第八列线上像素值为1的总数
p(22,kk+1)=length(find(p1(1:16,12)==1));%第十二列线上像素值为1的总数
s1=0;
for zz=1:16
xx=17-zz;
s1=p1(zz,xx)+s1;
p(23,kk+1)=s1;%y=x线上像素值为1的总数
end
s2=0;
for zz=1:16
s2=p1(zz,zz)+s2;
p(24,kk+1)=s2;%y=-x线上像素值为1的总数
end
%将处理的源样本输入供神经网络训练的样本 pcolum是样本数循环变量
switch kk
case{0,1,2,3,4,5,6,7,8,9}
t(1:4,kk+1)=[0.01,0.01,0.01,0.01]; %数字0
case{10,11,12,13,14,15,16,17,18,19}
t(1:4,kk+1)=[0.01,0.01,0.01,0.99]; %数字1
case{20,21,22,23,24,25,26,27,28,29}
t(1:4,kk+1)=[0.01,0.01,0.99,0.01]; %数字2
case{30,31,32,33,34,35,36,37,38,39}
t(1:4,kk+1)=[0.01,0.01,0.99,0.99]; %数字3
case{40,41,42,43,44,45,46,47,48,49}
t(1:4,kk+1)=[0.01,0.99,0.01,0.01]; %数字4
case{50,51,52,53,54,55,56,57,58,59}
t(1:4,kk+1)=[0.01,0.99,0.01,0.99]; %数字5
case{60,61,62,63,64,65,66,67,68,69}
t(1:4,kk+1)=[0.01,0.99,0.99,0.01]; %数字6
case{70,71,72,73,74,75,76,77,78,79}
t(1:4,kk+1)=[0.01,0.99,0.99,0.99]; %数字7
case{80,81,82,83,84,85,86,87,88,89}
t(1:4,kk+1)=[0.99,0.01,0.01,0.01]; %数字8
case{90,91,92,93,94,95,96,97,98,99}
t(1:4,kk+1)=[0.99,0.01,0.01,0.99]; %数字9
end
end %建立与训练样本对应的输出值t
'LOAD OK.'
save numberPT p t;
% 创建和训练BP网络
clear all;
load numberPT p t; %加载样本
%创建BP网络
net=newff(minmax(p),[14 4],{'logsig' 'purelin'}, 'traingdx', 'learngdm');
% 当前输入层权值和阈值
inputWeights=net.IW{1,1}
inputbias=net.b{1}
% 当前网络层权值和阈值
layerWeights=net.LW{2,1}
layerbias=net.b{2}
net.trainParam.epochs=25000; %设置训练步数
net.trainParam.goal=0.001; %设置训练目标
net.trainParam.show=10; %设置训练显示格数
net.trainParam.lr=0.05; %设置训练学习率 w
[net,tr]=train(net,p,t); %训练BP网络
'TRAIN OK.'
save numbernet net;
% 识别
for times=0:99
clear all;
p1=ones(16,16);
load numbernet net;
test=input('FileName:', 's');
x=imread(test,'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); %截取是入图像中的数字部分
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; %建立起16*16的矩阵
p1=-1.*p1+ones(16,16);%反色处理
p1 = bwmorph(p1,'thin',inf);
for m=0:15
if(0<=m&&m<=3)
mm=(m+1)*4;
p(m+1,1)=length(find(p1(1:4,mm-3:mm)==1));
end
if(4<=m&&m<=7)
mm=(m-3)*4;
p(m+1,1)=length(find(p1(5:8,mm-3:mm)==1));
end
if(8<=m&&m<=11)
mm=(m-7)*4;
p(m+1,1)=length(find(p1(9:12,mm-3:mm)==1));
end
if(12<=m&&m<=15)
mm=(m-11)*4;
p(m+1,1)=length(find(p1(13:16,mm-3:mm)==1));
end
end
p(17,1)=length(find(p1(4 ,1:16)==1));
p(18,1)=length(find(p1(8 ,1:16)==1));
p(19,1)=length(find(p1(12,1:16)==1));
p(20,1)=length(find(p1(1:16, 4)==1));
p(21,1)=length(find(p1(1:16, 8)==1));
p(22,1)=length(find(p1(1:16,12)==1));
s1=0;
for zz=1:16
xx=17-zz;
s1=p1(zz,xx)+s1;
p(23,1)=s1;
end
s2=0;
for zz=1:16
s2=p1(zz,zz)+s2;
p(24,1)=s2;
end
[a,Pf,Af]=sim(net,p); %测试网络
imshow(p1);
a=round(a);
a=a(1,1)*8+a(2,1)*4+a(3,1)*2+a(4,1)%输出网络识别结果
end
A122