云趣在线企业网站建设,wordpress 悬浮栏,学ui去哪个机构比较好,黑河seo目录 一、问题描述二、概念神经网络实现手写体数字识别原理三、算法步骤3.1 数据输入3.2 特征提取3.3 模型训练3.4 测试 四、运行结果 一、问题描述
手写体数字属于光学字符识别#xff08;Optical Character Recognition#xff0c;OCR#xff09;的范畴#xff0c;但分类… 目录 一、问题描述二、概念神经网络实现手写体数字识别原理三、算法步骤3.1 数据输入3.2 特征提取3.3 模型训练3.4 测试 四、运行结果 一、问题描述
手写体数字属于光学字符识别Optical Character RecognitionOCR的范畴但分类的分别比光学字符识别少得多主要只需识别共10个字符。
使用概率神经网络作为分类器对64*64二值图像表示的手写数字进行分类所得的分类器对训练样本能够取得100%的正确率训练时间短比BP神经网络快若干个数量级。
二、概念神经网络实现手写体数字识别原理
第一步是对图像进行预处理 其次将整张图像分割为单个数字图像这也是数字识别的难点之一 对其进行特征提取 。 选择一个有效的分类器模型 。这里采用概率神经网络。 具体流程图如下 样本采用1000幅64*64的二值图像。 概率神经网络的判定边界接近于贝叶斯最佳判定面网络的计算流程与最大后验概率准则极为类似。 测试的流程图如下
三、算法步骤
3.1 数据输入
1000章图像被放在名为digital_pic的子目录中其中数字i的第j张图像文件名为i_j.bmp为三位宽度的整数。数据输入封装函数如下
function I getPicData()
% getPicData.m
% 读取digital_pic目录下的所有图像
% output:
% I : 64 * 64 * 1000, 包含1000张64*64二值图像I zeros(64,64,1000);
k 1;% 外层循环读取不同数字的图像
for i1:10% 内层循环 读取同一数字的100张图for j1:100file sprintf(digital_pic\\%d_%03d.bmp, i-1, j);I(:,:,k) imread(file);% 图像计数器k k 1;end
end3.2 特征提取
进行特征提取前进行去噪处理。特征提取的函数为[Feature,bmp,flag]getFeature(A)该函数接受一个64*64二值矩阵输入返回的Feature为长度为14的特征向量。特征提取的封装代码如下
function [Feature,bmp,flag]getFeature(A)
% getFeature.m
% 提取64*64二值图像的特征向量
% input:
% A: 64*64矩阵
% output:
% Feature: 长度为14的特征向量
% bmp : 图像中的数字部分
% flag : 标志位表示数字部分的宽高比% 反色
A ones(64) - A;% 提取数字部分
[x, y] find(A 1);% 截取图像中的数字部分
A A(min(x):max(x),min(y):max(y)); % 计算宽高比和标志位
flag (max(y)-min(y)1)/(max(x)-min(x)1);
if flag 0.5flag 0;
elseif flag 0.5 flag 0.75flag 1;
elseif flag 0.75 flag 1flag 2;
elseflag 3;
end% 重新放大将长或宽调整为64
rate 64 / max(size(A));
% 调整尺寸
A imresize(A,rate);
[x,y] size(A);% 不足64的部分用零填充
if x ~ 64A [zeros(ceil((64-x)/2)-1,y);A;zeros(floor((64-x)/2)1,y)];
end;
if y ~ 64A [zeros(64,ceil((64-y)/2)-1),A,zeros(64,floor((64-y)/2)1)];
end%% 三条竖线与数字字符的交点个数 F(1)~F(3)
% 1/2 竖线交点数量
Vc 32;
F(1) sum(A(:,Vc));% 1/4 竖线交点数量
Vc round(64/4);
F(2) sum(A(:,Vc));% 3/4 竖线交点数量
Vc round(64*3/4);
F(3) sum(A(:,Vc));%% 三条横线与数字字符的交点个数 F(4)~F(6)
% 1/2 水平线交点数量
Hc 32;
F(4) sum(A(Hc,:));% 1/3 水平线处交点数量
Hc round(64/3);
F(5) sum(A(Hc,:));% 2/3水平线处交点数量
Hc round(2*64/3);
F(6) sum(A(Hc,:));%% 两条对角线的交点数量
% 主对角线交点数
F(7) sum(diag(A));% 次对角线交点数
F(8) sum(diag(rot90(A)));%% 小方块% 右下角1/2小方块中的所有点
t A(33:64,33:64);
F(9) sum(t(:))/10;% 左上角1/2小方块中的所有点
t A(1:32,1:32);
F(10) sum(t(:))/10;% 左下角方块中的所有点
t A(1:32,33:64);
F(11) sum(t(:))/10;% 右上角方块中的所有点
t A(33:64,1:32);
F(12) sum(t(:))/10;% 垂直方向1/3~2/3部分的所有像素点
t A(1:64,17:48);
F(13) sum(t(:))/20;% 水平方向1/3~2/3部分的所有像素点
t A(17:48,1:64);
F(14) sum(t(:))/20;Feature F;
bmp A;3.3 模型训练
使用newpnn函数创建概率神经网络
net newpnn(x, ind2vec(label));3.4 测试
测试时首先使用原有训练数据进行测试再对读入的图像添加一定强度的噪声观察算法的抗干扰性能
I1 I;
% 椒盐噪声的强度
nois 0.2;
fea0 zeros(14, 1000);
for i1:1000tmp(:,:,i) I1(:,:,i);% 添加噪声tmpn(:,:,i) imnoise(double(tmp(:,:,i)),salt pepper, nois);
% tmpn(:,:,i) imnoise(double(tmp(:,:,i)),gaussian,0, 0.1);% 中值滤波tmpt medfilt2(tmpn(:,:,i),[3,3]);% 提取特征向量t getFeature(tmpt);fea0(:,i) t(:);
end% 归一化
fea mapminmax(apply,fea0, se);
% 测试
tlab0 net(fea);
tlab vec2ind(tlab0);% 计算噪声干扰下的正确率
rat sum(tlab label) / length(tlab);
fprintf(带噪声的训练样本测试正确率为\n %d%%\n, round(rat*100));四、运行结果
训练过程如下 可以发现训练过程比BP神经网络快很多。 如果需要源代码可以参考资源https://download.csdn.net/download/didi_ya/87739029。 制作不易如果对你有所帮助记得点个赞哟~