从图像中提取字符

时间:2012-02-18 15:04:15

标签: c# image-processing image-segmentation

我试图从黑色&中提取(不识别!)字符白色图像,如果图像是123, 我得到了3个图像的数组,

它是一个重复的问题,我知道,但我无法找到我想要的东西,我也尝试通过代码项目查找但无法找到一个有效的例子

http://www.codeproject.com/Articles/143059/Neural-Network-for-Recognition-of-Handwritten-Digi
源代码未完成


您的帮助非常感谢:)

5 个答案:

答案 0 :(得分:4)

正如Kenny已经提到的,“连通组件标签”描述了一系列识别连接像素的算法。连接组件也以“连接区域”或“blob”的名称,以及“轮廓”的相关概念。任何这样的算法应该不仅能够找到连接的前景像素的形状,而且能够找到由背景颜色的像素组成的形状内的“孔”的存在。

http://en.wikipedia.org/wiki/Connected-component_labeling

该算法用于依赖图像处理的多个工程领域,包括计算机视觉,机器视觉和医学成像。如果你要在图像处理上花费任何时间,你应该对这个算法非常熟悉,并且至少自己实现一次。

OpenCV库有一个findContours()函数,可用于查找轮廓,轮廓内的轮廓等。
http://opencv.willowgarage.com/wiki/

如果您希望在工作中看到区域标记算法,请使用应用程序ImageJ查找对“细胞计数”的引用。计数生物细胞是医学成像区域标记的一个重要且经常被引用的应用。

http://rsbweb.nih.gov/ij/

考虑获取有关该主题的教科书,而不是在线学习零碎。研究连通分量(a.k.a.blobs)不可避免地导致考虑二值化(a.k.a.thresholding),它采用灰度或彩色图像并从中生成黑白图像。如果你正在处理来自相机的图像,那么照明变得至关重要,这需要时间和修修补补。

清理图像可能需要许多其他预处理步骤。预处理的需要取决于您的应用程序。

这是一本经常被推荐的教科书,它可以很好地覆盖标准图像处理技术:

数字图像处理,Gonzalez和Woods,第3版 http://www.imageprocessingplace.com/

转到addall.com查找便宜的副本。国际版本更便宜。

如果图像中的字符(或其他形状)具有一致的大小和形状 - 例如,“A”总是40像素高,25像素并且机器以相同的字体打印 - 那么你可能会使用“归一化互相关”或模板匹配技术来识别一个或多个匹配形状的存在。这种技术可以作为一种非常粗略的OCR,但有严重的局限性。

http://en.wikipedia.org/wiki/Template_matching

答案 1 :(得分:3)

如果您的图像在白色背景上表示黑色字符(反之亦然),并且图像质量合理,并且文本行是水平的,并且如果每个字符与其邻居分开,则这是一个相对简单的操作找到白色海洋中所有黑色像素的小岛屿。

随着每个ifs的放松,问题变得更加困难,但在概念上保持不变:找到一个黑色像素,然后找到它所连接的所有其他黑色像素,并找到一个字符。或者,考虑到有关OCR和您的要求的评论,您已经找到了一块黑色像素(您断言)代表一个角色。

答案 2 :(得分:1)

我已将代码放在代码项目中,它完全符合您的要求 Connected Component Labeling and Vectorization

使用Fu Chang,Chun-Jen Chen和Chi-Jen Lu的论文A Linear-Time Component-Labeling Algorithm Using Contour Tracing Technique进行单程轮廓提取。

答案 3 :(得分:0)

您可能会发现了解机器视觉中的Blob或连通性分析很有用。大多数图书馆,包括免费图书馆,都有类似的东西。此外,如果您知道方向,文本是黑白,文本间隔很好,您应该能够在X和Y中找到图像的1d投影中的字符边缘或任何角度(如果有时间)。 / p>

答案 4 :(得分:0)

在我看来,到目前为止最好的答案是Rethunk指出你应该使用细分和连接组件标签。 HighPerformanceMark基本上描述了连通组件标签算法(这是一个非常简单的算法),但我认为提到算法的名称对于这种答案很重要。

但请注意,细分和连接组件标签只是解决问题的起点。例如,一些字母,如小写的“i”将由两个组件组成,您应该考虑您可能有ligatures(即两个相互连接的字母)。这就是为什么我喜欢M. Babcock评论:如果没有识别字符,很难有一个很好的解决方案。

对于您的问题,我相信您可以使用OCR library来解决您的问题。