当前位置: 首页 > news >正文

【MATLAB图像处理实用案例详解(16)】——利用概念神经网络实现手写体数字识别

目录

    • 一、问题描述
    • 二、概念神经网络实现手写体数字识别原理
    • 三、算法步骤
      • 3.1 数据输入
      • 3.2 特征提取
      • 3.3 模型训练
      • 3.4 测试
    • 四、运行结果

一、问题描述

手写体数字属于光学字符识别(Optical Character Recognition,OCR)的范畴,但分类的分别比光学字符识别少得多,主要只需识别共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 i=1:10% 内层循环: 读取同一数字的100张图for j=1:100file = sprintf('digital_pic\\%d_%03d.bmp', i-1, j);I(:,:,k) = imread(file);% 图像计数器k = k + 1;end
end

3.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 i=1: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。
制作不易,如果对你有所帮助,记得点个赞哟~

http://www.lryc.cn/news/68366.html

相关文章:

  • 数据库管理-第六十九期 另一种累(20230422)
  • Cesium入门之六:Cesium加载影像图层(ArcGIS、Bing、Mapbox、高德地图、腾讯地图、天地图等各类影像图)
  • Redis系列--redis持久化
  • 在外Windows远程连接MongoDB数据库【无公网IP】
  • 学网络安全怎么挖漏洞?怎么渗透?
  • KL散度和交叉熵的对比介绍
  • 浪涌保护器:保护电子设备免受雷击侵害
  • js绘制的红心
  • 十、Feign客户端
  • 登录appuploader
  • 都别吹牛逼了,2个英语指令简单评测便知ChatGPT、博弈Ai、文心一言、通义千问、讯飞星火真实水平
  • 使用Spring Boot快速搭建项目:减少配置,提升开发效率
  • (2)数码管
  • 赫夫曼树和赫夫曼编码详解
  • unity UGUI系统梳理 -交互组件
  • HTTP第15讲——HTTP的连接管理
  • 深度剖析Mybatis-plus Injector SQL注入器
  • 【Mysql实战】使用存储过程和计算同比环比
  • ChatGPT的前世今生,到如今AI领域的竞争格局,本文带你一路回看!
  • 如何在JavaScript中获取当前时间yyyymmddhhmmss? (六种实现方式)
  • 一、走进easyUI的世界
  • 2023 上半年软件设计师知识点复习总纲
  • 深入理解Java虚拟机:JVM高级特性与最佳实践-总结-3
  • vue3 cesium datav 可视化大屏
  • python内置函数,推导式
  • 【Flink】DataStream API使用之Flink支持的数据类型
  • QT实现固高运动控制卡示波器
  • 洛谷P1157详解(两种解法,一看就会)
  • JavaScript异步编程和回调
  • Qt开发笔记(Qt5.9.9下载安装环境搭建win10)