分割粘粘字符的滴水算法的CSharp代码

      本文的代码仅实现了向下滴落的滴水算法本身,不含起始滴落点的计算,而实际上起始滴落点的确定才是分割粘粘字符的关键点。关于滴水算法滴落起始点的文献将在下一篇文章中与大家分享。

      滴水算法的原理概述

      初识滴水算法是在《基于滴水算法的验证码中粘连字符分割方法》(提取密码:8sg2)一文中,本文和C#实现图像竖直投影以及也是得到的该文献的启示后实现的。但这两篇都是东施效颦,并未实现该文献的精髓,有兴趣的同学可仔细阅读。Ok,我们先来了解滴水算法的原理。

      滴水算法根据水滴滴落的方向的不同可分为向上滴落和向下滴落。以向下滴落为例,该算法模拟水滴从高处向低处滴落的过程来对粘连字符进行切分。水滴从字符串顶部在重力的作用下,沿着字符轮廓向下滴落或水平滚动,当水滴陷在轮廓的凹处时,将渗漏到字符笔划中,经穿透笔划后继续滴落,最终水滴所经过的轨迹就构成了字符的分割路径。

      选择好水滴的起始滴落点后,水滴的后续路径由下图来决定,值得注意的是,当水滴落入字符轮廓的凹陷处时,情况 5 和情况 6 将会交替出现,即水滴将左右滚动。原文中描述的是”水滴在凹陷处右侧向下竖直渗漏“,但实验验证结果是”水滴在当前位置向下竖直渗漏“效果较好,当然这也许是我验证的不够多,大家对此点可谨慎参考。除了下图中描述的状况外,其他状况均在当前位置竖直滴落即可。

      滴水算法的CSharp实现代码

      代码中直接选取一个比较确定的起始滴落点来验证滴水算法。若起始滴落点选择得到,那么该代码理论上而言应该具有其通用性。本人是CSharp初学者且是业余自学,很多CSharp的特性不是非常熟悉,因此代码中可能有很多不足之处,还请多多包涵,若有高手愿意指点一二,那更是感激不尽。

发表回复

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

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

Fork me on GitHub