请注意,我确实在寻找问题的答案。我是not寻找一些源代码或一些学术论文的链接:我已经使用了源代码,并且我已经阅读了论文,但仍然没有弄清楚这个问题的最后部分......
我正在研究一些快速屏幕字体 OCRing,并且取得了很好的进展。
我已经找到基线,分离字符,将每个字符转换为黑白,然后绘制每个字符的轮廓,以便对其应用弗里曼链码。
基本上它是一个 8 连接的链码,如下所示:
3 2 1
\ | /
4-- --0
/ | \
5 6 7
因此,如果我有一个“a”,经过所有转换(包括转换为黑白),我最终会得到如下结果:
11110
00001
01111
10001
10001
01110
那么它的外部计数可能看起来像这样(我may在这里犯了一个错误,这是 ASCII 艺术轮廓,我的“算法”可能会得到错误的轮廓,但这不是我问题的重点):
XXXX
X1111X
XXXX1X
X01111X
X10001X
X10001X
X111X
XXX
在 X 后面,我得到链码,它是:
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
那么我的链码现在是:0002222334445656677
但这也是一个“a”。
我知道这些链码的全部意义在于能够适应如此微小的变化,但我无法弄清楚我应该如何找到哪个字符对应于一个链码。
我已经走了那么远,现在我被困住了......
(顺便说一句,我不需要 100% 的效率,区分“0”与“O”或“o”之类的事情并不是真正的问题)