我正在研究 OCR,现在我正在努力将每个单独的字符与其他字符分开。例如,如果我有一张图片显示以下内容:
12345678.90
我想检测每个数字在图像中的开始位置和结束位置的 x,y 坐标,以便我可以确定要处理的数字数量,然后解析出每个单独的数字/字符,并进行处理。
我设计了一个简单的算法来做这件事,我想要一些关于如何改进它的意见/评论。
(在这个应用程序中,我只需要处理数字,但如果这个算法也能解析出字母,那就更好了)。
1)我会在图像底部以直线读取图像中的像素。例如,如果图像是 30x30,那么我将从 0,30 开始读取到 30,30。
2)我会比较像素的颜色。已经确定了背景和前景颜色,我将比较每个像素的颜色,看看它是在背景中还是在前景中。
3)如果它的背景,它将被忽略。如果我在前景中遇到任何像素,这将表明一个数字的开始。在这种情况下,我会记下位置,然后开始向上读取像素。例如,如果在 5,30 我检测到前景色,我将开始读取 5,29、5,28 等。
4)我会向上(y轴)读取像素,直到遇到背景颜色的像素。这应该给我角色的高度。(我知道对于一些像 5 这样的字符会更复杂,让我们暂时忽略它们)。所以我会确定,例如,角色从 5,20 垂直变为 5,30。
5) 然后我会回到 x 轴 (5,30),在那里我检测到角色的水平起点。我会继续横向阅读以确定字符的宽度,例如 6,30、7,30 等。
6)这是棘手的步骤。我猜,在以下每个字符之间:
12345678.90
背景颜色有一个像素左右的间隙。而且它可能对我们不可见,但它就在那里,程序会在水平逐个像素地读取颜色时找到它。这将告诉它角色水平结束的位置。因此,例如,它可能会在 15、30 处检测到背景颜色像素。
- 7)这就是算法,它应该给出
x,y
每个字母开始和下一个字母开始的坐标。在上面的示例中,字符将从 5,20 运行到 15,30,并且是 10x10。
这个算法可以改进吗,和/或我对第 6 步的假设是否正确?