65.9K
CodeProject 正在变化。 阅读更多。
Home

光学字符识别

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.85/5 (20投票s)

2012年10月14日

CPOL

7分钟阅读

viewsIcon

143313

downloadIcon

8585

下载演示项目 - 37.5 KB 

引言   

OCR(光学字符识别)算法依赖于一组学习到的字符。它将扫描图像文件中的字符与这个学习集中的字符进行比较。生成学习集很简单。学习集需要一个包含所需字体、所需字符的图像文件,以及一个代表此图像文件中字符的文本文件。

在下面的讨论中,学习集是 XML 格式的。这个学习集基本上是坐标相关的信息,将在下面的文章中进行解释。

下面的文章描述了 OCR 识别字符的示例。生成不同字体样式和大小的学习集将在我的下一篇文章中介绍。在本文中,我们已经为字体样式 verdana和字体大小 8px 生成了学习字符集。      

背景

四种基本算法
• 图像标记。
• 查找边界并生成 X, Y 坐标像素数组。
• 将连接的像素与学习集(.xml)进行匹配。
• 形成单词。

图像标记算法
它使用双重传递算法,该算法相对简单易于实现和理解。双重传递算法遍历二维二进制数据。该算法对图像进行两次传递:一次传递用于记录等效项和分配临时标签,第二次传递用于将每个临时标签替换为其等效类的标签。 

连接性检查通过检查当前像素的东北、北、西北和西部的像素标签(假设为 8 连接性)来进行。4 连接性仅使用当前像素的北和西邻居。检查以下条件以确定要分配给当前像素的标签值。  

上面放大的图像是用于我们讨论的像素表示。位图图像中的每个像素都由其 X 和 Y 坐标表示。上面的例子中的字母“B”显示了所有像素是如何连接的。图像标记算法将整个连接的像素标记为相同的标签。下面的 UML 图说明了算法的流程。

第一次传递

 

下面的例子说明了图像标记算法如何按照上面的流程图执行。

  • 需要提取连接区域的数组如下(基于 8 连接性)
  • 第一次传递后,生成了以下标签。总共生成了 9 个标签,符合上述条件。我下面显示了 8 个标签。“Basic”图像的背景是一个标签。但我没有在下面的图像中显示它,因为它被丢弃了,因为我们只匹配最大尺寸为 10 x 10 的连接分量。

 

生成的标签等效关系是

集合 ID 等效标签
1 1
2
3 3,7
4 4,8
5 5
6 6
7 3,7
8 4,8

第二次传递
下面的 UML 图显示了标签不相同的连接像素如何被分配等效记录中的最低标签值。最终所有连接分量都将具有相同的标签。字符“B”将有一个标签,即 2,字符“a”将有标签 3。一旦我们使用等效记录中可用的最低标签值重新标记不同的标签,我们将得到一个完整的连接分量。每个字符“B”、“a”等将具有不同的连接分量。字符“i”上面有一个额外的点,因此第二次传递算法还会查找连接分量上方和下方的额外点。因此,“i”的额外点也将与标签 5 连接。

 

查找边界并生成 X, Y 坐标像素数组

 

根据上述算法生成的标签,然后只需要将连接分量列表中的所有连接的 X, Y 坐标相加。上图显示了所有用黄色标记的连接分量边界。我已突出显示了连接分量“a”的边界(X, Y)坐标。

  • LeftXCor: - 连接分量的起始左 X 坐标。对于连接分量“a”,它是 9。
  • RightXCor: - 连接分量的结束左 X 坐标。对于连接分量“a”,它是 13。
  • TopYIndex: - 连接分量的起始或最低 Y 坐标。对于连接分量“a”,它是 4。
  • BottomYIndex: - 连接分量的结束或最高 Y 坐标。对于连接分量“a”,它是 9。
  • Width: - 连接分量的宽度为 RightXCor – LeftXCor。对于“a”,它是 13 - 9 = 4。但因为从零开始,所以宽度是 5。Height:- 类似地,连接分量的高度为 BottonYCor – TopYCor。在这种情况下,对于“a”,高度为
  • 6. PixelCoordinate [,]:- 根据连接分量的高度和宽度,初始化二维数组。对于“a”,它将是 [5, 6]。对于适当的连接像素坐标,将该位设置为高。例如,对于连接分量“a”的 (9, 4) 坐标,没有连接的像素,因此将 [0,0] 设置为 false。因为 (9, 4) 是起始 X, Y 坐标,所以它是 (0, 0)。类似地,对于 (13, 9),有一个连接的坐标,因此将 [4, 5] 设置为 true。同样,对于整个连接分量的 X 和 Y 坐标。

XML 中的数据说明。

 

    <characterinfo>
     <ParamValue>a>⁄ParamValue>
     <PixelInfo>
      (0,3)(0,4)(1,0)(1,2)(1,5)(2,0)(2,2)(2,5)(3,0)(3,2)(3,5)(4,1)(4,2)(4,3)(4,4)(4,5)
     <⁄PixelInfo>
    <⁄characterinfo>
    

以字符“a”的上述位图图像和 XML 中的像素信息为例。正如我们看到用黄色线框出的边界。在上图的第一个像素坐标 (0,0) 中,X 和 Y 坐标为零。如前所述,边界条件。属性及其值如下。

  • LeftXCor: - 连接分量的起始左 X 坐标。对于连接分量“a”,它是 0。
  • RightXCor: - 连接分量的结束左 X 坐标。对于连接分量“a”,它是 4。
  • TopYIndex: - 连接分量的起始或最低 Y 坐标。对于连接分量“a”,它是 0。
  • BottomYIndex: - 连接分量的结束或最高 Y 坐标。对于连接分量“a”,它是 5。
  • Width: - 连接分量的宽度为 RightXCor – LeftXCor。对于“a”,它是 4 - 0 = 4。但因为从零开始,所以宽度是 5。
  • Height:- 类似地,连接分量的高度为 BottonYCor – TopYCor。在这种情况下,对于“a”,高度为 6。

注意 XML 中的连接 X, Y 坐标。对于“a”,(0,3)(0,4) 等像素是高的,所以它们被记录下来。像素不高的 X,Y 坐标未被记录。<pixelinfo> 标签表示像素高的像素坐标。<ParamValue> 标签包含字符值“a”。

匹配字符
最后,这是最简单的任务。我们将连接分量位数组与 XML 数据进行匹配。每个像素根据 X, Y 坐标进行匹配。完全匹配的像素坐标就是 XML 中的匹配字符。

形成单词。
根据上面的例子“Basic”。我们为每个字符维护 LeftXindex 和 RightXindex。LeftXindex 表示字符在博客最初指定的位图中最左边的索引。RightXindex 表示字符最右边的 X 坐标。当前字符和前一个字符的坐标差小于 3 像素时,它们就会连接起来。这个算法很简单。但你可以扩展它,根据字典中的语法来连接单词。

我附上了带样本图像的演示 exe。在演示应用程序中,只需浏览图像并单击提交。网格显示所有字符及其坐标。

参考
1. 人工智能与认知科学 © 2006, Nils J. Nilsson Stanford AI Lab http://ai.stanford.edu/~nilsson
2. 神经网络与模糊逻辑。
3. http://www.cs.berkeley.edu/~fateman/kathey/char_recognition.html
4. http://en.wikipedia.org/wiki/Optical_character_recognition

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

© . All rights reserved.