用于从图像中解析字符的OCR算法

我正在进行OCR工作,目前正在研究如何将每个单独的字符从其他字符中分离出来。例如,如果我有一张图片,上面写着以下内容:

12345678.90

我想检测每个数字在图像中开始和结束的x,y坐标,以便确定有多少个数字需要处理,然后解析出每个单独的数字/字符,并进行处理。

我已经设计了一个简单的算法来实现这一点,我想听听一些关于如何改进它的意见/评论。

(在本应用中,我只需要处理数字,但如果这个算法也能解析出字母,那就更好了)。

  • 1) 我会从图像底部开始,沿直线读取图像中的像素。例如,如果图像大小为30×30,我会从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,大小为10×10。

这个算法可以改进吗?我的第6步的假设正确吗?


回答:

我知道的一种常见分割数字的方法是滑动窗口。基本思路是,你在一个数字图像上滑动一个特定大小的窗口。

每次滑动窗口移动都会产生一个图像(你只看窗口覆盖的像素)。滑动窗口会很窄。现在可以训练一个分类器,将滑动窗口映射到1或0,其中1表示滑动窗口位于两个数字的分界处,0表示相反的情况。

你需要一些训练数据来训练分类器。或者你可以尝试使用无监督学习。

编辑:这个视频可能会有帮助:https://www.youtube.com/watch?v=y6ga5DeVgSY

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注