手写数字识别基于matlab GUI欧拉数和二维矩阵相关系数手写数字识别含Matlab源码 1896期
Posted 海神之光
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手写数字识别基于matlab GUI欧拉数和二维矩阵相关系数手写数字识别含Matlab源码 1896期相关的知识,希望对你有一定的参考价值。
一、手写数字识别简介
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(varargin1)
gui_State.gui_Callback = str2func(varargin1);
end
if nargout
[varargout1: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);
三、运行结果
四、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 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除
以上是关于手写数字识别基于matlab GUI欧拉数和二维矩阵相关系数手写数字识别含Matlab源码 1896期的主要内容,如果未能解决你的问题,请参考以下文章
手写数字识别基于支持向量机SVM实现手写数字识别matlab源码含GUI
手写数字识别基于支持向量机SVM实现手写数字识别matlab源码含GUI
交通标志识别基于matlab GUI矩匹配算法路标识别含Matlab源码 1175期
手写数字识别基于matlab GUI知识库手写数字识别(写字板+图片)含Matlab源码 1227期