一种MXN维的手写字符识别算法
1 概述
本文的灵感来源于杨淑莹老师的一张PPT(手写数字识别),在此特别鸣谢杨淑英老师。
一般机器视觉对事物是没有感知的,比如摄像头采集到一张苹果的图片,它本身是不知道那是什么东西,在计算机里边就是一个图像数据矩阵的存在。但是我们人类可以通过各种图像处理手段,不断提取事物的特征来让机器通过特征编码来识别和区分不同的事物。
2 一种MXN维的手写字符识别算法
图1 识别过程
如图1所示,这是杨淑英老师PPT(手写数字识别)的一张图,对于一个字符,首先我们要找到字符的上下左右边界,然后在把它分为MxN维的矩阵,再提取矩阵的特征,最后通过特征库匹配来识别字符。此种方法有效的降低了目标的维数,为FPGA的实现提供了可能。
特征形成:根据被识别的对象产生出来的一组基本特征。
特征选择:对原始数据进行抽取,抽取那些对区别不同类别最为重要的特征,而舍去那些对分类并无多大贡献的特征,得到能反映分类本质的特征。
特征提取:是模式识别的关键,直接影响其识别的分类效果。两种方法:
1)以框架的左边框到数字之间的距离变化。
2)将每个数字分成N×N等份,对每一份内的像素个数进行统计,除以每一份的面积总数。
图2 25维手写体5
如图2所示,我们通过每一个小框黑色的占比来从新编码一个新的5X5矩阵,当模板与之匹配时即可识别数字5,我没还可以通过人帮助机器不断学习,让机器的识别更加准确。
分成N×N等份的好处是:
针对同一形状、不同大小的样品得到的特征值相差不大。有能力对同一形状、不同大小的样品视为同类,因此这里要求物体至少在宽度和长度上大于N个像素,否则太小无法正确分类。
3 matlab 仿真MXN维字符识别
第一步:首先找到字符上下左右边界。
I = imread('5.png');
Ib =im2bw(I);
[h,w,d] =size(Ib);
ROW = w-1;
COL = h-1;
k=1;
for i=1:COL
for j=1:ROW
if i>1 && j>1
if (Ib(i,j) == 0 &&Ib(i-1,j) == 1) || (Ib(i,j) == 0 &&Ib(i 1,j) == 1)
a(k) =i;
b(k) =j;
k=k 1;
end
end
end
end
maxa =max(a);
mina =min(a);
maxb =max(b);
minb =min(b);
%boundary
for i=1:COL
for j=1:ROW
if(i > mina &&i < maxa)&&(j==minb||j==maxb)
boundary(i,j,1)= 255;
boundary(i,j,2)= 0;
boundary(i,j,3)= 0;
elseif(i == mina ||i == maxa)&&(j>minb && j<maxb)
boundary(i,j,1)= 255;
boundary(i,j,2)= 0;
boundary(i,j,3)= 0;
else
boundary(i,j,1)= I(i,j,1);
boundary(i,j,2)= I(i,j,2);
boundary(i,j,3)= I(i,j,3);
end
end
end
图3 字符5的上下左右边界
第二步:分成MXN维。
%MXN DIM
for i=1:COL
for j=1:ROW
if(i > mina &&i < maxa)&&(j==minb||j==maxb || j==b1||j==b2|| j==b3||j==b4)
R(i,j,1)= 255;
R(i,j,2)= 0;
R(i,j,3)= 0;
elseif(i == mina ||i == maxa||i ==a1 || i ==a2 || i ==a3 || i ==a4|| i ==a5 || i ==a6 || i ==a7)&&(j>minb && j<maxb)
R(i,j,1)= 255;
R(i,j,2)= 0;
R(i,j,3)= 0;
else
R(i,j,1)= I(i,j,1);
R(i,j,2)= I(i,j,2);
R(i,j,3)= I(i,j,3);
end
end
end
图4 MXN维字符5
第三步:统计特征信息。
for i=1:COL
for j=1:ROW
if(i > mina &&i < a1 && j>minb && j<b1)&& Ib(i,j)==0
x11 =x11 1;
elseif(i > a1 &&i < a2 && j>minb && j<b1)&& Ib(i,j)==0
x12 =x12 1;
elseif(i > a2 &&i < a3 && j>minb && j<b1)&& Ib(i,j)==0
x13 =x13 1;
elseif(i > a3 &&i < a4 && j>minb && j<b1)&& Ib(i,j)==0
x14 =x14 1;
elseif(i > a4 &&i < a5 && j>minb && j<b1)&& Ib(i,j)==0
x15 =x15 1;
elseif(i > a5 &&i < a6 && j>minb && j<b1)&& Ib(i,j)==0
x16 =x16 1;
elseif(i > a6 &&i < a7 && j>minb && j<b1)&& Ib(i,j)==0
x17 =x17 1;
elseif(i > a7 &&i < maxa && j>minb && j<b1)&& Ib(i,j)==0
x18 =x18 1;
end
end
End
if(x11/y>0.5)
y11 =0;
else
y11 =1;
end
result =[y11,y21,y31,y41,y51;
y12,y22,y32,y42,y52;
y13,y23,y33,y43,y53;
y14,y24,y34,y44,y54;
y15,y25,y35,y45,y55;
y16,y26,y36,y46,y56;
y17,y27,y37,y47,y57;
y18,y28,y38,y48,y58];
图5 字符5 特征信息
第四步:与模板匹配识别。
match5 =[0,0,0,0,1;
0,1,1,1,1;
0,1,1,1,1;
0,0,0,0,1;
1,1,1,1,0;
1,1,1,1,0;
1,1,1,1,0;
0,0,0,0,1];
if(result == match0)
display(0);
elseif(result == match1)
display(1);
elseif(result == match2)
display(2);
elseif(result == match3)
display(3);
elseif(result == match4)
display(4);
elseif(result == match5)
display(5);
elseif(result == match6)
display(6);
elseif(result == match7)
display(7);
elseif(result == match8)
display(8);
elseif(result == match9)
display(9);
elseif(result == matchA)
display('A');
elseif(result == matchB)
display('B');
else
display('NO MATCH');
End
图6 字符5识别成功
其他字符展示
图7 字符9识别过程
图8 字符9识别结果
图9 字符A识别过程
图10 字符A识别结果
总结:相比较之前的特征线法,MXN维法识别准确率提高了很多,并且可以去识别字母、汉字、简单图形等。这为我们的车牌识别提供了一个理论基础和一种算法思想。对于更复杂的图案我们可以增加维数来进行更准确地识别。
欢迎大家留言讨论这种算法的好与坏,以及是否适合FPGA实现。大家可在公众号下回复"PPT"获得杨淑莹老师的手写体数字识别PPT。