mac使用python识别图形验证码功能


Posted in Python onJanuary 10, 2020

前言

最近在研究验证码相关的操作,所以准备记录下安装以及使用的过程。虽然之前对验证码的破解有所了解的,但是之前都是简单使用之后就不用了,没有记录一个详细的过程,所以后面再用起来也要重新从网上查找资料比较麻烦,所以这里准备对研究过程的关键点做一个记录。

首先这篇文章,主要是研究图形验证码,后期会不定时拓展内容。

在网上查了很多版本的图形验证码识别,目前看到最多的两个模块是pytesseract和tesserocr,但是因为我这里安装tesserocr的时候各种出错,所以最终我锁定了使用pytesseract。

那么接下来,就记录下安装以及使用过程。这里的系统环境是mac os 10.14.

安装tesserocr

brew install tesserocr

因为pytesseract依赖于tesserocr所以首先需要先安装tesserocr这个软件。接下来就是安装python相关的包

安装python所需要的包

pip3 install pytesseract
pip3 install pillow

安装pytesseract是ocr识别图片上的字,因为验证码的识别难度高低不同,所以在这个过程中需要对图片做一定的处理,这就需要使用处理图片的模块pillow。

一个简单的demo

import pytesseract
from PIL import Image
import os
def binarizing(img, threshold):
 """传入image对象进行灰度、二值处理"""
 pixdata = img.load()
 w, h = img.size
 # 遍历所有像素,大于阈值的为黑色
 for y in range(h):
 for x in range(w):
  if pixdata[x, y] < threshold:
  pixdata[x, y] = 0
  else:
  pixdata[x, y] = 255
 return img
_temp = os.path.dirname(__file__)
file_path = os.path.join(_temp, 'code2.jpg')
print("file_path", file_path)
image = Image.open(file_path)
image = image.convert('L')
threshold = 157
table = []
# 接下来是二值化处理
# 遍历所有像素,大于阈值的为黑色,threshold是阀值
image = binarizing(image, threshold)
result = pytesseract.image_to_string(image)
print(result)

示例中的图片

mac使用python识别图形验证码功能

需要用到的图像知识:

对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”。而对于灰度图像,不管其图像格式是PNG,还是BMP,或者JPG,打开后,其模式为“L”也就是我们说的灰度化的一个操作。除此之外,还有其他的模式,不过我们在处理验证码的时候是将其转为灰度模式,所以就不强调其他的模式了。

模式“L”

模式“L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。在PIL中,从模式“RGB”转换为“L”模式是按照下面的公式转换的:

L = R * 299/1000 + G * 587/1000+ B * 114/1000

通过灰度化之后的图片变为

mac使用python识别图形验证码功能

灰度化我们还要对其进行二值化操作

二值化操作

二值化故名思议,就是整个图像所有像素只有两个值可以选择,一个是黑(灰度为0),一个是白(灰度为255)。二值化的好处就是将图片上的有用信息和无用信息区分开来,比如二值化之后的验证码图片,验证码像素为黑色,背景和干扰点为白色,这样后面对验证码像素处理的时候就会很方便。对于简单的图形验证码,到这里基本上就够了,但是如果有干扰线,还要进行除干扰线的操作。

对应的代码为

def binarizing(img, threshold):
 """传入image对象进行灰度、二值处理"""
 pixdata = img.load()
 w, h = img.size
 # 遍历所有像素,大于阈值的为黑色
 for y in range(h):
 for x in range(w):
  if pixdata[x, y] < threshold:
  pixdata[x, y] = 0 #小于阀值设为0,0是黑色
  else:
  pixdata[x, y] = 255 0 #大于阀值设为255,255是白色
 return img

此时的图片效果为

mac使用python识别图形验证码功能

可以看到图片变得锐化了很多,这个时候再去识别就比较好识别了。

去干扰线

常见的4邻域、8邻域算法。所谓的X邻域算法,可以参考手机九宫格输入法,按键5为要判断的像素点,4邻域就是判断上下左右,8邻域就是判断周围8个像素点。如果这4或8个点中255的个数大于某个阈值则判断这个点为噪音,阈值可以根据实际情况修改。

使用cv2处理

除此之外还可以使用cv2模块进行处理。

安装

pip install opencv-python

代码示例

