# 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几个月,界面设计和代码都有很多不太合理的地方。
希望大家提出一些意见,如果能够看得下去代码的话 -_=:

> **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加载学习样本,样本储存路径见代码。
学习结果在样本足够充足的情况下是比较乐观的,基本可以排除大部分干扰线情况。
#### 部分图像处理截图
二值化实例图如下,这类是简单型验证码,直接使用函数返回灰度阈值即可

这类验证码识别、分割较难,或者根本无法进行分割操作

