基于FPGA 的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:COLfor j=1:ROWif i>1 && j>1if (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;endendend
endmaxa =max(a);
mina =min(a);maxb =max(b);
minb =min(b);%boundary
for i=1:COLfor j=1:ROWif(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;elseboundary(i,j,1)= I(i,j,1);boundary(i,j,2)= I(i,j,2);boundary(i,j,3)= I(i,j,3);endend
end
图3 字符5的上下左右边界
第二步:分成MXN维。
%MXN DIM
for i=1:COLfor j=1:ROWif(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;elseR(i,j,1)= I(i,j,1);R(i,j,2)= I(i,j,2);R(i,j,3)= I(i,j,3);endend
end
图4 MXN维字符5
第三步:统计特征信息。
for i=1:COLfor j=1:ROWif(i > mina &&i < a1 && j>minb && j<b1)&& Ib(i,j)==0x11 =x11+1;elseif(i > a1 &&i < a2 && j>minb && j<b1)&& Ib(i,j)==0x12 =x12+1;elseif(i > a2 &&i < a3 && j>minb && j<b1)&& Ib(i,j)==0x13 =x13+1;elseif(i > a3 &&i < a4 && j>minb && j<b1)&& Ib(i,j)==0x14 =x14+1;elseif(i > a4 &&i < a5 && j>minb && j<b1)&& Ib(i,j)==0x15 =x15+1;elseif(i > a5 &&i < a6 && j>minb && j<b1)&& Ib(i,j)==0x16 =x16+1;elseif(i > a6 &&i < a7 && j>minb && j<b1)&& Ib(i,j)==0x17 =x17+1;elseif(i > a7 &&i < maxa && j>minb && j<b1)&& Ib(i,j)==0x18 =x18+1;endend
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');
elsedisplay('NO MATCH');
End
图6 字符5识别成功
其他字符展示
图7 字符9识别过程
图8 字符9识别结果
图9 字符A识别过程
图10 字符A识别结果
总结:相比较之前的特征线法,MXN维法识别准确率提高了很多,并且可以去识别字母、汉字、简单图形等。这为我们的车牌识别提供了一个理论基础和一种算法思想。对于更复杂的图案我们可以增加维数来进行更准确地识别。
4 FPGA实现MXN维字符识别框架介绍
图11 FPGA实现MXN维字符识别模块图
如上图11所示,FPGA要处理的图像从HDMI_IN输入到FPGA内部,最后再由HDMI_OUT输出到显示器上,由串口将识别到的字符打印的串口工具上。
- rgb2gray:完成rgb彩色图像转灰度图像,算法采用(R+G+B)/3。
- Threshold_binary:完成灰度图像二值化,采用单峰。
- HVcount:图像行列计数,为了之后的边界查找。
- VP_one:完成目标字符的边界计算,采用水平和垂直投影算法。
- character_Statistics:完成MXN维的字符特征信息统计。
- Char_match:采用模板匹配的方法完成正确字符的识别。
5 字符模板以及训练过程
下图为用于训练的部分字符模板。
训练过程
fpga字符识别https://www.zhihu.com/video/12163120710187130886 FPGA实现板卡
本工程实现采用xilinx Z7芯片,板卡如下图所示。
本实验训练过程采用fpga内部产生字符方式进行训练。
对于摄像头采集的也需要进行训练后方可识别目标字符。
7 FPGA内部ila抓取结果
字符‘C’的识别结果和统计结果
字符‘2’的识别结果和统计结果
字符6的识别结果和统计结果
字符‘A’的识别结果和统计结果
字符‘Z’的识别结果和统计结果
8 应用展望
在对数字0-9和字幕A-Z的识别后我们还做了汉字的识别,依然可以轻松的识别汉字。这意味着利用此方法可以轻松地完成车牌识别和一些交通号牌和简单图案的区分和识别。