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

 更新时间:2020年01月10日 08:40:20   作者:公众号python学习开发  
这篇文章主要介绍了mac使用python识别图形验证码功能,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

前言

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

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

在网上查了很多版本的图形验证码识别,目前看到最多的两个模块是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)

示例中的图片

需要用到的图像知识:

对于彩色图像,不管其图像格式是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

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

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

二值化操作

二值化故名思议,就是整个图像所有像素只有两个值可以选择,一个是黑(灰度为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

此时的图片效果为

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

去干扰线

常见的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目标检测给图画框,bbox画到图上并保存案例

    python目标检测给图画框,bbox画到图上并保存案例

    这篇文章主要介绍了python目标检测给图画框,bbox画到图上并保存案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Python 图片文字识别的实现之PaddleOCR

    Python 图片文字识别的实现之PaddleOCR

    OCR方向的工程师,之前一定听说过PaddleOCR这个项目,其主要推荐的PP-OCR算法更是被国内外企业开发者广泛应用,短短半年时间,累计Star数量已超过15k,频频登上Github Trending和Paperswithcode 日榜月榜第一
    2021-11-11
  • Python实现简单的图书管理系统

    Python实现简单的图书管理系统

    这篇文章主要为大家详细介绍了Python实现简单的图书管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • python实现录音功能(可随时停止录音)

    python实现录音功能(可随时停止录音)

    这篇文章主要为大家详细介绍了python实现录音功能,可随时停止录音,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • OpenCV图像处理之自定义滤波

    OpenCV图像处理之自定义滤波

    滤波处理分为两大类:线性滤波和非线性滤波,OpenCV里有这些滤波的函数,使用起来非常方便,这篇文章主要给大家介绍了关于OpenCV图像处理之自定义滤波的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-08-08
  • Python基础学习之模块的安装和卸载

    Python基础学习之模块的安装和卸载

    其实现在还是有很多刚开始学习的小伙伴,会遇到模块不会安装的情况,或者一遇到报错就懵了,这样就很耽误我们的学习进度。所以,今天我们就来了解一下Python几种安装模块的方法吧
    2022-09-09
  • python实现将两个文件夹合并至另一个文件夹(制作数据集)

    python实现将两个文件夹合并至另一个文件夹(制作数据集)

    这篇文章主要介绍了python实现将两个文件夹合并至另一个文件夹(制作数据集),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • python3 如何使用 goto 跳转执行到指定代码行

    python3 如何使用 goto 跳转执行到指定代码行

    这篇文章主要介绍了python3 使用goto跳转执行到指定代码行的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • Python实现多进程共享数据的方法分析

    Python实现多进程共享数据的方法分析

    这篇文章主要介绍了Python实现多进程共享数据的方法,结合实例形式分析了Python多进程共享数据的相关实现技巧,需要的朋友可以参考下
    2017-12-12
  • 从零学Python之hello world

    从零学Python之hello world

    从今天开始讲陆续发布一系列python基础教程,让新手更快更好的入门。
    2014-05-05

最新评论