您现在的位置:首页 >> 机器学习 >> 内容

基于BP神经网络的数字识别系统仿真,带GUI界面

时间:2022/12/16 23:02:53 点击:

  核心提示:A122,包括程序操作录像+说明文档...

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

作者:我爱C编程 来源:我爱C编程
本站最新成功开发工程项目案例
相关文章
相关评论
发表我的评论
  • 大名:
  • 内容:
本类固顶
  • 没有
  • FPGA/MATLAB商业/科研类项目合作(www.store718.com) © 2025 版权所有 All Rights Reserved.
  • Email:1480526168@qq.com 站长QQ: 1480526168