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字符串替换实例分析
May 11 Python
Python计算三角函数之asin()方法的使用
May 15 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
Nov 23 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
Jan 06 Python
Python之列表实现栈的工作功能
Jan 28 Python
Python子类继承父类构造函数详解
Feb 19 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
Dec 30 Python
python利用JMeter测试Tornado的多线程
Jan 12 Python
opencv python Canny边缘提取实现过程解析
Feb 03 Python
python的sys.path模块路径添加方式
Mar 09 Python
opencv中图像叠加/图像融合/按位操作的实现
Apr 01 Python
python基于openpyxl生成excel文件
Dec 23 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
input file获得文件根目录简单实现
2013/04/26 PHP
php内核解析:PHP中的哈希表
2014/01/30 PHP
Symfony2实现从数据库获取数据的方法小结
2016/03/18 PHP
laravel中的一些简单实用功能
2018/11/03 PHP
解决laravel查询构造器中的别名问题
2019/10/17 PHP
Javascript 命名空间模式
2013/11/01 Javascript
js读写json文件实例代码
2014/10/21 Javascript
jQuery中remove()方法用法实例
2014/12/25 Javascript
Bootstrap项目实战之首页内容介绍(全)
2016/04/25 Javascript
字太多用...代替的方法(两种)
2017/03/15 Javascript
Node.js中的require.resolve方法使用简介
2017/04/23 Javascript
用Node提供静态文件服务的方法
2018/07/06 Javascript
React 无状态组件(Stateless Component) 与高阶组件
2018/08/14 Javascript
vue element-ui实现动态面包屑导航
2019/12/23 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
2020/03/04 Javascript
[01:23]2014DOTA2国际邀请赛 球迷无处不在Ti现场世界杯受关注
2014/07/10 DOTA
深入理解NumPy简明教程---数组2
2016/12/17 Python
pyqt5 从本地选择图片 并显示在label上的实例
2019/06/13 Python
python线程安全及多进程多线程实现方法详解
2019/09/27 Python
python实现矩阵和array数组之间的转换
2019/11/29 Python
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
美国室内和室外装饰花盆购物网站:ePlanters
2019/03/22 全球购物
法国女性内衣购物网站:Glamuse
2019/05/13 全球购物
《永远的白衣战士》教学反思
2014/04/25 职场文书
班主任评语大全
2014/04/26 职场文书
爱之链教学反思
2014/04/30 职场文书
公司领导班子四风对照检查材料
2014/09/27 职场文书
干部作风整顿个人剖析材料
2014/10/06 职场文书
云南省召开党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
2014年干部作风建设总结
2014/10/23 职场文书
后备干部推荐材料
2014/12/24 职场文书
婚礼庆典答谢词
2015/01/20 职场文书
Go语言切片前或中间插入项与内置copy()函数详解
2021/04/27 Golang
关于React Native使用axios进行网络请求的方法
2021/08/02 Javascript
JavaScript中document.activeELement焦点元素介绍
2021/11/27 Javascript
Python OpenCV之常用滤波器使用详解
2022/04/07 Python