【发布时间】:2013-09-19 23:37:06
【问题描述】:
我正在研究 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 步的假设是否正确?
【问题讨论】:
标签: java algorithm artificial-intelligence ocr image-manipulation