gusucode.com > 字母识别项目matlab源码程序 > shibie.m
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%识别26个大写字母%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clc; clear all; disp('回车键 ...') chos=input('请直接按回车键正在生成输入向量和目标向量,请稍等… '); if isempty(chos), chos=0; end if chos==0, for kk=0:256 p1=ones(16,16);% 初始化16×16的二值图像像素值(全白) m =strcat('nums\',int2str(kk),'.bmp');% 形成训练样本图像的文件名(0~89.bmp) x=imread(m,'bmp');% 读入训练样本图像文件 bw=im2bw(x,0.5);% 将读入的训练样本图像转换为二值图像 [i,j]= find(bw==0);% 寻找二值图像中像素值为0(黑)的行号和列号 imin=min(i);% 寻找二值图像中像素值为0(黑)的最小行号 imax=max(i);% 寻找二值图像中像素值为0(黑)的最大行号 jmin=min(j);% 寻找二值图像中像素值为0(黑)的最小列号 jmax=max(j);% 寻找二值图像中像素值为0(黑)的最大列号 bw1=bw(imin:imax,jmin:jmax);% 截取图像像素值为0(黑)的最大矩形区域 rate=16/max(size(bw1));% 计算截取图像转换为16×16的二值图像的缩放比例 bw1=imresize(bw1,rate);% 将截取图像转换为16×16的二值图像(由于缩放比例 % 大多数情况下不为16的倍数,所以可能存在转换误差) [i,j]=size(bw1);% 转换图像的大小 i1=round((16-i)/2);% 计算转换图像与标准16×16的图像的左边界差 j1=round((16-j)/2);% 计算转换图像与标准16×16的图像的上边界差 p1(i1+1:i1+i,j1+1:j1+j)=bw1;% 将截取图像转换为标准的16×16的图像 p1= -1.*p1+ones(16,16);% 反色处理 % 以图像数据形成神经网络输入向量 for m=0:15 p(m*16+1:(m +1)*16,kk+1)=p1(1:16,m+1); end % 形成神经网络目标向量 switch kk case{0,1,2,3,4,5,6,7,8,9} % 字母A t(kk+1)=0; case{10,11,12,13,14,15,16,17,18,19} % 字母B t(kk+1)=1; case{20,21,22,23,24,25,26,27,28,29} % 字母C t(kk+1)=2; case{30,31,32,33,34,35,36,37,38,39} % 字母D t(kk+1)=3; case{40,41,42,43,44,45,46,47,48,49} %字母E t(kk+1)=4; case{50,51,52,53,54,55,56,57,58,59} %字母F t(kk+1)=5; case{60,61,62,63,64,65,66,67,68,69} % 字母G t(kk+1)=6; case{70,71,72,73,74,75,76,77,78,79} % 字母H t(kk+1)=7; case{80,81,82,83,84,85,86,87,88,89} % 字母I t(kk+1)=8; case{90,91,92,93,94,95,96,97,98,99} % 字母J t(kk+1)=9; case{100,101,102,103,104,105,106,107,108,109} % 字母K t(kk+1)=10; case{110,111,112,113,114,115,116,117,118,119} % 字母L t(kk+1)=11; case{120,121,122,123,124,125,126,127,128,129} % 字母M t(kk+1)=12; case{130,131,132,133,134,135,136,137,138,139} % 字母N t(kk+1)=13; case{140,141,142,143,144,145,146,147,148,149} % 字母O t(kk+1)=14; case{150,151,152,153,154,155,156,157,158,159} % 字母P t(kk+1)=15; case{160,161,162,163,164,165,166,167,168,169} % 字母Q t(kk+1)=16; case{170,171,172,173,174,175,176,177,178,179} % 字母R t(kk+1)=17; case{180,181,182,183,184,185,186,187,188,189} % 字母S t(kk+1)=18; case{190,191,192,193,194,195,196,197,198,199} %字母T t(kk+1)=19; case{200,201,202,203,204,205,206,207,208,209} % 字母U t(kk+1)=20; case{210,211,212,213,214,215,216,217,218,219} % 字母V t(kk+1)=21; case{220,221,222,223,224,225,226,227,228,229} % 字母W t(kk+1)=22; case{230,231,232,233,234,235,236,237,238,239} % 字母X t(kk+1)=23; case{240,241,242,243,244,245,246,247,248,249} % 字母Y t(kk+1)=24; case{250,251,252,253,254,255,256,257,258,259} % 字母Z t(kk+1)=25; end end end save E52PT p t; % 存储形成的训练样本集(输入向量和目标向量) disp('输入向量和目标向量生成结束!') %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%神经网络的训练%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear all; disp(' '); chos=input('请按回车键进行神经网络的训练 '); if isempty(chos), chos=0; end if chos==0, load E52PT p t; % 加载训练样本集(输入向量和目标向量) % 创建BP网 pr(1:256,1)=0; pr(1:256,2)=1; net= newff(pr,[26 1],{'logsig','purelin'},'traingdx','learngdm'); % 设置训练参数和训练BP网络 net.trainParam.epochs = 5000; net.trainParam.goal= 0.002; net.trainParam.show = 100;%步长为100 net.trainParam.lr=0.05; net= train(net,p,t); end % 存储训练后的BP网络 save E52net net;