我是一个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 步的假设中正确吗?