
Scriptboy: 12306 登录验证码识别
现代浏览器强大的 javascript 引擎加上 HTML5 的 canvas API 为我们打开了另外一扇门.
去年春节的时候, 我对验证码的识别产生了兴趣. 于是对铁路客户服务中心(12306)的登录验证码
的识别进行了尝试. 这个用户脚本实时演示了识别结果.

该 javascript 版本基本是从现有的 python 版本 翻译过来的. 采用的是矢量空间搜索算法.
识别过程大概需要以下几步:
- 通过cavas的
drawImageAPI将验证码图片拷贝至 canvas 中. - 将文字从背景中分离出来. 常见的可行办法是将设定一个颜色阈值, 将验证码及其背景分成黑白两色.
- 降噪, 去除干扰. 将孤立的色点去除.
- 修正文字变形.
- 字符切分, 将识别验证码的问题细分成识别单个字符的问题.
- 将字符于与收集的已知字符做矢量空间对比.
目前总体的识别成功率并不太高, 原因是字符切分正确率太低, 碰到字母连在一起的就不能将其分开了. 不过好在 12306 网站的登录验证码还是有不少字母分的比较清晰的, 对于那些切分正确的验证码成功率目测可以达到 99% 以上.