请注意,我真的在寻找我的问题的答案.我不是在寻找一些源代码或一些学术论文的链接:我已经使用了源代码,我已经阅读了论文,但仍然没有弄清楚这个问题的最后部分......
我正在研究一些快速屏幕字体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
.
此方法不是缩放不变的.我认为有两种方法可以解决这个问题:
我不太确定距离函数对于所有字母数字字母的集合是否足够好,但我希望如此.为了最大限度地减少识别字母时的错误,您可以在分类步骤中包含其他功能(不仅仅是链代码).再次,你需要一个距离测量 - 这次是特征向量.
归档时间: |
|
查看次数: |
14131 次 |
最近记录: |