神器!使用Python 轻松识别验证码

简介: 本文介绍了使用Python进行验证码识别,主要包括安装Tesseract OCR和相关Python库,如`pytesseract`和`opencv-python`。通过Pillow加载验证码图片,使用`pytesseract`进行简单数字验证码识别。对于数字字母混合的验证码,先进行二值化和降噪处理,然后使用`cv2.findContours`分割字符并分别识别。这种方法适用于自动化测试和爬虫中的验证码处理。

image.png

前言

在我们进行自动化测试的过程中,免不了要在登录时遇到验证码,很多时候我们都是只能找开发要万能验证码或者暂时关闭验证码这个功能,但是有时候我们必须要验证码是否能够正常生成,所以在这个时候,我们需要做的就是输入验证码,但是验证码这个东西是随机生成的,不是每一次都一样,所以我们还是需要识别然后输入,脚本是没有眼睛的,只能通过代码来进行识别,所以本文就来给大家介绍一下如何使用Python来轻松识别数字验证码。

安装Python库和软件环境

验证码识别需要用到一些Python库和软件环境,下面将介绍它们的安装步骤。

  1. 安装Tesseract OCR

它是一个开源的光学字符识别引擎,用于识别验证码中的文本内容,能够识别70多种语言的文本,并为开发者提供简单易用的API。可以通过以下链接下载和安装:https://github.com/tesseract-ocr/tesseract。在Windows系统下可以下载exe文件进行安装。

注:Tesseract安装完成后需要将tesseract.exe文件路径加入系统的环境变量,否则无法在Python脚本中调用。

  1. 所需Python库

验证码识别需要使用的Python库包括:pillow(PIL)pytesseractopencv-python。pillow为Python自带的标准库,其它库可以使用pip命令自动安装:

pip install pytesseract
pip install opencv-python

识别简单的数字验证码

  1. 准备验证码图片

首先,我们需要准备一些验证码图片。可以在网络上搜索验证码图片进行下载,或者使用Python的爬虫程序去爬取目标网站的验证码。这里我们先手动下载一个简单的数字验证码图片,保存为“test.jpg”。

  1. 加载验证码图片

我们可以使用Pillow库(Python Imaging Library)加载验证码图片。Pillow库可以读取和处理不同类别的图片格式,如jpg、png、bmp等等。代码如下:

from PIL import Image
img = Image.open('test.jpg')
img.show()
  1. 识别验证码

使用pytesseract库,我们可以很容易地把图片中的数字识别出来。pytesseract库依赖于Tesseract OCR引擎,能够处理各种难度的验证码,如数字、字母、汉字、倾斜、变形等等。代码如下:

import pytesseract
text = pytesseract.image_to_string(Image.open('test.jpg'), lang='eng')
print(text)

这段代码的意思是用pytesseract库将图片中的字符串转换为字符。lang参数可以指定识别的语言类型,这里我们使用了eng,表示英文。如果验证码是汉字,设置为chi_sim即可。

识别数字字母混合的验证码

当验证码中既包含数字又包含字母时,需要对识别的方法进行修改,下面介绍一种简单的处理方法,即通过二值化和降噪处理来增加识别率。

二值化处理

二值化处理就是将图片中的所有像素转换为黑白两种颜色。对于验证码图片,我们可以将其转换为黑白灰度图像,便于后续的处理。代码如下:

import cv2
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
retval, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
cv2.imshow('Image', threshold)
cv2.waitKey(0)
cv2.destroyAllWindows()

这段代码用OpenCV库将图片读取为灰度图像,并进行二值化处理。其中,127是阈值,值越小,黑色部分就越多,白色部分就越少。运行后可以得到二值化后的图片。

降噪处理

在二值化后,图片中仍有一些噪点和干扰线条。如果不处理这些噪声,将会影响后续的字符识别,因此需要进行降噪处理,将图片中的噪点和干扰线条消除。代码如下:

