了解OCR的Freeman链码

Syn*_*r0r 28 algorithm ocr

请注意,我真的在寻找我的问题的答案.我不是在寻找一些源代码或一些学术论文的链接:我已经使用了源代码,我已经阅读了论文,但仍然没有弄清楚这个问题的最后部分......

我正在研究一些快速屏幕字体OCRing,我正在取得很好的进展.

我已经找到了基线,将角色分开,将每个角色转换为黑白,然后对每个角色进行轮廓处理,以便将Freeman链码应用于它.

基本上它是一个8连接的链码,看起来像这样:

  3  2  1
   \ | /
  4-- --0
   / | \
  5  6  7
Run Code Online (Sandbox Code Playgroud)

所以,如果我有一个'a',经过我所有的转换(包括转换为黑白),我最终会得到这样的结果:

11110
00001
01111
10001
10001
01110
Run Code Online (Sandbox Code Playgroud)

然后它的外部计数可能看起来像这样(我可能在这里犯了一个错误,这是ASCII艺术轮廓,我的'算法'可能会使轮廓错误,但这不是我的问题点):

 XXXX
X1111X
 XXXX1X
X01111X
X10001X
X10001X
 X111X
  XXX
Run Code Online (Sandbox Code Playgroud)

在Xs之后,我得到了链码,它将是:

0011222334445656677

请注意,这是规范化的链代码,但您始终可以将链式代码规范化,如下所示:您只需保留最小的整数.

(顺便说一句,有一个超级高效的实现来找到链代码,你只需要取一个'X'的8个相邻像素,然后查看256查找表,如果你有0,1,2,3,4, 5,6或7)

不过,我现在的问题是:从那个0011222334445656677链码开始,我怎么发现我有'a'?

因为,例如,如果我的'a'看起来像这样:

11110
00001
01111
10001
10001
01111  <-- This pixel is now full
Run Code Online (Sandbox Code Playgroud)

然后我的链码现在是:0002222334445656677

然而,这也是一个'a'.

我知道这些链代码的重点是能够适应这些微小的变化,但我无法弄清楚我应该如何找到哪个字符对应于一个链代码.

我已经走得那么远了,现在我被卡住了......

(顺便说一下,我不需要100%的效率,将"0"与"O"或"o"区分开来的事情并不是真正的问题)

Chr*_*mer 18

您需要的是一种d测量链码之间距离的功能.之后找到给定链码的字母很简单:

输入:

  • S可能的字母集的标准化链码(通常是AZ,az,0-9,...的cain代码)
  • 链码x被检测,其需要一个字母,并且其可以轻微变形(链码将不匹配的集合中的任何链码S)

该算法将遍历可能的链码集并计算d(x,si)每个元素的距离.距离最小的字母将是算法的输出(标识的字母).

我建议遵循距离函数:对于两个链码,加上每个方向的长度差异:d(x,si) = |x0-si0| + |x1-si1| + .. + |x7-si7|.x0是链码中的0的数量x,si0是链码中的0的数量si等.

一个例子将更好地解释我在想什么.在下图中有字母8,B和D,第四个字母是稍微变形的8,需要识别.字母用Arial写入,字体大小为8.图像中的第二行放大10倍,以便更好地查看像素.

在此输入图像描述

我手动计算(希望是正确的)标准化链码,它们是:

8:  0011223123344556756677
B:  0000011222223344444666666666
D:  00001112223334444666666666
8': 000011222223344556756666 (deformed 8)
Run Code Online (Sandbox Code Playgroud)

长度差异(绝对值)是:


direction | length         | difference to 8'
          | 8 | B | D |  8'|   8 |  B |  D |
----------+---+---+---+----+-----+----+-----
        0 | 2 | 5 | 4 |  4 |   2 |  1 |  0 |
        1 | 3 | 2 | 3 |  2 |   1 |  0 |  1 |
        2 | 3 | 5 | 3 |  5 |   2 |  0 |  2 |
        3 | 3 | 2 | 3 |  2 |   1 |  0 |  1 |
        4 | 2 | 5 | 4 |  2 |   0 |  3 |  2 |
        5 | 3 | 0 | 0 |  3 |   0 |  3 |  3 |
        6 | 3 | 9 | 9 |  5 |   2 |  4 |  4 |
        7 | 3 | 0 | 0 |  1 |   2 |  1 |  1 |
----------+---+---+---+----+-----+----+-----
                        sum   10 | 12 | 14 |
Run Code Online (Sandbox Code Playgroud)

8'与链码的距离最小8,因此算法会识别字母8.到字母的距离B不是很大,但这是因为变形的8看起来几乎像B.

此方法不是缩放不变的.我认为有两种方法可以解决这个问题:

  • 对于不同的字体大小,具有不同的标准化链码集
  • 一组大尺寸(例如35x46像素)的标准化链码,并将输入字母(需要识别)缩放到这个更大的尺寸.

我不太确定距离函数对于所有字母数字字母的集合是否足够好,但我希望如此.为了最大限度地减少识别字母时的错误,您可以在分类步骤中包含其他功能(不仅仅是链代码).再次,你需要一个距离测量 - 这次是特征向量.

  • 我还做了远程功能的网络搜索.我没有找到这样的功能,而是发现了两篇有趣的论文:[弗里曼链代码的应用:马来西亚汽车板的替代识别技术](http://arxiv.org/pdf/1101.1602)和[完整的孟加拉OCR系统印刷的字符](http://www.uap-bd.edu/jcit_papers/vol-1_no-1/JCIT-100707.pdf). (2认同)