# ImageRecognition **Repository Path**: rx_z/ImageRecognition ## Basic Information - **Project Name**: ImageRecognition - **Description**: 基于机器学习的验证码识别,使用支持向量机(SVM),添加学习样本后识别能力不错 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 40 - **Forks**: 7 - **Created**: 2016-06-04 - **Last Updated**: 2023-01-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #ImageRecognition 简单验证码识别 ------------- 简单验证码程序使用Python语言编写,图形界面使用PyQt4开发。 初衷用于机器识别效果的验证,对于不是特别复杂的验证码图片,程序可以做到自动获取图片阈值。 预置验证码长度为4的粘连切割(虽然很废。。),如果自动获取的阈值失效,使用者也可以手动输入阈值范围再次分割。 这个程序是个人第一个PyQt程序,刚上手Python几个月,界面设计和代码都有很多不太合理的地方。 希望大家提出一些意见,如果能够看得下去代码的话 -_=: ![image](http://git.oschina.net/rx_z/ImageRecognition/raw/master/docfile/screenshots/imgrec.png) > **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的文本。 以某字符为例: ![image](http://git.oschina.net/rx_z/ImageRecognition/raw/master/docfile/screenshots/pic2txt.png) 具体实现在PYQT/pic2text.py中,生成的文本存储在txt_cache文件夹中。 #### 手动输入阈值 在很多情况下使用自动阈值函数不是那么靠谱,这时需要使用者根据灰度值直方图手动输入阈值。 以乌云验证码为例: ![image](http://git.oschina.net/rx_z/ImageRecognition/raw/master/docfile/screenshots/wuyun1.png) 自动返回的阈值为191,此时干扰部分仍然被保留,手动输入阈值范围:0~150 确认后点击载入阈值再次分割验证码 ![image](http://git.oschina.net/rx_z/ImageRecognition/raw/master/docfile/screenshots/wuyun2.png) 即可得到理想的分割效果。但是由于机器学习样本中没有储存相应的文本, 对于前四个字符判断全部出错,而储存了'M'字符后,虽然周围有干扰,依旧可以识别。 #### 支持向量机 SVM,即支持向量机(support vector machine),是机器学习中常用的分类器,或算法。 理论非常高深啊,核函数各种看不懂,简单来说是将低维度的复杂问题转为高维度的简单问题从而解决 or 寻找某个分割的超平面。。(应该是吧) 在学习机器学习过程中实现过SVM,在这个程序中使用了sklearn中的svm,具体代码在UITest.py文件的 p2tTest和loadData函数中,其中loadData为svm加载学习样本,样本储存路径见代码。 学习结果在样本足够充足的情况下是比较乐观的,基本可以排除大部分干扰线情况。 #### 部分图像处理截图 二值化实例图如下,这类是简单型验证码,直接使用函数返回灰度阈值即可 ![image](http://git.oschina.net/rx_z/ImageRecognition/raw/master/docfile/screenshots/test1.png) 这类验证码识别、分割较难,或者根本无法进行分割操作 ![image](http://git.oschina.net/rx_z/ImageRecognition/raw/master/docfile/screenshots/test2_1.png) ![image](http://git.oschina.net/rx_z/ImageRecognition/raw/master/docfile/screenshots/test4.png)