import cv2
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
retval, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
blur = cv2.GaussianBlur(threshold,(5,5),0)
cv2.imshow('Image', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()

这段代码使用高斯滤波函数对图片进行平滑处理,消除噪声和干扰线条。其中(5,5)指定核的大小,值越大,平滑效果越明显。运行后可以得到处理后的图片。

识别验证码

对于数字和字母混合的验证码,我们需要对每个字符进行识别。可以采用字符分割的方法,将验证码图片分割成单个字符图片,再进行字符识别。代码如下:

import pytesseract
import cv2
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
retval, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
blur = cv2.GaussianBlur(threshold, (5,5), 0)
contours, hierarchy = cv2.findContours(blur, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
count = 0
for contour in contours:
    (x,y,w,h) = cv2.boundingRect(contour)
    if w > 10 and h > 10:
        roi = blur[y:y+h, x:x+w]
        cv2.imwrite(str(count)+'.jpg', roi)
        text = pytesseract.image_to_string(roi, lang='eng')
        print(text)
        count += 1
cv2.imshow('Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

这段代码先对图片进行二值化和降噪处理,然后使用findContours函数找到并分割出每个字符的边缘轮廓。再使用boundingRect函数得到每个字符的位置和大小,并使用image_to_string函数对每个字符进行字符识别。运行代码后,可以看到输出结果为分割出的每个字符及其识别结果。

总结

本文介绍了如何使用 Python 和相关库来识别数字验证码。通过这种方法,我们可以实现验证码的自动识别,用于自动化测试、爬虫程序或其他需要验证码处理的场景。在实际应用中,可以根据具体的需求对识别方法进行进一步优化和调整,以获得更好的识别效果。

相关文章
|
1月前
|
机器学习/深度学习 Python
【Python实战】——神经网络识别手写数字(三)
【Python实战】——神经网络识别手写数字
|
1月前
|
机器学习/深度学习 数据可视化 Python
【Python实战】——神经网络识别手写数字(二)
【Python实战】——神经网络识别手写数字(三)
|
3天前
|
存储 JavaScript 前端开发
Python Django下的实现注册验证码
摘要: 使用Python生成随机验证码图像,包括干扰线和噪点,保存到静态文件夹,并将验证码文本存储到数据库。数据库表包含ID、验证码图片路径和验证码文本。JavaScript函数`getRandomInt`生成1到300的随机数,用于请求对应数据库条目的验证码和图片。XMLHttpRequest发送POST请求到服务器,视图函数返回指定ID的验证码图片路径,实现验证码的动态刷新。
|
1月前
|
人工智能 开发工具 Python
2024年利用Python突破验证码限制,2024年最新Python高级开发工程师面试题
2024年利用Python突破验证码限制,2024年最新Python高级开发工程师面试题
2024年利用Python突破验证码限制,2024年最新Python高级开发工程师面试题
|
1月前
|
Python 计算机视觉
2024年Python最新利用python进行数学公式识别_python 识别图片中的数学公式,2024年最新字节跳动技术岗位面试
2024年Python最新利用python进行数学公式识别_python 识别图片中的数学公式,2024年最新字节跳动技术岗位面试
2024年Python最新利用python进行数学公式识别_python 识别图片中的数学公式,2024年最新字节跳动技术岗位面试
|
7天前
|
机器学习/深度学习 编解码 文字识别
【开源】轻松实现车牌检测与识别:yolov8+paddleocr【python源码+数据集】
【开源】轻松实现车牌检测与识别:yolov8+paddleocr【python源码+数据集】
|
7天前
|
机器学习/深度学习 存储 监控
基于YOLOv8深度学习的120种犬类检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战、狗类检测、犬种识别
基于YOLOv8深度学习的120种犬类检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战、狗类检测、犬种识别
|
1月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
python 数字验证码 自动识别
5月更文挑战第4天
41 3
|
28天前
|
机器学习/深度学习 数据可视化 数据处理
python 机器学习 sklearn——一起识别数字吧
python 机器学习 sklearn——一起识别数字吧
|
1月前
|
机器学习/深度学习 数据可视化 Python
【Python实战】——神经网络识别手写数字(一)
【Python实战】——神经网络识别手写数字