首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OCR图像字符解析算法

OCR图像字符解析算法
EN

Stack Overflow用户
提问于 2013-09-15 21:10:54
回答 3查看 5.1K关注 0票数 3

我正在研究OCR,现在我正在分析每个单独的字符,而不是其他字符。例如,如果我有一幅图像,上面写着:

代码语言:javascript
运行
复制
12345678.90

我希望检测每个数字在图像中的起始位置和结束位置的x,y坐标,这样我就可以确定要处理多少个数字,然后解析出每个单独的数字/字符,并对其进行处理。

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

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

  • 1)我会在图像底部的直线上读取图像中的像素。例如,如果图像是30x30,那么我将从0、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。

这个算法可以改进吗?或者我对第六步的假设是正确的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-15 21:31:38

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

滑动窗口的每一次移动都会产生一幅图像(您只看窗口覆盖的像素)。滑动的窗户会很窄。现在可以训练分类器,这将把滑动窗口映射到1或0,其中1表示滑动窗口的中心位置是2位,0表示相反。

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

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

票数 2
EN

Stack Overflow用户

发布于 2013-09-15 21:24:26

免责声明__:我以前从未写过任何类似OCR的软件。

在我看来,您的算法似乎有点错误,原因如下:

  • 1不是从你在底部找到第一个像素的位置开始的,因为你仍然有指向左边的小笔画,在1的顶部。
  • 2只会有几个像素高,因为你是直接上升,直到你找到一个背景像素。
  • 由于上述参数相同,3只会导致1像素乘1像素。
  • 等等。

我将尝试使用递归算法,尽可能地跟踪前景颜色像素,而不进入背景像素。当使用大字符的大图像时,这可能会导致堆栈溢出,因此最好在几个for循环中完成此操作,而不是使用递归函数。

如果您要这样做,这个逐像素发现一个字符,您可以使用该过程创建向量信息,您的字符是什么样子。我认为这将是一个很酷的起点来识别人物。

票数 1
EN

Stack Overflow用户

发布于 2014-04-22 10:46:25

我没有尝试编写OCR软件,但是我们确实使用它,而且它变得非常复杂。

还不完全清楚你的图像是从哪里来的;如果是扫描图像,那么就会有几个复杂的问题。尤其是在你的计划中,即使数字之间有一个缺口,它也可能不是垂直的(扫描的页面不太可能是完全笔直的)。其他因素包括“斑点”如果你正在处理这类图像,你几乎可以肯定的是,你需要寻找图像处理技术,将许多不同的数学运算应用到整个像素阵列上,这样就可以完成像deskew (矫正图像)、despeckle (去除随机点)、边缘增强(从光到暗的变化以增强线条)等工作。

从你使用的“背景”和“前景”颜色,它可能是你试图"OCR“一个图像从屏幕?如果是这样(某种“屏幕刮擦”过程),而且你知道(或者可以用)特定的字符形状进行解释,那么滑动窗口的一个变体可能会有所帮助:你可以在图像周围以不同的偏移量滑动已知的'5‘图像:如果'5’的所有像素都匹配图像中的“前景”像素,那么你就知道你找到了一个'5‘。重复其他数字。如前所述,这是我们所说的“虚拟”窗口。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18817533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档