验证码图像的字符分割

4

我正在尝试破解一个验证码图像,但我找不到一种分割字符的方法。

我有这个图像: enter image description here

我应用了一些过滤器和二值化处理,结果得到了这张图片:enter image description here

现在我需要将图像分割以便用于分类器,例如SVM或ANN。

问题是有些字符是连接在一起的,我找不到分离它们的方法。

更多图像示例:

enter image description here

enter image description here

enter image description here

有人有分割图像并获取字符的方法吗?


4
验证码是有意设计成让你的尝试变得困难的。 - ziggystar
我对您如何在示例中去除曲线非常感兴趣。您是否使用了类似于腐蚀的方法? - Kent
@Kent 是的,我使用了腐蚀和膨胀的组合来实现这个目标。 - jonhkr
3个回答

5
我觉得您的字符具有最大笔画宽度。每当您发现一行黑色像素比这个宽度更宽时,就表示两个字符在此连接。
因此,
  • 对于每个大于单个字符的连接块
    • 对于该块的每一行
      • 查找此行中所有不间断的黑色像素水平线,其长度大于MAX_STROKE_WIDTH
      • 记录这些线的中心的X坐标
    • 聚类找到的X坐标
    • 使用具有超过N个坐标的每个聚类的中心拆分块。
    • (您可以简单地垂直拆分,或者尝试通过聚类中的点拟合一条线)

非常好的想法,我会测试一下并让你知道它的表现如何。谢谢。 - jonhkr
1
虽然这会破坏像上面有长水平部分的'L'这样的字符。 - user1561108

1
你的方法对我来说似乎太自下而上了。
字符数量是恒定的,它们似乎是等宽的。
所以只需按宽度拆分图像,并确保检索到的特征具有旋转/缩放不变性。
然后可以将其馈送到人工神经网络中。我不明白为什么你要对字符进行分割。

1

这是一个最小化问题。关键在于选择合适的度量标准,并使其快速。

  1. 手动收集每个字符(字母或数字)的示例:至少每个字符收集几个示例,并进行手动清理。

  2. 手动解决足够数量的示例(几百个)的验证码。这将为您提供测试数据集。

  3. 给定一张图片,尝试将其与略微扭曲的示例字符匹配。最佳匹配可以视为具有以下度量中黑色匹配中K1 *图像中白色区域的总和最小的那个:在匹配中是黑色的图像中的白色区域+ K2 *图像中的白色区域,在匹配中是黑色的区域+ K3 *字符的期望平均位置和方向与匹配中的位置和方向之间的距离+ K4 *字符的几何失真。 K1..K4的值是适当的权重,您可以通过优化测试数据集上的准确性来找到它们。

  4. 这是一个相当大的搜索空间:但由于字符的间距相对规则,因此您可以逐个字符拟合,因此从预期的平均位置开始,对每个可能的字符的位置/扭曲进行简单的梯度下降,以找到良好的匹配,然后您可以选择最佳匹配作为您认为存在的字符,然后继续下一个。总共:6×(26个字母+ 10个数字)梯度下降在(大约)2个位置+ 1个倾斜+ 1个比例+ 1个拉伸维度上进行。本质上,这将把上述最小化问题分解为逐个但顺序地匹配一个字符的问题。然后遮盖找到的匹配并重复下一个(相邻的)预期位置,直到您对所有6个都有匹配项。根据您提供的示例,这将具有非常高的置信度,即每个字符的正确答案的得分都比任何其他答案都要好。

附注:这可能很有趣:https://code.google.com/p/captchacker/


我没有很好地理解你的方法,在第三项中,您描述了一种匹配给定图像的测试字符的方法。在该算法中,我需要将每个测试字符水平滑动到图像中以找到最佳匹配吗? - jonhkr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接