python简单验证码识别的实现方法


Posted in Python onMay 10, 2019

利用SVM向量机进行4位数字验证码识别

       主要是思路和步骤如下:

一,素材收集

检查环境是否包含有相应的库:

1.在cmd中,通过 pip list命令查看安装的库

2.再使用pip installRequests 安装Requests库

3.再次使用pip list 命令

python简单验证码识别的实现方法

4.利用python获取验证码资源

编写代码:_DownloadPic.py

#!/usr/bin/nev python3
#利用python从站点下载验证码图片

import requests

## 1.在 http://www.xxx.com
# 获取验证码URL
def Downloads_Pic(strPath, strName):
 #设置url
 url = 'http://www.xxx.com'

 #以二进制方式发送Get请求,
 #将stream = True,
 #数据读取完成前不要断开链接
 rReq = requests.get(url, stream = True)

 #尝试保存图片
 with open(strPath + strName + '.png', 'wb') as fpPic:
  #循环读取1024Byte到byChunk中,读完则跳出
  for byChunk in rReq.iter_content(chunk_size = 1024):
   if byChunk:
    fpPic.write(byChunk)
    fpPic.flush()
  fpPic.close()

for i in range(1, 10 + 1):
 strFileName = "%03d" % i
 Downloads_Pic('D:/1/', strFileName)

二,素材处理

1.二值化处理,增加对比度,锐化,增加亮度,滤镜,转为黑白

2.去除噪点

3.切割图片

python简单验证码识别的实现方法

编写代码:_PicDealWith.py

#!/usr/bin/env python3
import os
import os.path
from PIL import Image, ImageEnhance, ImageFilter
import random

#二值化处理
#strImgPath 图片路径
def BinaryzationImg(strImgPath):
 #打开图片
 imgOriImg = Image.open(strImgPath)

 #增加对比度
 pocEnhance = ImageEnhance.Contrast(imgOriImg)
 #增加255%对比度
 imgOriImg = pocEnhance.enhance(2.55)

 #锐化
 pocEnhance = ImageEnhance.Sharpness(imgOriImg)
 #锐化200%
 imgOriImg = pocEnhance.enhance(2.0)

 #增加亮度
 pocEnhance = ImageEnhance.Brightness(imgOriImg)
 #增加200%
 imgOriImg = pocEnhance.enhance(2.0)

 #添加滤镜效果
 imgGryImg = imgOriImg.convert('L').filter(ImageFilter.DETAIL)

 #二值化处理
 imgBinImg = imgGryImg.convert('1')

 return imgBinImg

#去除噪点
def ClearNoise(imgBinImg):
 for x in range(1, (imgBinImg.size[0]-1)):
  for y in range(1,(imgBinImg.size[1] - 1)):
  #一个点为黑色,周围8个点为白色,则此点为噪点,设置为白色
   if imgBinImg.getpixel((x, y)) == 0 \
    and imgBinImg.getpixel(((x - 1), (y + 1))) == 255 \
    and imgBinImg.getpixel(((x - 1), y)) == 255 \
    and imgBinImg.getpixel(((x - 1), (y - 1))) == 255 \
    and imgBinImg.getpixel(((x + 1), (y + 1))) == 255 \
    and imgBinImg.getpixel(((x + 1), y)) == 255 \
    and imgBinImg.getpixel(((x + 1), (y - 1))) == 255 \
    and imgBinImg.getpixel((x, (y + 1))) == 255 \
    and imgBinImg.getpixel((x, (y - 1))) == 255:
    imgBinImg.putpixel([x, y], 255)

 return imgBinImg

#切割图片
def GetCropImgs(imgClrImg):
 ImgList = []
 for i in range(4):
  x = 6 + i * 13
  y = 3
  SubImg = imgClrImg.crop((x, y, x + 13, y + 15))
  ImgList.append(SubImg)
 return ImgList


#调用部分
def main():
 g_Count = 0
 strStep1Dir = 'D:/1/step1/'
 strStep2Dir = 'D:/1/step2/'
 for ParentPath, DirName, FileNames in os.walk(strStep1Dir):
  for i in FileNames:
   #图片文件路径信息
   strFullPath = os.path.join(ParentPath, i)
   imgBinImg = BinaryzationImg(strFullPath)
   imgClrImg = ClearNoise(imgBinImg)
   ImgList = GetCropImgs(imgClrImg)
   for img in ImgList:
    strImgName = "%04d%04d.png" % (g_Count, random.randint(0, 9999))
    strImgPath = os.path.join(strStep2Dir, strImgName)
    img.save(strImgPath)
    g_Count += 1

 print("OK!")

if __name__ == '__mian__':
 main()

三,手工分类

将第二步切割好的图片进行分类,体力活

python简单验证码识别的实现方法

四,利用SVM向量机建立模型

1.安装svm库

  下载libsvm库,并解压

  将库中的windows目录的路径添加到path环境变量中

