一个基于SVM的验证码破解程序
##起因 弄这个项目的原因,是目前还没有发现一个比较好用的验证码识别模块,目前的验证码识别主要是基于google的光学字符识别Tesseract-OCR如PyOCR,识别精度有限,对于一些复杂的验证码无法识别
##目前主要工作 这个项目改造自https://code.google.com/p/captchacker/,原项目已停止更新
##接下来的工作
- 整理代码,使能够模块化,提供一个通用接口
- 使用Python替换的原来C++,重写验证码分割及字符居中模块,做跨平台处理
- 增加利用anti-captcha的人眼识别功能来提供训练数据
如果有其他疑问,请与我联系 tangxuguo#gmail.com,欢迎提交代码
##环境搭建 运行环境(以下在ubuntu12.04 64位机器下测试)
安装libsvm
sudo apt-get install python-libsvm
安装opencv
sudo apt-get install libopencv-dev python-opencv
生成验证码pycaptcha
仿真这块用到了pycaptcha,这个是用来生成验证码的,这个模块已经停止更新,我下了一个版本,在python2.7上目前可用,请自行安装
svn co http://svn.navi.cx/misc/trunk/pycaptcha/
cd pycaptcha
python setup.py install
然后把captchacker目录下的Fonts里的字体,拷到如下路径里面,否则pycaptcha无法识别,这个包需要依赖PIL
sudo cp -r Fonts /usr/local/lib/python2.7/dist-packages/Captcha/data/fonts/
##程序说明:
###使用方式
##将用到的算法
- de_noise去噪
- color_filter颜色过滤
- edge_detection边缘检测
- floodfill油漆桶
- dynamic_programing动态规划
- Erosion腐蚀
- Dilation膨胀
- Pixels_projection像素投影(垂直和斜切)
- svm支持向量机
- 干扰线检测(深度优先搜索和最短路径算法)
对于一些和文字颜色相同但是较为分散和单一的干扰像素点,我们可以用判断相邻像素的方法,对于每个点判断该点和相邻8个点的色差,若色差大于某个值,则+1,如果周围有超过6个点的色差都比较大,说明这个点是噪点。对于图像边界的一圈像素,周围没有8个像素,则统统清除,反正文字都在图片的中间位置。
对于1个像素粗细的干扰线,在字符为2个像素以上的时候,可以用去噪点算法作为滤镜,多执行几次,就可以完美的把细干扰线去掉。
种子填充算法可以方便的计算出任意色块的面积,对于没有粘连字符或者粘连但是字符每个颜色不一样的验证码来说,去除干扰色块的效果很好,你只需要大概计算一下最小的和最大的字符平均占多少像素,然后把这段区间之外像素数的色块排除掉即可。
###模型训练流程
两种方式,采用自己的fonts训练,或者是采用原始网站验证码训练
###算法识别流程
原始图片-》 彩色去噪(颜色过滤,去除背景)-》干扰线检测-》二值转换-》黑白去噪(统计邻域像素,统计轮廓像素)-》切割(种子填充,像素投影,动态规划,固定宽度扫描)-》标准化字符矫正-》SVM
##部分案例
###暂未识别,需要训练,在研究
欢迎提交新的验证码类型
本项目仅供学术研究,请勿用于其他用途,使用本程序造成的后果请自负