# -*- coding: utf-8 -*-
import cv2
import numpy as np
import os
_temp = os.path.dirname(__file__)
file_path = os.path.join(_temp, 'code2.jpg')
def remove_noise(img, k=4):
 ###8领域过滤
 img2 = img.copy()
 # img处理数据,k过滤条件
 w, h = img2.shape
 def get_neighbors(img3, r, c):
 count = 0
 for i in [r - 1, r, r + 1]:
  for j in [c - 1, c, c + 1]:
  if img3[i, j] > 10: # 纯白色
   count += 1
 return count
 # 两层for循环判断所有的点
 for x in range(w):
 for y in range(h):
  if x == 0 or y == 0 or x == w - 1 or y == h - 1:
  img2[x, y] = 255
  else:
  n = get_neighbors(img2, x, y) # 获取邻居数量,纯白色的邻居
  if n > k:
   img2[x, y] = 255
 return img2
img = cv2.imread(file_path)
# 将图片灰度化处理,降维,加权进行灰度化c
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
t, gray2 = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY)
cv2.imshow('threshold', gray2)
result = remove_noise(gray2)
cv2.imshow('8neighbors', result)
cv2.waitKey(0)
#cv2.destroyAllWindows()

总结

以上所述是小编给大家介绍的mac使用python识别图形验证码功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
用Python输出一个杨辉三角的例子
Jun 13 Python
Python中设置变量作为默认值时容易遇到的错误
Apr 03 Python
Python中asyncore异步模块的用法及实现httpclient的实例
Jun 28 Python
详解Python 数据库 (sqlite3)应用
Dec 07 Python
python批量设置多个Excel文件页眉页脚的脚本
Mar 14 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
Oct 14 Python
Python中类的创建和实例化操作示例
Feb 27 Python
Python解析json时提示“string indices must be integers”问题解决方法
Jul 31 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
Oct 17 Python
Python Scrapy框架第一个入门程序示例
Feb 05 Python
python help函数实例用法
Dec 06 Python
python中threading和queue库实现多线程编程
Feb 06 Python
python列表推导和生成器表达式知识点总结
Jan 10 #Python
pytorch的梯度计算以及backward方法详解
Jan 10 #Python
Python如何获取Win7,Win10系统缩放大小
Jan 10 #Python
python-OpenCV 实现将数组转换成灰度图和彩图
Jan 09 #Python
Python 实现将数组/矩阵转换成Image类
Jan 09 #Python
python 实现将Numpy数组保存为图像
Jan 09 #Python
Python+OpenCV实现将图像转换为二进制格式
Jan 09 #Python
You might like
php设计模式 Strategy(策略模式)
2011/06/26 PHP
thinkphp 多表 事务详解
2013/06/17 PHP
PHP的preg_match匹配字符串长度问题解决方法
2014/05/03 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
Extjs学习笔记之七 布局
2010/01/08 Javascript
cnblogs中在闪存中屏蔽某人的实现代码
2010/11/14 Javascript
jQuery JSON实现无刷新三级联动实例探讨
2013/05/28 Javascript
SwfUpload在IE10上不出现上传按钮的解决方法
2013/06/25 Javascript
深入理解JavaScript系列(42):设计模式之原型模式详解
2015/03/04 Javascript
Javascript中的作用域和上下文深入理解
2015/07/03 Javascript
深入理解js中的加载事件
2017/02/08 Javascript
完美解决浏览器跨域的几种方法(汇总)
2017/05/08 Javascript
浅谈如何使用 webpack 优化资源
2017/10/20 Javascript
Vue开发Html5微信公众号的步骤
2019/04/11 Javascript
小程序根据手机机型设置自定义底部导航距离
2019/06/04 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
2019/12/01 Javascript
[01:03:56]Mineski vs TNC 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
[01:20]PWL开团时刻DAY9——听说潮汐没用?
2020/11/10 DOTA
Python数据类型详解(一)字符串
2016/05/08 Python
Python中文分词实现方法(安装pymmseg)
2016/06/14 Python
详解Swift中属性的声明与作用
2016/06/30 Python
Python 迭代器与生成器实例详解
2017/05/18 Python
python中MethodType方法介绍与使用示例
2017/08/03 Python
python分块读取大数据,避免内存不足的方法
2018/12/10 Python
python使用celery实现异步任务执行的例子
2019/08/28 Python
Python 私有化操作实例分析
2019/11/21 Python
python简单的三元一次方程求解实例
2020/04/02 Python
企业面试题试卷附带答案
2015/12/20 面试题
药学专业大学生个人的自我评价
2013/11/04 职场文书
电子商务专业学生的自我鉴定
2013/11/28 职场文书
运动会表扬稿大全
2014/01/16 职场文书
小区门卫值班制度
2014/01/24 职场文书
《小小雨点》教学反思
2014/02/18 职场文书
部队反四风对照检查材料
2014/09/26 职场文书
vue3中的组件间通信
2021/03/31 Vue.js
使用logback实现按自己的需求打印日志到自定义的文件里
2021/08/30 Java/Android