这是验证码识别的第二篇,先看一下样图吧,就是下面那张。
看到这张图片,直观上就知道比第一篇中的要简单,这个“简单”用语言来描述,可以得到下面的几条结论:
1. 图片中的字符边界比较清晰,并且单个字符的内容比较单纯;
2. 虽然字符间有粘连,但是绿色边界围住的白色区域没有粘连,并且颜色一致,可以通过找连通分量的办法把字符分离出来。
通过上面的分析,接下来的事就很简单了。我觉得编码很简单,只看编码不可能写出好东西来,只有领会思路,理解方法才能触类旁通。
好了,下面就是接下来的步骤:
1. 使用合适的阈值,对图片进行二值化处理;
2. 使用BFS找出所有颜色为白色的连通分量;
3. 因为图片在二值化之后,底色为白色,所以上图会找出5个连通分量,四个字符和一个整幅图片去掉字符的分量;
下面四个就是从样图中找到的连通分量:
4. 去掉过大的那个连通分量,如果留下的连通分量如果不等于四个,则直接退出,如果等于四个,继续进行算法;
注:这种情况是存在的,如果字符之间粘连区域过大,或者字符过小,一个字符被分割成两个分量,但是因为验证码识别的特殊性,所以容许有一定的错误率存在,只要有成功的次数多余失败次数,这样的算法就是可行的。
5. 将找到的连通分量和模板进行匹配,找到匹配度最大的模板,返回对应的字符。
模板的做法:
因为该网站的验证码字体比较单一,所以下载一定数量的验证码图片,覆盖所有可能的字符种类,通过上面的方法,二值化之后找到所有的连通分量,将这些找到的连通分量进行人工分类标号,最后得到可以用的模板。
找连通分量的代码可以参考:GitHub