我已经构建了一个系统,用于分割包含手写符号的二进制图像并对其进行分类(特别是用于音乐)。我知道有商业应用可以做到这一点,但这是我从头开始作为一个项目尝试的。
为了简化起见,我们假设我的整个图像中将有两个元素:
和
我已经构建了一些东西,可以将图像分割成区域并对其进行分类。大多数时候这都运作良好。
然而,有时元素会接触到,这时我的分类器就会失效。例如:
或
将这两个元素分开的最佳方法是什么?我已经做了很多研究,但我觉得我缺乏领域知识可能是这里的障碍!
我发现的几点:
- 模板匹配对这些手写符号效果不好
- 细化/侵蚀方法也不太有效,特别是当两个升号(右上方)重叠时,它们会退化得太多
- 分水岭填充对两个复杂形状不太有效
可能有效的方法,我希望在深入研究之前能得到一个“去试试”或“避免”的投票。
- 从左到右滑动不同大小的窗口,并尝试对其进行分类。选择具有最高正分类置信度的窗口和位置
- 进行水平和垂直投影,并在最小值处“切割”图像(这将是相应轴上最薄的地方)
回答:
这对我来说似乎是一个非常困难的问题,我没有一个好的通用解决方案。特别是多个连接的#
的情况将很难解决。
在你的特定情况下,我会尝试以下方法,假设通常不会有超过两个或三个符号聚集在一起:
- 当一个blob对于单个符号来说太大时
- 对于每个可能的符号
- 在左上、右上、左下、右下角取一个适合该符号大小的区域
- 对该区域运行你的识别
- 如果成功,移除识别的符号,对剩余部分重复此操作
- 对于每个可能的符号
这不是一个非常复杂的解决方案,它的效果在很大程度上取决于你的特定字符识别
另一个想法:
如果你的大多数形状倾向于具有细长的垂直段,你可以通过概率霍夫变换来识别这些段,并在blob包含多个符号时,使用找到的垂直线段作为识别的起点。
另一个分离形状的想法:
在blob的最大凸性缺陷处分割blob,该缺陷与blob边界有一定的最小距离。注意:这对凸形状效果最好,可能对你的#
符号完全无效
替代方案4:
在乐谱中,相同类型的符号往往会一起出现,比如#后面是同一行的音符,或者在行首以某种模式出现多个#。为这些倾向于聚集在一起的符号建立一个特殊的组合识别器可能是有价值的。
(顺便问一下,你目前是如何将符号与五线谱线分开的?)