【手写数字识别】基于matlab GUI欧拉数和二维矩阵相关系数手写数字识别【含Matlab源码 1896期】

举报
海神之光 发表于 2022/06/19 23:48:41 2022/06/19
【摘要】 一、手写数字识别简介 1 引言 数字识别技术是图像处理领域中的一个研究热点, 在食品、化妆品、药品等外包装生产日期提取上具有重要的实用价值。近年来, 随着人们对数字图像识别算法的不断研究, 数字图像识别...

一、手写数字识别简介

1 引言
数字识别技术是图像处理领域中的一个研究热点, 在食品、化妆品、药品等外包装生产日期提取上具有重要的实用价值。近年来, 随着人们对数字图像识别算法的不断研究, 数字图像识别方法也越来越多, 主要有基于神经网络数字图像识别、基于最小距离法的数字图像识别, 以及基于模板匹配的数字图像识别。在实际应用中, 人们发现数字识别算法的识别率一般较低, 个别识别率较高的算法比较复杂, 且收敛速度普遍较慢, 缺少两方面性能皆优的方法。针对目前存在的问题, 结合印刷体数字的特点, 笔者提出了一种基于特征矩阵的高效数字图像识别算法。该算法首先在预处理的基础上提取字符的特征矩阵, 利用特征矩阵对简单的特征 (横线) 进行提取, 然后应用结构语句识别方法将数字中的多数识别出来。再采用排除法缩小识别数字的范围, 并对其中的数字特征凹陷区域进行分析和比较, 同时采用上述同样的方法对数字进行识别使算法简单, 识别速度快且识别效果好。

1 数字图像预处理
图像预处理是对采集到的图像画面在进行数字识别之前所做的一些相关工作, 主要包括图像灰度化、二值化、 梯度锐化、中值滤波、分割、归一化、细化等步骤, 具体流程如图1所示。对图像进行预处理非常必要, 它能够有效地去除图像噪声, 减小各类干扰对图像识别的不利影响, 为特征提取和识别奠定了基础。图像预处理的每一步结果如图2-图9所示。
在这里插入图片描述
图1数字预处理流程
在这里插入图片描述
图2 原始图像
在这里插入图片描述
 图3 灰度化
 在这里插入图片描述
 图4 二值化
 在这里插入图片描述
图5 梯度锐化 
在这里插入图片描述
图6 中值滤波 
在这里插入图片描述
 图7 分割
 在这里插入图片描述
图8 归一化
在这里插入图片描述
图9 细化

3 数字识别算法
经过细化之后, 通过从上到下, 从左到右对图像进行扫描, 提取字符的特征矩阵。由于细化后矩阵的边界可能存在全为0的行或列, 为了便于后续特征提取, 需要将其全为0的行列全部删除, 得到类似如图10所示的矩阵, 记为juzhen[m][n]。设前景像素为1, 背景像素为0。

对0~9这10个印刷体数字, 首先可以根据是否存在横线将数字分为两个子集, 其中1、2、4、5、7存在横线记H =1。0、3、6、8、9不存在横线记H=0。在H=1的集合中, 因为横线存在的位置不同, 可以将其再分为3个子集: 1、2存在下横线;5、7存在上横线;4横线位置记为其它。 这样数字识别的范围又进一步缩小了, 接下来可以在小范围内进行特征比较来实现数字的识别。如5、7特征比较发现, 5上半部分存在左凹陷区, 下半部分存在右凹陷区。 对于凹陷区域的识别可以依据矩阵在凹陷区域内像素值为0, 限定区域范围统计0的行数即可, 该区域范围仅针对每个特定数字而言, 这样5就可以识别出来, 运用排除法7自然而然也被识别出来。1、2特征比较发现, 1存在竖线, 2没有这个特征, 4不需进行特征比较即可得出结果, 为了使识别结果更加准确, 可以加上竖线这个特征。 在H=0的集合中, 0的结构较简单, 特征也较明显, 把它作为一个集合来对待。它是一个封闭的圆圈, 圆圈内没有像素则通过矩阵在一个较大区域内像素1的个数小于阈值的范围来提取。3、8、6、9作为另一个集合, 特征比较发现, 3上、下两部都存在右凹陷区, 6上半部分存在左凹陷区, 9下半部分存在右凹陷, 除此之外就是8。这10个数字中的1较特殊, 有的字体底部没有横线, 有的底部存在横线, 所以除了上述判断还要考虑没有横线的情况。数字识别流程如图11所示, 其中上半部分左凹陷区域记为上左, 上半部分右凹陷区记为上右, 下半部分右凹陷区域记为下右, 下半部分左凹陷区域记为下左。识别顺序按照从上到下、从左到右进行。对于易识别错误的字符进行了多处特征比较, 如字符3、5等。数字特征提取条件如表1所示, 特征的提取需要用到以下自定义函数:
在这里插入图片描述
图10字符矩阵

表1 数字特征提取条件
在这里插入图片描述
H (juzhen[m][n], int r, int m, int s, int n) ;//横线的提取, 统计每一行像素值为1的长度是否为列的3m/4, 存在H=1, 不存在则H=0。

L (juzhen[m][n], int r, int m, int s, int n) ;//竖线的提取, 统计每一列像素值为1的长度是否为列的3n/4, 存在L=1, 不存在则L=0。

Q (juzhen[m][n], int r, int m, int s, int n) ;//圆圈的的提取, 某一区域内像素值为1的点的个数。

S (juzhen[m][n], int r, int m, int s, int n) ;//凹陷区域的提取, 某一区域内像素全为0的行数。

其中, juzhen[m][n]为字符的特征矩阵, r, m分别为矩阵行的起始、结束位置, s, n分别为矩阵列的起始、结束位置。
在这里插入图片描述

二、部分源代码

function varargout = num_sb(varargin)
% NUM_SB MATLAB code for num_sb.fig
%      NUM_SB, by itself, creates a new NUM_SB or raises the existing
%      singleton*.
%
%      H = NUM_SB returns the handle to a new NUM_SB or the handle to
%      the existing singleton*.
%
%      NUM_SB('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in NUM_SB.M with the given input arguments.
%
%      NUM_SB('Property','Value',...) creates a new NUM_SB or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before num_sb_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to num_sb_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help num_sb

% Last Modified by GUIDE v2.5 02-Jun-2022 18:36:45

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @num_sb_OpeningFcn, ...
                   'gui_OutputFcn',  @num_sb_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before num_sb is made visible.
function num_sb_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to num_sb (see VARARGIN)

% Choose default command line output for num_sb
handles.output = hObject;
clear global;clc
set(gcf,'name','手写数字识别'); %修改GUI的界面名称
% Update handles structure
guidata(hObject, handles);

% UIWAIT makes num_sb wait for user response (see UIRESUME)
% uiwait(handles.figure1);

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

三、运行结果

在这里插入图片描述
在这里插入图片描述

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
[5]徐敬,刘炜.基于特征矩阵的高效数字识别算法[J].软件导刊. 2014,13(01)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。

原文链接:qq912100926.blog.csdn.net/article/details/125349713

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。