我部分实现了笔画宽度变换算法。我的实现虽然不够优雅,但确实有效
我的实现生成了许多候选(我使用了一些规则来过滤它们)。但我仍然有很多非字符候选。我想使用神经网络(或其他机器学习算法)来过滤它们。
我应该为我的分类器使用哪些特征?
我可以提取均值/标准差(组件的SW值)和宽度/高度。
示例:
红色矩形是字符候选(实现未检测到亮色背景上的暗色字符,“Land Rover”的检测不佳是正常的)组件过滤后的SWT图像
回答:
神经网络和其他技术如SVM不是用来过滤输入的,而是用来对输入进行分类。区别在于,过滤会根据输入是否符合设定的规则来丢弃输入,因此不需要任何训练(更可能是设置一些好的阈值)。而训练过的分类器则会为给定的输入分配一个类别,这意味着你需要用预期的类别以及负样本来充分训练分类器。因此,如果你想做前者或后者,方法会有所不同,但你在前者中使用的特征可能对后者也有用。
无论你选择哪条路径,首先需要进行一些基本的预处理,这意味着要清除示例中组件内部的多余白点。之后,有很多选项可用。基本的宽度和高度测量可以用来过滤那些你确定不符合预期的组件,因此也无需对其进行分类。通过考虑连接组件的骨架,你可以得到端点和分支点,这形成了两个特征。欧拉数是另一个特征,实际上,有太多可能的特征可以提取,这里无法一一列出。这些提到的特征的特点是它们都是尺度、旋转和平移不变的。这也意味着你需要其他特征来区分,例如区分9
和6
,骨架中孔的质心就是这样一个例子(但要注意,因为直接提取这个特征对任何变换都不具有不变性)。
请注意,即使是简单的特征也可以帮助区分整个字符集。例如,对于欧拉数=0,你将只得到’A’、’D’、’O’、’P’、’Q’、’R’、’0’、’4’、’6’或’9’,假设是ascii字母数字,字体表现良好,并且输入经过良好的预处理。
最后,有相当数量的论文可以查找更多信息和超越SWT的不同方法。例如,T-HOG是其中一个较新的方法,根据发表的结果,它比SWT略胜一筹。
编辑:总结并扩展:
如果你想使用机器学习,你将需要大量标记好的数据,以便从中分离出用于训练和测试的数据。如果你的目标只是区分“这是字符”和“這不是字符”,并且后一类别没有得到充分描述(即,你只有很少的非字符示例,或者你无法为可能接收到的任何类型的输入对其进行描述),单类SVM是一个选项。
对于从单个字符中提取的特征,如前所述,有太多特征和许多方法。论文“特征提取方法用于字符识别——一项调查”(1995年,相当古老)讨论了一些方法(它还提到了预期的最小训练数据量,请务必阅读),所以我在这里包含了其部分内容。
可能从字符中提取的良好特征(适用于灰度和二值图像):
- Hu、Reiss、Flusser、Suk、Bamieh、de Figueiredo矩(所有基于Hu在“通过矩不变量进行视觉模式识别”中的初始工作改进的几何矩不变量);
- 泽尼克矩
从骨架化字符中提取的良好特征:
- T形接点的数量;
- X形接点的数量;
- 弯曲点的数量;
- 端点的数量;
- 通过将原点放置在形状的质心处,与轴的交叉次数;
- 半圆的数量
傅里叶描述符也可以应用于骨架、二值表示或如所述论文中讨论的字符的图形表示。