打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
基于标准像素图像识别算法
我们直观上看到的一张图片里面的字符是很整齐的,但把图片放大,你就可以发现直观上看到的图片都是由一个个像素点组成的,比如下面这图片
很清晰的看到是“like3944”8个字符,但放大之后却是这样的

这样我就可以根据其每个像素点的颜色轨迹来进行图像字符识别!

    算法原理是首先第一步把所有有可能出现的字符以节点的方式全部存储在一棵树上,然后就是扫描目标图像,扫描完成后返回结果,说起来好像就几个步骤而已,接下来就描述一下算法的实现过程吧。
    最先要解决的问题是你要识别的图像正常情况下肯定不止一个字符,比如上面的“like3944”就有8个字符,我们肉眼能分割得出明显是8个字,但如何让机器也能分割这8个字符呢?

图片上的每个点都有3个数据表示颜色,包括红、绿、蓝3种颜色的数据值,仔细看可以发现“分割线”的颜色都是差不多的,所以我们可以自己定一个规则,我通过测试发现,只要像素值中红色的值只要 >= 210就是空白点,当然这个值只针对我这次需要处理的图像类型,其他图像也许颜色不同但原理是一样的。所以我们第一步就是根据自己定的规则把图像的所有像素点存储在一个1/0矩阵当中,1表示该点不为空,0表示空白处,这样处理完之后字符间的“分割线”就自然的出现,如上图,2个字符之间至少有1列数值全为0,这就形成我们所说的“分割线”。
    接下来就是收集所有可能出现的字符图像,每个字符都存储在一棵树结构上,我定义的规则是每个字符的最左上角的那个像素点为字符的开始,通过 Y轴-X轴的遍历方法很容易找到该点的坐标位置,找到字符的其实位置之后就开始上下扫描,上下波浪扫描的意思如图

直到扫描到有一整列的值都为0或矩阵扫描完成时结束,在扫描过程中遇到值为1的点时则计算该点所在位置与前一个为1的点之间的X坐标和Y坐标的偏移值,存储在一个数组当中,在这里要说明一点,这里的X轴Y轴并不是我们数学上真正意义上的坐标轴,这里我是用矩阵模拟,所以Y轴往下为+往上为-,举例说明上图中起始点坐标为(1,7),通过扫描规则我们可以看出下一个扫描点为(1,8),该点的值也是1,所以要计算2点之间的偏移值,X偏移量为0,Y偏移量为1。再举一个具有代表性的例子,比如到了第一列最下面那个点的坐标(1,12),通过扫描规则我们发现往下剩下的点值都为0,第一列扫描完后开始往上扫描第二列,可以看到下一个为1的点坐标为(2,13),再计算2点之间的偏移值,X偏移量为1,Y偏移量为1。所以扫描完成后,我们得到的结果是2个数组,假设字符像素点为1的点有n个,则数组存的分别是该n点中每相邻两个点的X和Y偏移量,数组长度为n-1。
    接下来就要开始初始化这个树了,下面是我建立该树节点的数据结构:
struct pxPath 
{
    int offX;//x轴偏移量
    int offY;//y轴偏移量
    int childNum;//子节点数量
    char word;//完成搜索后代表字符
    int isFin;//是否完成搜索
    struct pxPath *child;//子节点
    struct pxPath *next;//兄弟节点
    struct pxPath *lastChild;//最后一个子节点
};
    先定义一个头节点,树节点存储的是坐标的相对偏移值,实现细节就不一一赘述了,看下图,树的结构:


从上图可以看出字符a的路径为(0,+1)->(0,+1)->(+1,+1)->(+1,0)->'a'
字符b可以看出路径中有与字符a重叠的部分,但到最后节点处可以发现,他们都不是互相的前缀,这样可以保证每个字符路径的唯一性。当然以上的举例路径都是我个人假设的,真正一个字符大概有更多节点,所以在初始化树结构的时候每层的子节点都需要遍历,遇到偏移量相同则无需创建新的节点,否则加多一个兄弟节点,同时需给父节点记录最后一个子节点lastChild,如此类推,把所有可能出现的字符加进树中。

    成功建立树结构之后,开始识别图像字符,识别的过程可不是简简单单反过来执行一遍就OK,因为机器在识别之前是不知道将要识别的字符是什么,识别过程其实就是遍历我们刚刚建立的树的过程,只要走到最底层就能发现字符是什么。假如识别最上面的图“like3944”,图像还是要先经过颜色判断保存在0/1矩阵数组中,找到最左上角的为1的点为起始点,开始遍历树的头节点所有子节点,回到刚才的0/1矩阵中的起始点加上每个树节点的XY偏移量找到对应的坐标看是否为1,但这并不代表该点就是我们所要找的下一个节点,因为我们扫描是用上下波浪扫描,所以这2个点之间的扫描路径上不能存在有1的点,如果出现有1的点则表示这个路径是错误的,因此需要遍历下一个兄弟节点,以此类推,只有符合上述条件才是正确的唯一路径,在这里描述得不是很清晰,我再举个例子吧
假如字符'a'的像素点为如下
0 0 0 0 0 0 0
1 0 1 0 1 0
0 1 0 1 0 0
1 0 0 0 1 0
0 0 1 1 1 0
上面最左上蓝色的1为起始点,而假如我们通过树节点的偏移量计算出下一个点的坐标恰好是右边蓝色1的坐标,虽然该坐标点值为1,但并不代表这就是字符'a'的第二个像素点,因为我们看到蓝色1下面还有个红色的1,所以就如我上面说的还需满足一个条件,2点之前遵循上下波浪扫描路径不存在值为1的点,上面红色的数字方向就是路径,存在值为1的点,就要放弃该树节点,到下一个树节点继续此操作,直到满足条件位置。根据树的结构走到最底层遍能找出这个字符是什么,然后继续往后扫描,找到下一个字符的起始点,继续循环操作,直到图像结束。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
CCAction详解
关于相机标定的问题答复网友
OpenMV-AGAST算法代码阅读
Photoshop如何创建选区
验证码识别,发票编号识别
图像识别技术——验证码识别
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服