请注意,我真的在寻找我的问题的答案.我不是在寻找一些源代码或一些学术论文的链接:我已经使用了源代码,我已经阅读了论文,但仍然没有弄清楚这个问题的最后部分......
我正在研究一些快速屏幕字体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"区分开来的事情并不是真正的问题)