补全计划

訏谟定命,远猷辰告

Scriptboy: 12306 登录验证码识别

现代浏览器强大的 javascript 引擎加上 HTML5 的 canvas API 为我们打开了另外一扇门.

去年春节的时候, 我对验证码的识别产生了兴趣. 于是对铁路客户服务中心(12306)的登录验证码 12306验证码 的识别进行了尝试. 这个用户脚本实时演示了识别结果.

12306验证码识别

该 javascript 版本基本是从现有的 python 版本 翻译过来的. 采用的是矢量空间搜索算法.

识别过程大概需要以下几步:

  1. 通过cavas的 drawImage API将验证码图片拷贝至 canvas 中.
  2. 将文字从背景中分离出来. 常见的可行办法是将设定一个颜色阈值, 将验证码及其背景分成黑白两色.
  3. 降噪, 去除干扰. 将孤立的色点去除.
  4. 修正文字变形.
  5. 字符切分, 将识别验证码的问题细分成识别单个字符的问题.
  6. 将字符于与收集的已知字符做矢量空间对比.

目前总体的识别成功率并不太高, 原因是字符切分正确率太低, 碰到字母连在一起的就不能将其分开了. 不过好在 12306 网站的登录验证码还是有不少字母分的比较清晰的, 对于那些切分正确的验证码成功率目测可以达到 99% 以上.