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

news2024/11/29 10:40:25

目录

    • 一、问题描述
    • 二、概念神经网络实现手写体数字识别原理
    • 三、算法步骤
      • 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:100
        file = 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.5
    flag = 0;
elseif flag >=0.5 && flag <0.75
    flag = 1;
elseif flag >=0.75 && flag <1
    flag = 2;
else
    flag = 3;
end

% 重新放大,将长或宽调整为64
rate = 64 / max(size(A));
% 调整尺寸
A = imresize(A,rate);  
[x,y] = size(A);

% 不足64的部分用零填充
if x ~= 64
    A = [zeros(ceil((64-x)/2)-1,y);A;zeros(floor((64-x)/2)+1,y)];
end;
if y ~= 64
    A = [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:1000
    tmp(:,:,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.coloradmin.cn/o/470508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

07 【Sass语法介绍-控制指令】

1.前言 Sass 为我们提供了很多控制指令&#xff0c;使得我们可以更高效的来控制样式的输出&#xff0c;或者在函数中进行逻辑控制。本节内容我们就来讲解什么是 Sass 控制指令&#xff1f;它能用来做什么&#xff1f;它将使你更方便的编写 Sass 。 2.什么是 Sass 控制指令 控…

松下 OPF CMOS影像传感器

一、概述 不久前&#xff0c;松下在其国际网站公布了关于有机光电导膜&#xff08;OPF&#xff09;CMOS影像传感器技术的最新研发进展&#xff0c;并表示该技术已趋于成熟&#xff0c;有望在未来一段时间内正式投入商用。此外&#xff0c;松下还在3月15日至16日&#xff0c;于…

Oracle LiveLabs DB Security (数据库安全)实验汇总

在Oracle LiveLabs中&#xff0c;和数据库安全相关的实验分为2个系列&#xff0c;共12个实验。 Oracle数据库安全架构如下图&#xff1a; 这些实验涉及了Oracle安全相关的特性&#xff0c;企业版选件&#xff0c;独立产品和服务。 关于Oracle安全产品的中文主页可见&#…

Marior去除边距和迭代内容矫正用于自然文档矫正

一、简要介绍 本文简要介绍了论文**“ Marior: Margin Removal and Iterative Content Rectification for Document Dewarping in the Wild ”的相关工作。照相机捕捉到的文档图像通常会出现透视和几何变形。考虑到视觉美感较差和OCR系统性能下降&#xff0c;对其进行纠正具有重…

JavaScript实现输入圆的半径,输出周长、体积和面积的代码

以下为输入圆的半径,输出周长、体积和面积实现结果的代码和运行截图 目录 前言 一、请输入圆的半径,输出周长、体积和面积 1.1运行流程及思想 1.2代码段 1.3 JavaScript语句代码 1.4运行截图 前言 1.若有选择&#xff0c;您可以在目录里进行快速查找&#xff1b; 2.本博…

【crontab】如何解决命令末尾自动加^M,导致不生效的问题

目录 场景&#xff1a; 问题&#xff1a; 问题原因&#xff1a; 解决方案&#xff1a; Step 1&#xff1a;编辑文件yolov5 &#xff0c;并查看文件类型 Step 2&#xff1a;修改文件类型 yolov5 Step 3&#xff1a;yolov5中的定时任务加入到crontab中,并查看crontab 列表…

前端性能优化总结(SPA篇)

性能优化 所有开发者都无法避免的一个问题&#xff0c;即关于项目的性能优化。性能优化是一个经久不衰的问题&#xff0c;它几乎贯穿于整个项目的开发过程。做好性能优化的项目不仅能在用户体验上更胜一筹&#xff0c;还能让服务资源的分配更加的合理。 关于SPA&#xff08;单…

互联网医院开发|线上问诊系统开发|互联网医院功能开发

互联网医院在智慧医疗版块可以算的上是“核心成员”&#xff0c;无论是出色的实战能力还是在管理功能模块上&#xff0c;都为行业带来了切实的便利&#xff0c;就例如平时的工作安排&#xff0c;省时省力&#xff0c;也让患者有更方便的就医条件&#xff0c;互联网医院系统源码…

必须掌握的重写,重载,equals,==

生活是晨起暮落&#xff0c;日子是柴米油盐&#xff0c;时光匆匆&#xff0c;我们终将释怀。 重写与重载的区别 重写(Override) 1.发生在父类与子类之间 2.方法名&#xff0c;参数列表&#xff0c;返回类型必须相同 3.访问修饰符的限制一定要大于被重写方法的访问修饰符,如果…

【sunny land】利用Animation编辑器实现近战敌人判定

昨晚研究了一晚Boss近战判定&#xff0c;也找了一些方法&#xff0c;但始终找不到合适的 今天终于让我找到了[泪目] 让我们先看演示 这个效果是我们的Boss挥刀时不造成伤害&#xff0c;当火焰冒出来时再对主角造成伤害。 这个我讲详细点吧 步骤&#xff1a; 首先&#xff…

矿井水行业氟超标的解决方法

高矿化度的废水是指含有高浓度溶解性矿物质的废水&#xff0c;通常指的是含有高浓度钠、钙、镁、铁、铝、钾等离子的废水。这些离子通常来自于废水所处的环境、工业或生产过程中使用的原材料和化学品。高矿化度的废水通常具有高盐度、高电导率、高硬度等特征&#xff0c;对环境…

三星弃Google用Bing?谷歌赶工新AI搜索Magi

“三星考虑将手机端的默认搜索引擎由Google换成Bing”&#xff0c;《纽约时报》上的这则消息披露次日&#xff0c;微软股价上涨2%&#xff0c;谷歌母公司Alphabet股价下跌3%。 过去20年里&#xff0c;谷歌一直是在线搜索领域无人能敌的霸主&#xff0c;微软旗下的Bing只在3%-5…

录屏文件太大怎么办?您可以这样做!

案例&#xff1a;录制的录屏文件体积比较大怎么办&#xff1f; 【我发现我录制的电脑录屏文件体积比较大&#xff0c;不好保存&#xff0c;会占用电脑的内存。我想知道怎样才可以录制体积较小的录屏&#xff1f;有没有小伙伴有解决的办法&#xff1f;】 录屏是我们经常需要用…

ATTCK v12版本战术介绍——防御规避(四)

一、引言 在前几期文章中我们介绍了ATT&CK中侦察、资源开发、初始访问、执行、持久化、提权战术理论知识及实战研究、部分防御规避战术&#xff0c;本期我们为大家介绍ATT&CK 14项战术中防御规避战术第19-24种子技术&#xff0c;后续会介绍防御规避其他子技术&#xf…

IO流复习

IO流 程序到文件&#xff0c;文件到程序分为输出流和输入流流分为字节流&#xff0c;字符流 字节流可以操作所有类型文件&#xff0c;字符流只能操作文本文件&#xff08;可以用windows记事本打开并且能正常读懂的文件&#xff09; 流的结构图&#xff1a;只有下面接口的实现…

如何利用Trimble RealWorks三维激光扫描仪进行外业测量和内业处理?

文章目录 0.引言1.Trimble RealWorks介绍2.外业测量3.内业处理 0.引言 笔者所在资源与环境工程学院实验室采购有一台Trimble RealWorks三维激光扫描仪&#xff08;仪器名&#xff1a;Trimble TX8&#xff09;&#xff0c;因项目需要&#xff0c;在学校实验场地进行实地测量训练…

MIT教授Tegmark:GPT-4敲响警钟,百年后人类何去何从丨智源大会嘉宾风采

导读 一封呼吁暂停大模型研究6个月的公开信让一家名为未来生命研究所&#xff08;Future of Life Institute 简称&#xff1a;FLI&#xff09;站上了风口浪尖。这家研究所的联合创始人Max Tegmark是来自麻省理工学院的物理学家和人工智能研究员&#xff0c;《生命3.0在人工智能…

Unity TextMeshPro文本描边outline存在黑底问题研究

在使用TextMeshPro的时候遇到了字体黑底的问题&#xff0c;类似下图这样 当字体较大的时候表现正常&#xff0c;当缩小到一定程度就会出现黑底。这个情况让人第一时间就是怀疑SDF计算缩放的时候存在问题。在我们重新导出字体&#xff0c;调整图集字体大小以及Padding后&#xf…

【深度学习】点云PointNet从0到1

文章目录 前言1 PointNet1.1 点云的数据集1.2 点云的挑战1.1 网络结构 前言 直接处理点云数据的深度学习技术PointNet End To end Learning for scattered&#xff0c; unordered point data Unified franework for various tasks Point-Based Methods 分为 PointNet 和 Poin…

万字长文 - Nature 综述系列 - 给生物学家的机器学习指南 1

生物数据的规模不断扩大和固有复杂性促使越来越多的人在生物学中使用机器学习来构建相关生物过程的信息和预测模型。所有机器学习技术都是把数据拟合到模型&#xff0c;然而&#xff0c;具体方法千差万别&#xff0c;乍一看似乎令人困惑。在这篇综述中&#xff0c;我们旨在向读…