将libsvm下的python文件夹中的svm.py和svmutil.py文件拷贝到你的python的路径中lib文件夹中

from svmutil import *

2.生成模型文件

  2.1.将分好类的图片信息进行提取,生成特征值

  2.2.输出向量数据

python简单验证码识别的实现方法

  2.3.根据数据输出SVM模型文件

python简单验证码识别的实现方法 

编写代码:_SVMDemo.py

#!/usr/bin/env python3

#SVM,验证码识别

import os
import sys
import random
import os.path
from PIL import Image, ImageEnhance, ImageFilter
from svmutil import *

##记录像素点的值,描述特征,采用遍历每个像素点统计黑色点的数量
def GetFeature(imgCropImg, nImgHeight, nImgWidth):
 PixelCountList = []
 for y in range(nImgHeight):
  CountX = 0
  for x in range(nImgWidth):
   if imgCropImg.getpixel((x, y)) == 0:
    CountX += 1
  PixelCountList.append(CountX)
 for x in range(nImgWidth):
  CountY = 0
  for y in range(nImgHeight):
   if imgCropImg.getpixel((x, y)) == 0:
    CountY += 1
  PixelCountList.append(CountY)
 return PixelCountList

##输出向量数据
def OutPutVectorData(strID, strMaterialDir, strOutPath):
 for ParentPath, DirNames, FileNames in os.walk(strMaterialDir):
  with open(strOutPath, 'a') as fpFea:
   for fp in FileNames:
    #图片文件路径信息
    strFullPath = os.path.join(ParentPath, fp)

    #打开图片
    imgOriImg = Image.open(strFullPath)

    #生成特征值
    FeatureList = GetFeature(imgOriImg, 15, 13)

    strFeature = strID + ' '
    nCount = 1
    for i in FeatureList:
     strFeature = '%s%d:%d ' % (strFeature, nCount, i)
     nCount += 1
    fpFea.write(strFeature + '\n')
    fpFea.flush()
  fpFea.close()

#训练SVM模型
def TrainSvmModel(strProblemPath, strModelPath):
 Y, X = svm_read_problem(strProblemPath)
 Model = svm_train(Y, X)
 svm_save_model(strModelPath, Model)

#SVM模型测试
def SvmModelTest(strProblemPath, strModelPath):
 TestY, TestX = svm_read_problem(strProblemPath)
 Model = svm_load_model(strModelPath)
 #返回识别结果
 pLabel, pAcc, pVal = svm_predict(TestY, TestX, Model)
 return pLabel


##输出测试向量数据
def OutPutTestVectorData(strID, strDir, strOutPath):
 fileList = []
 for parentPath, strDir, fileName in os.walk(strDir):
  fileList = fileName
 with open(strOutPath, 'a') as fpFea:
  for fp in fileList:
   #图片文件路径信息
   strFullPath = os.path.join(parentPath, fp)

   #打开图片
   imgOriImg = Image.open(strFullPath)

   #生成特征值
   FeatureList = GetFeature(imgOriImg, 15, 13)

   strFeature = strID + ' '
   nCount = 1
   for i in FeatureList:
    strFeature = '%s%d:%d ' % (strFeature, nCount, i)
    nCount += 1
   fpFea.write(strFeature + '\n')
   fpFea.flush()
  fpFea.close()


def main():
# 1.循环输出向量文件
 for i in range(0, 10):
  strID = '%d' % i
  OutPutVectorData(strID, 'D:/1/step3/' + strID, 'D:/1/step4/Vector.txt')

# 2.调用函数训练SVM模型
 TrainSvmModel('D:/1/step4/Vector.txt', 'D:/1/step5/Model.txt')
# 3.调用函数识别结果
 pLabel = SvmModelTest('D:/1/step6/Vector.txt', 'D:/1/step5/Model.txt')
 for i in pLabel:
  print('%d' % i)



if __name__ == '__main__':
 main()

五,测试

1.利用模型文件和向量文件进行测试验证码识别

    ##1.获取一张验证码图片

    ##2.对图片进行处理

    ##  2.1.二值化处理,增加对比度,锐化,增加亮度,滤镜,转为黑白,

    ##  2.2.去除噪点

    ##  2.3.切割图片

    ##3.生成向量文件

    ##4.再利用之前的模型文件进行识别测试

编写代码:_SVMTest.py

#!/usr/bin/env python3
#对一张验证码图片进行识别测试

##1.获取一张验证码图片
##2.对图片进行处理
## 2.1.二值化处理,增加对比度,锐化,增加亮度,滤镜,转为黑白,
## 2.2.去除噪点
## 2.3.切割图片
##3.生成向量文件
##4.再利用之前的模型文件进行识别测试

################
import _PicDealWith
import os
import random
import _SVMDemo


