
我们直观看到的图片中的字符非常整齐,但是如果放大图片,您会发现直观看到的图片是由像素组成的,例如以下图片<
很明显可以看到8个字符,例如“ like3944”,但放大后就是这样
这样,我可以根据每个像素的颜色轨迹执行图像字符识别!
算法的原理是第一步,将所有可能的字符以节点的形式存储在树中,然后扫描目标图像. 扫描完成后,返回结果. 看来这只是几个步骤. 接下来,描述算法的实现过程.

要解决的第一个问题是,在正常情况下,您要识别的图像必须超过一个字符. 例如,上面的“ like3944”具有8个字符. 我们可以清楚地将其划分为8个字符,但是如何使机器也可以将这8个字符划分为?
图片上的每个点都有3个表示颜色的数据图像识别用什么算法,包括红色,绿色和蓝色3种颜色的数据值. 如果仔细观察,您会发现“段线”的颜色几乎相同,因此我们可以自行设置. 通常,通过测试我发现,只要像素值中的红色值> = 210,它就是空白点. 当然,此值仅适用于我这次需要处理的图像类型. 其他图像可能具有不同的颜色,但原理是相同的. 因此,我们的第一步是根据我们自己的规则将图像的所有像素存储在1/0矩阵中,1表示该点不为空,0表示空白,以使字符之间的“段线”经过处理后,如上图所示,两个字符之间的至少一列值全为0,这就是我们所说的``分界线''.
下一步是收集所有可能的字符图像. 每个字符都存储在树结构中. 我定义的规则是,每个字符左上角的像素都是字符的开始,并通过Y轴-X轴遍历方法很容易找到该点的坐标位置. 找到字符的实际位置后,它开始上下扫描. 图片显示了上下波扫描的含义
直到扫描到整列值都为0或矩阵扫描完成为止,当值为1的点为1时,将计算该点的位置与上一个点的1之间的X坐标扫描过程中遇到的问题与Y坐标的偏移值存储在数组中. 在这里,我必须解释一下X轴和Y轴并不是真正意义上的坐标轴. 我在这里使用矩阵模拟,因此Y轴从+向下到-,例如,上图中的起点坐标为(1,7),我们可以看到下一个扫描点为(1 ,8)通过扫描规则,该点的值也为1,因此我们需要计算2个点之间的偏移值,X偏移为0,Y偏移为1. 例如,当到达第一列(1,12)的最低点的坐标时,我们可以通过扫描规则发现剩余的点值全部为0. 向上扫描第二列,您可以看到下一个点坐标为(2,13),然后计算两个点之间的偏移值,X偏移为1,Y偏移为1. 因此,在扫描完成后,我们得到2个数组. 假设字符像素为1个点,则该数组在n个点中分别存储相邻两个点的X和Y偏移量,数组的长度为n-1.

下一步是初始化树. 以下是我构建的树节点的数据结构:
struct pxPath
{
int offX; // X轴偏移
int offY; // Y轴偏移
int childNum; //子节点数

字符词; //完成搜索后代表角色
int isFin; //是否完成搜索
struct pxPath * child; //子节点
struct pxPath *接下来; //兄弟节点
struct pxPath * lastChild; //最后一个子节点
};

首先定义一个头节点,树节点存储坐标的相对偏移值,实现细节将不一一赘述,见下图,树的结构:
从上图中可以看出,字符a的路径为(0,+1)->(0,+1)->(+1,+1)->(+ 1,0)- >'a'
可以看到字符b的路径中有一部分与字符a重叠,但是在最后一个节点处,可以发现它们不是彼此的前缀,这可以确保每个字符路径的唯一性. 当然,以上示例路径是我个人的假设. 一个字符中可能有更多的节点,因此在初始化树结构时,需要遍历每一层的子节点. 如果偏移量相同,则无需创建新节点. 否则,将添加一个附加的同级节点,并且需要为父节点记录最后一个子节点lastChild图像识别用什么算法,依此类推,将所有可能的字符添加到树中.
成功构建树结构后,开始识别图像字符. 识别过程不仅仅是简单地反向执行它. 可以,因为机器在识别之前不知道将识别哪些字符. 识别过程实际上正在遍历我们所拥有的东西. 在构建树的过程中,只要您走到最底下,就可以找出字符. 如果识别出最上面的图片“ like3944”,则应在进行颜色判断后将图片存储在0/1矩阵数组中,以1的左上角处的点为起点,并开始遍历该图片的所有子节点. 树的头节点转到0/1矩阵的起点,并添加每个树节点的XY偏移量以找到相应的坐标以查看其是否为1,但这并不意味着该点是我们的下一个节点正在寻找,因为我们扫描时是使用上下波进行扫描的,因此在这两点之间的扫描路径上不可能有1的点. 如果有一个点为1,则表示此路径错误,因此您需要遍历下一个同级节点,依此类推. 唯一正确的方法是满足上述条件. 这里的描述不是很清楚. 让我再举一个例子.
如果字符“ a”的像素如下所示
0 0 0 0 0 0 0
左上角的蓝色1是起点,如果我们根据树节点的偏移量计算下一个点的坐标,则它恰好是右边的蓝色1的坐标. 尽管坐标点值为1,但这并不意味着这是字符“ a”的第二个像素,因为我们看到蓝色1下方有红色1,因此如上所述,必须满足条件. 在2之前进行上下波扫描. 路径上没有任何值为1的点. 上面的红色数字方向是路径. 如果存在一个值为1的点,则必须放弃该树节点并继续此操作,直到下一个树节点,直到满足条件位置为止. 您可以通过根据树的结构走到树的底部来找出该字符是什么,然后继续向后扫描以找到下一个字符的起点,并继续循环操作直到该字符结束图片.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-186479-1.html
中国没有像样的民族工业