使用 Python 和 Tesseract 实现验证码识别

验证码(CAPTCHA)是用来验证用户是否为人类的常见技术,但在某些场景下,我们希望能够通过自动化手段识别验证码。本文将介绍如何使用 Python 和 Tesseract OCR 引擎实现验证码的自动识别,处理图像并提取其中的文字。

  1. 环境准备
    安装 Tesseract OCR
    首先,我们需要安装 Tesseract OCR 引擎。可以从 Tesseract 官网 下载并安装。安装后,确认是否成功安装,可以在终端中运行:

bash
tesseract --version更多内容访问ttocr.com或联系1436423940
如果返回了版本信息,表示安装成功。

安装 Python 库
接着,安装所需的 Python 库。我们需要安装 pytesseract、Pillow 和 opencv-python 等库:

bash

pip install pytesseract pillow opencv-python
pytesseract 是 Tesseract OCR 的 Python 包,允许我们在 Python 中调用 Tesseract 引擎。
Pillow 用于图像的基本处理。
opencv-python 用于图像处理和读取。
2. 编写验证码识别代码
以下是一个简单的 Python 脚本,展示如何加载图像,进行预处理,并使用 Tesseract 进行验证码识别。

python

import pytesseract
from PIL import Image
import cv2
import numpy as np

设置 Tesseract 可执行文件的路径

pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' # Windows 示例路径

读取图像

img = cv2.imread('captcha.png')

图像预处理:转为灰度图像

gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

图像二值化:将灰度图像转换为黑白图像,去除噪声

_, binary_img = cv2.threshold(gray_img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

去噪:使用中值滤波减少图像中的噪声

denoised_img = cv2.medianBlur(binary_img, 3)

保存处理后的图像(可选)

cv2.imwrite('processed_captcha.png', denoised_img)

使用 Tesseract OCR 进行识别

text = pytesseract.image_to_string(denoised_img)

输出识别的验证码

print("识别的验证码是:", text.strip())
3. 图像预处理
验证码图像常常包含噪声,且背景复杂,直接识别可能会导致错误。为了提高识别率,我们可以通过以下步骤进行图像预处理:

灰度化:将彩色图像转换为灰度图,减少颜色干扰。
二值化:将灰度图像转换为黑白图像,增加字符的对比度。
去噪:使用滤波算法减少图像中的噪声,使文字更加突出。
在上述代码中,首先使用 cv2.cvtColor() 将图像转为灰度图,随后使用 cv2.threshold() 进行二值化,并通过 cv2.medianBlur() 进行去噪。

  1. 提高识别准确率
    虽然 Tesseract 很强大,但对某些复杂的验证码,它可能识别不准确。以下是一些常见的提高识别准确率的方法:

  2. 使用字符白名单
    如果验证码只包含数字或字母,可以通过设置字符白名单来限制 Tesseract 只识别这些字符,从而提高识别准确度:

custom_config = r'--oem 3 --psm 6 tessedit_char_whitelist=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
text = pytesseract.image_to_string(denoised_img, config=custom_config)
2. 调整 OCR 参数
Tesseract 提供了许多参数,可以帮助提高识别率。其中,最常用的参数是 psm(页面分割模式):

psm 6:适用于单行文本。
psm 11:适用于稀疏文本。
psm 3:适用于常规文档。
你可以尝试调整这些参数,找到最适合验证码的模式:

python

custom_config = r'--psm 6'
text = pytesseract.image_to_string(denoised_img, config=custom_config)
3. 图像分割
如果验证码中包含多个字符并且字符之间有间隔,可以将图像分割成多个小图,分别进行识别,最后拼接识别结果。

例如,使用 OpenCV 对图像进行轮廓检测,将每个字符分割出来进行单独识别。

  1. 自定义训练
    如果验证码的字体非常特殊,Tesseract 的默认模型可能无法准确识别。在这种情况下,你可以通过提供自定义训练数据来提高识别精度。Tesseract 支持训练模型来识别自定义字体或特定类型的验证码。

  2. 运行程序
    保存代码为 captcha_recognition.py,并确保验证码图像(如 captcha.png)与代码文件位于同一目录。然后,运行 Python 程序:

bash

python captcha_recognition.py
成功运行后,你将看到类似以下的输出:

makefile

识别的验证码是: X9D2A

posted @   ttocr、com  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示