##测试
g_Count = 0
strDirPath = 'D:/1/test/'
strFileName = '001.png'
#1.图片文件路径信息
strFullPath = os.path.join(strDirPath, strFileName)
#2.对图片进行处理
#2.1二值化处理
imgBinImg = _PicDealWith.BinaryzationImg(strFullPath)
#2.2去除噪点
imgClrImg = _PicDealWith.ClearNoise(imgBinImg)
#2.3切割图片
ImgList = _PicDealWith.GetCropImgs(imgClrImg)
#2.3循环写入文件
for img in ImgList:
 strImgName = "%04d%04d.png" % (g_Count, random.randint(0, 9999))
 strImgPath = os.path.join(strDirPath, strImgName)
 img.save(strImgPath)
 g_Count += 1

print("OK")

os.remove(strFullPath)

#3.生成向量文件
_SVMDemo.OutPutTestVectorData('0', 'D:/1/test/', 'D:/1/test/Vector.txt')

#4.利用之前的模型文件进行识别测试
pLabel = _SVMDemo.SvmModelTest('D:/1/test/Vector.txt', 'D:/1/step5/Model.txt')
for i in pLabel:
 print('%d' % i, end = '')

效果图:

python简单验证码识别的实现方法

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python使用自定义user-agent抓取网页的方法
Apr 15 Python
python中getaddrinfo()基本用法实例分析
Jun 28 Python
Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
Apr 17 Python
Python处理PDF及生成多层PDF实例代码
Apr 24 Python
Python Flask基础教程示例代码
Feb 07 Python
pandas中的DataFrame按指定顺序输出所有列的方法
Apr 10 Python
Python处理CSV与List的转换方法
Apr 19 Python
Python实用技巧之利用元组代替字典并为元组元素命名
Jul 11 Python
python+selenium实现自动抢票功能实例代码
Nov 23 Python
python计算Content-MD5并获取文件的Content-MD5值方式
Apr 03 Python
聊聊python中的异常嵌套
Sep 01 Python
python cookie反爬处理的实现
Nov 01 Python
eclipse创建python项目步骤详解
May 10 #Python
Python实现字符型图片验证码识别完整过程详解
May 10 #Python
使用python PIL库实现简单验证码的去噪方法步骤
May 10 #Python
使用selenium模拟登录解决滑块验证问题的实现
May 10 #Python
python队列Queue的详解
May 10 #Python
使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
May 10 #Python
详解python中的线程与线程池
May 10 #Python
You might like
PHP伪造referer实例代码
2008/09/20 PHP
PHP 编写的 25个游戏脚本
2009/05/11 PHP
fetchAll()与mysql_fetch_array()的区别详解
2013/06/05 PHP
PHP使用gmdate实现将一个UNIX 时间格式化成GMT文本的方法
2015/03/19 PHP
PHP 序列化和反序列化函数实例详解
2020/07/18 PHP
php app支付宝回调(异步通知)详解
2018/07/25 PHP
jquery实现textarea输入字符控制(仿微博输入控制字符)
2013/04/26 Javascript
Jquery遍历节点的方法小集
2014/01/22 Javascript
jquery提交form表单时禁止重复提交的方法
2014/02/13 Javascript
JavaScript设置获取和设置属性的方法
2015/03/04 Javascript
Javascript实现可旋转的圆圈实例代码
2015/08/04 Javascript
浅谈javascript中onbeforeunload与onunload事件
2015/12/10 Javascript
浅谈JS中String()与 .toString()的区别
2016/10/20 Javascript
基于JavaScript实现多级菜单效果
2017/07/25 Javascript
深入理解Vue2.x的虚拟DOM diff原理
2017/09/27 Javascript
vue组件编写之todolist组件实例详解
2018/01/22 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
2019/08/12 Javascript
vue element实现表格合并行数据
2020/11/30 Vue.js
[08:53]DOTA2每周TOP10 精彩击杀集锦vol.9
2014/06/26 DOTA
[01:12]快闪回顾DOTA2亚洲邀请赛(DAC) 静候2018新征程开启
2018/03/11 DOTA
使用python实现扫描端口示例
2014/03/29 Python
浅谈Python中的可变对象和不可变对象
2017/07/07 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
2019/05/13 Python
python 接口实现 供第三方调用的例子
2019/08/13 Python
pytorch:实现简单的GAN示例(MNIST数据集)
2020/01/10 Python
在tensorflow中设置保存checkpoint的最大数量实例
2020/01/21 Python
python解释器安装教程的方法步骤
2020/07/02 Python
Python DES加密实现原理及实例解析
2020/07/17 Python
基于python的opencv图像处理实现对斑马线的检测示例
2020/11/29 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
美国电视购物:QVC
2017/02/06 全球购物
护理专业个人求职简历的自我评价
2013/10/13 职场文书
2014年乡镇纪委工作总结
2014/12/19 职场文书
毕业生党员个人总结
2015/02/14 职场文书
干货!开幕词的写作方法
2019/04/02 职场文书
Python 绘制多因子柱状图
2022/05/11 Python