#ImageRecognition
简单验证码程序使用Python语言编写,图形界面使用PyQt4开发。
初衷用于机器识别效果的验证,对于不是特别复杂的验证码图片,程序可以做到自动获取图片阈值。
预置验证码长度为4的粘连切割(虽然很废。。),如果自动获取的阈值失效,使用者也可以手动输入阈值范围再次分割。
这个程序是个人第一个PyQt程序,刚上手Python几个月,界面设计和代码都有很多不太合理的地方。
希望大家提出一些意见,如果能够看得下去代码的话 -_=:
Note:
- Python版本为2.7.x,使用时进入PYQT文件夹,在终端运行UITest.py文件即可
- 依赖库有: PIL, skimage(matplotlib), pyqt4, sklearn, numpy
- 图片文件存放在pictures文件夹中,为了测试方便,所有图片的后缀名都为png。
程序默从PYQT/picture_source/中认读取图片,支持自定义路径选取文件。
程序中处理过的文件存放在相应的xx_cache文件夹中
pyqt4与skimage中import的冲突
pyqt4与skimage:
- 由于需要使用skimage阈值计算公式,在UITest.py文件中无法引用imgRec1.py文件
- 需要解决无法引用skimage.io问题(from skimage import filter, data都不产生问题),即使用skimage中矩阵方式读取图片
- 已经尝试过将:from PyQt4.xxx import * 改为 from PyQt4 import xxx
- 实际上是matplotlib引用问题,修改了skimage代码,文件位置(以本机为例):
/usr/lib/python2.7/site-packages/matplotlib/backends/qt_compat.py
代码位置:
114:from PyQt5 import QtCore, QtGui, QtWidgets
->
114:from PyQt4 import QtCore, QtGui, QtWidgets
虽然不算是什么错误
调整了一次ui文件之后程序的icon就显示不出来啊,
博客园 IvanPc:
http://www.cnblogs.com/IvanPc/p/4835817.html
读像素点,分割逻辑和阈值部分进行了参考,但是读像素点的方法不够好,有空完善
在机器学习模块使用SVM支持向量机,学习样本和测试数据都要将图像文件转换成32x32的文本。
以某字符为例:
具体实现在PYQT/pic2text.py中,生成的文本存储在txt_cache文件夹中。
在很多情况下使用自动阈值函数不是那么靠谱,这时需要使用者根据灰度值直方图手动输入阈值。
以乌云验证码为例:
自动返回的阈值为191,此时干扰部分仍然被保留,手动输入阈值范围:0~150
确认后点击载入阈值再次分割验证码
即可得到理想的分割效果。但是由于机器学习样本中没有储存相应的文本,
对于前四个字符判断全部出错,而储存了'M'字符后,虽然周围有干扰,依旧可以识别。
SVM,即支持向量机(support vector machine),是机器学习中常用的分类器,或算法。
理论非常高深啊,核函数各种看不懂,简单来说是将低维度的复杂问题转为高维度的简单问题从而解决 or 寻找某个分割的超平面。。(应该是吧)
在学习机器学习过程中实现过SVM,在这个程序中使用了sklearn中的svm,具体代码在UITest.py文件的
p2tTest和loadData函数中,其中loadData为svm加载学习样本,样本储存路径见代码。
学习结果在样本足够充足的情况下是比较乐观的,基本可以排除大部分干扰线情况。
二值化实例图如下,这类是简单型验证码,直接使用函数返回灰度阈值即可
这类验证码识别、分割较难,或者根本无法进行分割操作
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。