ImageProcess Archive

粘连字符分割算法的WPF界面

我在Github上共享过一份关于验证码的粘连字符分割的源代码,该代码是基于C#完成的,观察不同验证码图片的分割效果需要修正程序,十分不便。近期将这份源码做成了WPF可视化界面,以方便有兴趣的同学更直观的认识相关算法。

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

验证码粘连字符分割作为业余学习课题已经有一段时间了,分割对象是TAOBAO上白底蓝字的四字符粘连的验证码​。期间主要研究了两类分割算法。第一类是寻找细化字符的谷点,然后根据谷点对粘连字符进行分割;第二类是基于字符特征来对粘连字符进行分割,也就是本博客中连载的《粘连字符“花式分割”》。

粘粘字符“花式分割”___guideline principle

guideline principle依据字符与三格线的关系来进行分割。根据26个字母的大小写在四线三格中的分布状况来看,正常状况下,没有一个字符会同时占据三格,而所有数字应该均在baseline以上区域。 因此,粘连区域与guideline和baseline的左右侧交点只要不位于边界即可作为分割点。guideline principle根据粘连区域与四线三格的关系分为两大类:占据三格,占据baseline以上两格,占据meanline以下两格。

粘粘字符“花式分割”___loop and guideline

loop and guideline是本系列文章讨论的算法的两个核心,loop principle可以将包含自然loop的区块完全分割,可惜不是每张图片都包含自然loop。对于执行loop principle之后仍粘连的状况将完全交由guideline principle来处理。讲述这两者的合作方式便是本文的中心思想,仍然以TAOBAO四字符白底蓝字的验证码为研究对象。

粘粘字符“花式分割”___draw guide lines

draw guide lines是粘粘字符“花式分割”算法中的第二大法宝,在《粘粘字符”花式分割”___原理概述》有提到guide lines包含四种线条:ascender line, mean line, base line, descender line,在粘粘字符“花式分割”算法中通过绘制mean line 和 base line 来帮助我们分割字符,本文主要讨论mean line 和base line的绘制方法。

粘粘字符“花式分割”___loop principle

目前,我们已经知道当前验证码图片中是否包含loop,包含loop的验证码图片中的loop的坐标,验证码中字符笔画的宽度,验证码中有效字符的区域等关键因素,现在我们可以根据这些已知条件根据loop principle来初步定位分割点并进行初步的分割。

粘粘字符“花式分割”___Color Filling

Color Filling 的基本原理是以给定点为起点,将与该点连通的区域均变为指定的颜色。与“扫雷游戏”中翻开空白区域的原理一致,EMGU的cvFloodFill可以实现该功能,但因还不习惯使用cvInvoke函数,故用函数迭代来实现该功能。

粘粘字符“花式分割”___fix broken characters

在我们的研究对象中,有的字符在某些笔画上颜色相对较浅,这样导致二值化的图像会有缺口。这样的缺口最直接的影响就是让某些loop不完整,在后续的算法中不完整的loop会被涂为背景色,于是我们就会失去一个宝贵的loop分割依据,给整个分割大计造成重大损失。因此我们必须想办法将这些缺口修补起来,我将这项工作成为修补字符。

粘粘字符”花式分割”___原理概述

粘连字符分割仍然是本系列文章讨论的主题,而研究的对象仍然是不含干扰弧线的粘连字符组成的验证码,这些验证码由数字和大小写英文字母组成,不过这次的算法与上一系列文章有本质的差异。这一系列文章的分割算法原理基于字符特征,将特征明显的字符优先提取或分割出来,逐一攻破,直到验证码中的字符全部为单一字符。本文先概要介绍本次分割算法的主要原理和初步的效果图。​

用DrawLine与cvLine在位图中绘制直线

Graphics.DrawLine与CvInvoke.cvLine可以在位图中的指定位置绘制指定颜色的直线(C#) ,近期我刚学会使用,记录一下学习过程中遇到的“挫折”便于今后查阅。
Fork me on GitHub