【发布时间】:2011-10-06 19:21:25
【问题描述】:
请注意,我真的在寻找我的问题的答案。我不是在寻找一些源代码或一些学术论文的链接:我已经使用了源代码并且我已经阅读了论文,但仍然没有弄清楚这部分的最后一部分问题...
我正在开发一些快速屏幕字体 OCRing,并且我取得了很好的进展。
我已经找到基线,分离字符,将每个字符转换为黑白,然后对每个字符进行轮廓化,以便对其应用弗里曼链码。
基本上它是一个 8 连接的链码,如下所示:
3 2 1
\ | /
4-- --0
/ | \
5 6 7
所以,如果我有一个“a”,经过所有的转换(包括转换为黑白),我最终会得到这样的结果:
11110
00001
01111
10001
10001
01110
然后它的外部计数可能看起来像这样(我可能在这里犯了一个错误,那是 ASCII 艺术轮廓,我的“算法”可能会弄错轮廓,但这不是我问题的重点):
XXXX
X1111X
XXXX1X
X01111X
X10001X
X10001X
X111X
XXX
在 X 之后,我得到了链码,即:
0011222334445656677
请注意,这是规范化的链码,但您始终可以像这样规范化链码:您只需保留最小的整数。
(顺便说一句,有一个超级高效的实现可以找到链码,您只需在其中获取“X”的 8 个相邻像素,然后如果您有 0,1,则在 256 查找表中查找, 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' 并不是真正的问题)
【问题讨论】:
-
您可能已经阅读过它,但这里的描述:codeproject.com/KB/recipes/OCR-Chain-Code.aspx 似乎提供了一个很好的起点。我的看法是,您需要通过输入识别的样本来“训练”您的软件,然后在输入真实数据时,让它识别“最接近”的匹配。您不必能够说明输入绝对是“a”,您只需能够说它比您感兴趣的任何其他符号更接近“a”并且足够接近变成你愿意接受的“a”。
-
@forsvarir:感谢您提供的链接,我已经阅读了几本,但我还没有阅读。这就是说我同意你的观点,但实际上是选择“最接近的”给我带来了问题。你知道我应该运行类似 "Levenhstein Edit Distance" 来找到最近的吗?这基本上是我的问题:我不知道如何选择最接近的输入,也不知道需要输入多少输入。
-
我认为 Levenhstein 编辑距离可能行不通:它不适用于不同尺寸的 a。
-
一个人工神经网络可以提供很好的结果。 AFN 非常适用于输入端的微小变化不会改变输出的应用。但正如我在(已经提到的)代码项目网站A C# Project in Optical Character Recognition (OCR) Using Chain Code 上读到的,支持向量机、K 最近邻 和欧几里得距离 也是可能的分类阶段的方法。
-
你说的是“a的大小不同”的问题:为什么不把输入的字符在分类前缩放到统一的大小——也许是把链码压缩成固定的长度?