基于基于FPGA的脱机手写体汉字识别系统
的脱机手写体汉字识别系统
本次设计要实现的目标就是建立一个图像处理识别的平台,使手写的汉字以图像文件格式(BMP)的形式输入
FPGA,提取出其特征向量,通过分类识别,转换为汉字文本。我们需要设计和实现脱机手写汉字识别系统,主
要实现样本采集,预处理,特征提取,分类与识别五个方面。
1设计摘要
设计摘要
1.1项目背景
项目背景
汉字作为非字母化、非拼音化的文字,在当今高度信息化的社会里,如何快速高效地将汉字输入计算机,已成为影响人机交流
信息效率的一个重要瓶颈。目前,汉字输入主要分为人工键盘输入和机器自动识别输入两种,其中人工键入速度慢且劳动强度
大。自动识别输入分为语音识别和汉字识别两种,其中汉字识别是将汉字点阵图形转换成电信号,然后输入给数字信号处理器
或计算机进行处理,依据一定的分类算法在汉字字符集合中识别出与之相匹配的汉字。因此,研究脱机手写体汉字识别的目的
就是解决汉字信息如何高速输入的问题,以更方便快速地进行信息加工处理。
脱机手写体汉字识别在以下领域中具有广泛的应用前途:
(1)信息处理领域中使用汉字识别技术可以大大提高纸质文档电子化的效率。若将汉字识别的准确度和速度均提高到比人工输
入更高的程度,便可在提高效率的同时节省人力资源。
(2)汉字自动识别是办公自动化、新闻出版等最理想的输入方法。
(3)很大部分电子文献是以点阵图像存储的,经过汉字识别后以字符存储,会大大节省存储空间,并提高网络等传输速度。
(4)使用FPGA进行汉字识别可以采用并行化计算,从而实现高速低功耗的文字识别。而如果采用人工键盘输入的方式,计算机
在大部分时间里处于等待键盘敲击的闲置状态,从而导致计算机系统利用率不高。
和所有模式识别系统一样,脱机手写体汉字识别的主要性能指标是正确识别率和识别速度,从实用角度看,还应考虑系统的复
杂性、可靠性和价格等等。对识别系统识别率和识别速度的要求,很难有一种统一的、严格的标准,主要根据实际应用的需要
来确定。但是作为一种输入手段,汉字识别系统的性能至少应该可以和其它输入手段(如人工输入)相比拟。
以上指标应该是汉字识别系统必须达到的最低要求(在某些需要大量输入的场合对识别系统性能的要求还应更高),但是由于手
写体汉字的特殊性,要达到上述要求困难较大。手写体汉字的特殊性可归纳为如下几条:
(1)字量大,字体多,结构复杂
(2)部分字形相似
(3)书写变化大:笔画不规范;笔画之间、偏旁部首之间相对位置不固定;连笔书写或笔画粘连。
(4)字与字之间相互粘连
正因为手写体汉字存在以上四特殊之处,脱机手写体汉字识别被一些学者看成是模式识别的最终目标。目前存在的主要问题
有:
(1)脱机手写体汉字的行、列切分正确率不高;
(2)在特征提取阶段,目前尚未找到一组适用于各种字体、笔迹的特征向量;
(3)由于汉字的特征向量维数较高,将待识别汉字的特征向量同样本库中的海量模板匹配会占用很多识别时间,直接导致识别
性能不高。
如果能采用FPGA进行高速并行计算,使上述困难能得到最大程度的化解,从而使脱机手写体汉字识别系统达到实用阶段,则
在实际应用方面和理论研究方面均有重大意义。由于汉字模式类别多,是大类别(或者称为超多类)模式识别问题,因此其识别
涉及到模式识别、图像处理、数字信号处理、人工智能、模糊数学等多个学科,是一门综合性技术,有着重要的价值和意义。
1.2系统的设计目标
系统的设计目标
本次设计要实现的目标就是建立一个图像处理识别的平台,使手写的汉字以图像文件格式(BMP)的形式输入FPGA,提取出其
特征向量,通过分类识别,转换为汉字文本。我们需要设计和实现脱机手写汉字识别系统,主要实现样本采集,预处理,特征
提取,分类与识别五个方面。系统的具体目标如下:
(1)使用FPGA对字库图像文件进行前期处理,包括字符分割平滑去噪、二值化处理、归一化、细化等。
(2)使用处理后的标准字符图像对分类模型进行训练,使其成为具有字形识别功能的分类器。通过包括神经网络、笔画密度、
字型特征、四角特征等多种分类器的测试,综合考虑每种分类器的并行化可能性、汉字特征针对性等,选出合适的分类器分别
进行粗分类和细识别,以利用FPGA的并行运算特性大幅度提高识别的效率和准确度。
(3)对多个手写样本图像文件进行并行化的采集和预处理,提出具有价值的字形特征。采用适当的分类器对其进行分类识别,
得到汉字国标码,从而实现手写体汉字从图片到文本的转换。
2系统原理和技术特点
系统原理和技术特点
2.1预处理预处理
2.1.1行、字切分
行、字切分
从实际出发,一个完整的脱机手写体汉字识别系统必须能对输入的整个手写体汉字图像进行一些必要的处理,并从中正确切分
出一个个手写体汉字,形成单个汉字的图像阵列,以便对其进行方便的单字识别处理。
通常的做法是对汉字图像从上到下逐行扫描,同时计算每扫描行的像素,获取图像的水平投影,利用文字行间空白间隔造成的
水平投影空隙,将行分割,再利用字与字之间的空白间隔在图像行垂直投影上形成的空白间隙,将单个汉字的图像切割出来。
2.1.2平滑去噪处理
平滑去噪处理
一幅汉字图像可能存在着各种噪声,消除图像中的这些噪声成分叫做图像的平滑化,其目的有两个:一是按特定的需要突出一
幅图像中的有用信息,使汉字图像清晰,视觉效果好;另一是为适应计算机处理的需要,消除汉字在输入数字化时所混入的噪
声。
常用的平滑去噪算法有中值滤波、邻域平均法去噪处理(均值滤波) 、Unger平滑算法等,在接下来的研究中我们将详细研究讨
论每种算法的特性并选择最适合汉字和FPGA特性的一种。
2.1.3二值化二值化
二值化就是把数字字符图像的灰度数字信号处理成只有O和1两级灰度的图像。对灰度图像二值化能显著的减小数据存储的容
量,降低后续处理的复杂度。二值化的基本要求是笔划中不出现空白并较好的保持原来文字的特征。
最简单的二值化通过设定固定灰度阈值完成,其关键在于阈值的选择。常用方法有整体阈值法(由灰度级直方图确定整体阈
值)、局部阈值法(由像素灰度值和像素周围点局部灰度特性确定阈值)、动态阈值法(不仅与灰度有关,还与该像素坐标位
置有关)。局部阈值和动态阈值虽然能处理质量较差的文字,避免整体阈值法带来的不应有的失真。但是,一则时间开销大,
二则考虑到实际的局部阈值和动态阈值选择算法往往在图像的某些部位上产生整体选择不会产生失真,所以,在文字识别中,
一般采用整体阈值法。
2.1.4归一化归一化
单个汉字图像(或点阵),还必须进行归一化处理,以消除汉字在位置和大小上的变化。归一化处理,主要包括位置归一化和大
小归一化。汉字点阵的归一化是十分重要的,因为汉字识别主要基于汉字的图形结构,如果不能将汉字点阵在位置和大小上经
归一化处理一致起来,汉字点阵的相似性比较就无法正确进行。
(1)位置归一化
主要有两种,一是重心归一化,二是外框归一化。重心归一化方法是计算出汉字的重心后将重心移到汉字点阵的规定位置。外
框归一化是将汉字的外框移到点阵规定位置上。因为重心计算是全局性的,因此抗干扰能力强;各边框搜索是局部性的,易受
干扰影响。而大多数汉字笔划分布左、右、上、下比较均匀,汉字的重心和汉字字形的中心相差不多,重心归一化不会造成字
形失真,但对个别上下分布不匀的汉字,重心归一化使字形移动,以致字形超出点阵范围而造成失真。
(2)大小归一化
对大小不一的的汉字进行识别,必须有效地进行大小归一化。常用方法是根据汉字点阵的外围边框进行的,先判断汉字点阵的
上、下、左、右的外围边框,然后按比例将汉字线性放大或缩小成规定大小的点阵。
2.1.5细化细化
在二值化点阵图像中,汉字图像中的前景像素点对识别率的贡献是不一样的,对识别有价值的汉字信息,主要集中在汉字骨架
上,因此经常用细化技术处理原始汉字图像的前景像素点,将满足一定条件的像素点保留,不满足条件的像素点置为背景像素
点,最终得到笔划宽度为1的汉字骨架图像。细化后的汉字骨架的存储量比原汉字二值化点阵要少得多,在降低了处理工作量
的基础上又保留了原汉字绝大部分特征,利于特征抽取,保证了识别的高效、正确性。但是细化往往会造成新的畸变,增加了
对识别的干扰和困难。细化的算法很多,大体分类如下:
(1)按细化后图形的连续性分,有四邻连接算法,八邻连接算法和混合连接算法。四邻接连指的是水平垂直四个方向上的连
接,八邻连接则加上正反斜向共八个方向。
(2)按细化处理过程分,有串行、并行和串并行处理法。FPGA适合并行计算,故我们采用并行处理法,即对边缘点全部检测完
毕后,再同时改变所有可删除点的值。
(3)按处理方式分,有单方向,双方向和四方向细化法。愈是方向多的细化处理方式,细化的速度愈快。
2.1.6预处理仿真示例
2.2特征提取
由于汉字字量大、字体多、结构复杂,我们采用分级分类的方法进行识别,而每级分类应采用最合适的特征提取算法。同时,
考虑到FPGA的并行计算特点,应优先选用并行性好的算法。基于以上两点,我们在对BP神经网络、字型特征、笔画密度特
征、弹性网格特征、笔画结构特征、四角特征等能够提取特征的算法进行了理论分析,有如下讨论:
2.2.1基于分类识别的选择
基于分类识别的选择
BP神经网络:具有自适应性,通过反复训练不断修正连接权值以进行特征提取。该方法具有较高的普适性,并且可以通过调
整学习方法得到一种较优的网络。但该方法并未利用汉字的特征,适用于子类中单字识别。
字型特征:通过对水平和垂直方向上投影得出的直方图的分析,可得出一个汉字的字型统计特征(左右、上下等),适于粗分
类。
笔画密度特征:从水平,垂直方向等间隔取多根扫描线,取穿过笔画数的最大值,形成2维特征向量,适于粗分类。
弹性网格特征:根据笔画位置将单个汉字分割为几个网格,通过计算每个网格内笔画的矢量特征进行特征提取,特征向量较
多,适用于子类中单字识别。
笔画结构特征:通过寻找交叉点和拐点将汉字分为笔段,然后将笔段按倾斜度和连通性合并成笔画,提取笔画的矢量特性作为
特征向量,向量数较多,适用于子类中单字识别。但该方法同时可以统计出笔画总数和交叉点总数,可用于粗分类。
四角特征:通过提取四角的笔画结构特征进行分类,向量中包含四个元素,可结合(5)进行粗分类。
我们将通过MATLAB对以上算法进行实验,以确定最优的分类和子分类中单字识别的算法。
2.2.2基于并行化运算的选择
BP神经网络:由于神经网络由神经元构成,每个神经元的计算以及权值调整计算都为乘法和加法,以上特征使之很适合并行
化和流水线计算。
字型特征:投影运算为串并行结合加法运算,最大值计算为串行运算,字型判断部分为较复杂串并行结合逻辑运算。
笔画密度特征:水平和垂直扫描运算为串行,多根扫描线并行,取最大值运算为串行。
弹性网格特征:分格后可对每格进行并行化运算,但其中的向量计算包含大量除法,其实现效率有待验证。
笔画结构特征:交叉点寻找为并行,倾斜度计算为并行,提取矢量特性为并行,但以上步骤的结果入库过程为串行扫描。
四角特征:四角可并行运算。
在进行MATLAB进行算法实验的同时,我们会同时使用System Generator进一步对算法的并行化及流水线计算可能性进行评
估实验,并结合2.2.1进行总体效率评估。
2.3分类识别
在分别对样本和标准样本提取特征后,分类和识别可采用神经网络、决策树、支持向量机或统计方法等。对于在FPGA上实现
文字识别来说,神经网络和统计方法可行性较好,下面对这两种算法的特点进行简单说明。
2.3.1神经网络
人工神经网络通过网络节点间的连接来存储信息并完成分类计算。神经网络分类器通过学习,根据训练样本集来调整连接的权
值,构造出相应的分类曲面。由于其较强的曲线拟合和模式分类能力,为手写签名识别的研究提供了新的手段。
神经网络有很强的信息处理能力,它能以任意精度逼近连续非线性函数;它信息处理的并行机制中的冗余性可以实现很强的容
错能力;对复杂不确定问题具有自适应和自学习能力。在一定多的训练次数以及合适的参数选择下,神经网络可以得出很理想
的结果。
神经网络是由大量神经元构成的,其自身的特点使其非常适合并行化和流水线计算。
2.3.2 统计方法
统计方法主要有最近邻归类、基于事例的学习等,这些方法本质上是基于某种距离进行相应变换,得到具有另外一些参数的分
类公式。统计学上主要用的基本距离公式有绝对值距离、欧氏距离、明斯基距离等。
其中,最小距离分类器作为一种直观有效的分类方法,在实际应用中受到广泛重视,尤其对于高维多模式问题,使用类聚等分
类方法存在计算量巨大、难以保证算法收敛等问题,距离函数分类器更显其优越性。在实际问题中,常把各类模式矢量的统计
平均值作为该类模式的基准模板,用待识别样本与此基准模板做比较。
统计计算多为乘累加运算,在FPGA中采用分级流水线乘法器和加法器可获得较高的计算效率。
2.4仿真识别结果
仿真识别结果(以数字测试
以数字测试)
附:
(部分matlab主要程序代码)
主程序:main.m
clear
clc
global X; %图像特征矩阵
global S; %样本特征矩阵
sample_training; %训练样本
E=imread('6_1.jpg'); %待识别图像读入
%A=gca;
imshow(E);%axis(A);
initial(E);
i=0;j=0;d=0;
Dm=zeros(10,15);
for i=1:10
for j=1:15
Dm(i,j)=abs(S(i,j)-X(1,j));
end
end
D=sum(Dm,2);
Position=find(D==min(D));
% i=Position;
if Position==10
Position=0;
else break;
end
set(handles.edit1,'String',Position);
预处理程序:initial.m
function initial(RGB)
GRAY=rgb2gray(RGB);
%高斯滤波
g=fspecial('gaussian',3,3);
GRAY1=imfilter(GRAY,g);
%切割图像
BW=im2bw(GRAY1);
[m,n]=size(BW);
%竖直投影
I1=sum(BW);
L=max(I1);
L1=L-2;
x1=0;x2=0;k=0;
for k=1:m
if I1(k)L1
x2=k;break;
else
k=k+1;
end
end
%水平投影
BW1=BW';
I2=sum(BW1);
L=max(I2);
L2=L-2;
y1=0;y2=0;k=0;
for k=1:n
if I2(k)L2
y2=k;break;
else
k=k+1;
end
end
%行,子切分
BW2=BW(y1:y2,x1:x2);
%图像归一化
NOR=imresize(BW2,[120 90]);
%特征提取
X=zeros(1,15);
X(1)=bwarea(NOR(1:40,1:30))/10800;
X(2)=bwarea(NOR(1:40,31:60))/10800;
X(3)=bwarea(NOR(1:40,61:90))/10800;
X(4)=bwarea(NOR(41:80,1:30))/10800;
X(5)=bwarea(NOR(41:80,31:60))/10800;
X(6)=bwarea(NOR(41:80,61:90))/10800;
X(7)=bwarea(NOR(81:120,1:30))/10800;
X(8)=bwarea(NOR(81:120,31:60))/10800;
X(9)=bwarea(NOR(81:120,61:90))/10800;
X(10)=X(1)+X(2)+X(3);
X(11)=X(4)+X(5)+X(6);
X(12)=X(7)+X(8)+X(9);
X(13)=X(1)+X(4)+X(7);
X(14)=X(2)+X(5)+X(8);
X(15)=X(3)+X(6)+X(9);