2

我有一个包含数字的图像。

原始图像

有:1、153、25、50、23、40

对于每一个数字,我对数字识别都没有问题。我能认出有 1, 1, 5, 3, 5, 0, 2, 5, 2, 3, 4, 0。

现在,我想让它们变成 1、153、25、50、23 和 40。

我的方法是,使图像变得高度模糊,因此数字的边界框与另一个数字的边界框相遇。然后提取多个边界框的巨大边界框内的数字。

我的期望是这样的

期待

但是,现实是这样的

现实

1、153、25、5、0 和 2340

因为,

  • 5和0的距离太远了

  • 距离 23 和 40 太近了

我的问题是,是否有另一种方法可以对单个数字或多个数字进行分类?如果是,如何?:) 非常感谢 :)

*对不起,我的英语不好

**我使用opencv c++

4

2 回答 2

2

与此相比,模糊然后找到边界框的计算时间很大:

如果您可以挑选出这些数字中的每一个,那么您必须至少为每个数字有一个中心点。我将通过查找每个数字的宽度和高度以及旋转来进一步实现这一点。有了这些信息,我将应用一组规则,这些规则与人们阅读数字的方式相对应。

这些规则可能有效:

  1. 从一个节点号等于位数的空图开始
  2. 被测数字是否有任何其他数字小于一个宽度(或距离彼此中心点两个宽度)?
  3. 如果是这样,那么两个数字是否具有相同的旋转(+/- 公差)
  4. 如果是这样,那么旋转 90 (+/- tol) 度到两位数的中心点之间的线吗?
  5. 使用两点的向量差确定顺序
  6. 在两个数字之间创建一个方向边
  7. 检查另一侧的另一个数字(快捷方式)
  8. 重复下一个数字
  9. 沿着图表走,找到你的一组数字

考虑到这样的问题,我更喜欢使用概率来订购一组可能的解决方案,这样你的程序就可以询问操作员,或者如果假设一件事它会卡住,它可以返回并选择下一个“最佳”解决方案。

希望这会有所帮助,我羡慕你的数字识别能力:)

于 2013-09-13T01:11:08.387 回答
0

我建议你不要模糊图像。只需提取单个字符及其边界框。然后,您可以迭代地为其质心应用欧几里德距离阈值,以一次一个地将边界框合并在一起。然后,您可以将每个数字建模为一个链表,并通过简单的方向启发法继续添加到元素两侧的列表中。

于 2013-09-13T01:24:37.987 回答