C#实现验证码中粘连字符分割(二)

C#实现验证码中粘连字符分割(一)中,我分享了粘连字符分割算法的框架与完整的代码。其中滴水算法是整个分割算法的核心,而寻找正确的滴落起始点则是重中之重。本文和大家分享我曾经尝试过的寻找滴落起始点的方法与相关文献。

1. 《基于滴水算法的验证码中粘连字符分割方法》  (密码:891e)

首先该文献根据验证码字符的宽度统计值,以及竖直投影直方图的局部极小值点相结合的方式来为滴水算法找到滴落的起始点。而统计验证码字符的宽度则需要大量的样本,而且若更换另一类型的验证码,该宽度值将不再适用。我对算法有兴趣,希望能发现一种通用的分割算法,因此我不会去取大量某一类图像样本来人工分割然后再统计字符宽度。在初次看到这篇文献时,我想仅仅通过竖直投影直方来找到滴水算法的起始滴落点。在竖直投影直方图完成后,我发现仅仅通过竖直投影直方图不具有通用性,故放弃了该文献提及的方法。

2.OpenCV各种角点

在探寻找滴落起始点的过程中,我也曾经尝试过OpenCV的角点检测,在C#中对应到Emgu CV角点检测。我仔细研究了我搜集的样本中的Shi-Tomasi角点与Harris角点,发现角点与滴落起始点差距较大,即便我通过调整cvGoodFeaturesToTrack与cvCornerHarris相关参数得到某一张验证码中的较合适的角点,换另外一张验证码后得到角点又会过多或者过少,或者根本不适合作为滴落起始点。故最终放弃该方案。

3.中英混排文档图像粘连字符分割方法的研究  (密码: gn6c)

这篇文献寻找粘连分割点的主旨是先获取粘连字符的上下轮廓,然后进一步求取上,下轮廓的局部最大值点和最小值点,由于粘连字符总在上下轮廓距离最短处发生粘连,所以求出的极大,极小值可以看作字符粘连的位置。

该算法对英文数字粘连字符的分割正确率略低,因其使用的上下轮廓发受字符自身形状的影响,例如字母W,V,M,N等本身含有凹凸结构,造成伪凹凸,影响极值点的判断。

故最终分割算法中未采用该方案,但该文中提出的方案或者可以有助于后续分割算法的改进。

4.effective segmentation of merged characters  (密码: 3jkk)

这篇文献的字符分割策略中并不包含滴水算法。该文献的主要观点是:粘连字符的连接点的上下一定存在一个凹面,上凹面可以通过追踪图像的上轮廓中的谷点来标注出来;将图像上下翻转后用同样的方法找出图像的下凹面,在竖直面上最接近的上下谷点的连接线可以作为粘连字符的分割路径。如下图所示:

 将我收集的10个样本来套用该文献中的谷点作为滴落起始点,理论上而言应该可以实现较好的分割,因此我的分割方案中最终采用了找谷点作为滴落起始点的方法。目前虽然分割正确率不高,但经过改进应该可以在一定程度上提高其正确率。

C#实现验证码中粘连字符分割(一)

C#实现验证码中粘连字符分割(二)

C#实现验证码中粘连字符分割(三)

C#实现验证码中粘连字符分割(四)

C#实现验证码中粘连字符分割(五)

C#实现验证码中粘连字符分割(六)

C#实现验证码中粘连字符分割(七)

C#实现验证码中粘连字符分割(八)

验证码粘连字符分割经验谈

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Fork me on GitHub