使用 Python 结合 Tesseract OCR 解析验证码


验证码(CAPTCHA)通常用于防止恶意机器人提交数据,但在某些自动化测试或数据处理任务中,我们可能需要自动识别验证码。本篇文章将介绍如何使用 Python 结合 Tesseract OCR 来解析验证码,并优化识别准确度。

1. 环境准备
1.1 安装 Python
如果你的系统尚未安装 Python,可以从 Python 官方网站 下载并安装。安装完成后,使用以下命令检查是否安装成功:


python --version
1.2 安装 Tesseract OCR
Windows 用户:

访问 Tesseract GitHub 下载 Windows 版本。

按照安装向导完成安装,并将 Tesseract-OCR 目录添加到环境变量。

运行以下命令检查是否安装成功:

tesseract --version
Linux(Ubuntu 示例):

sudo apt update
sudo apt install tesseract-ocr
macOS(使用 Homebrew):

brew install tesseract
1.3 安装 Python 依赖
使用 pip 安装所需的 Python 库:

pip install pytesseract opencv-python pillow numpy
pytesseract:Python 版本的 Tesseract OCR 接口

opencv-python:用于图像处理

Pillow:处理图片的库

numpy:用于数组和矩阵操作

2. 代码实现
下面的 Python 代码展示了如何加载验证码图像、进行预处理,并使用 Tesseract 进行 OCR 解析。

2.1 代码示例

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

# Windows 需要手动指定 Tesseract 路径
# pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

# 加载验证码图片
image_path = "captcha.png"
image = cv2.imread(image_path)

# 转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 二值化处理,提高对比度
_, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)

# 进行 OCR 识别
text = pytesseract.image_to_string(binary, config="--psm 6")

# 输出识别结果
print(f"识别出的验证码: {text.strip()}")

# 可选:保存处理后的图像
cv2.imwrite("processed_captcha.png", binary)
3. 代码解析
3.1 图像预处理
为了提高 OCR 识别率,我们对验证码进行以下优化:

转换为灰度图像

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
颜色信息可能会干扰识别,因此转换为 灰度图像。

二值化处理

_, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
通过二值化提高图像的对比度,使字符更清晰。

3.2 OCR 解析

text = pytesseract.image_to_string(binary, config="--psm 6")
pytesseract.image_to_string():执行 OCR 识别

--psm 6:指定 Tesseract 的页面分割模式(适用于单行文本)

4. 运行程序
将验证码图片 captcha.png 放入代码目录,并运行:

python captcha_reader.py
如果运行成功,会输出:

识别出的验证码: 4g7kA
5. 提高 OCR 识别率
5.1 选择合适的 Tesseract PSM 模式
Tesseract 提供了多种页面分割模式(PSM),适用于不同的场景:

--psm 6:假设验证码是一行文本

--psm 8:针对单个字符

--psm 11:处理不规则文本

可修改 config 参数:

text = pytesseract.image_to_string(binary, config="--psm 8")
5.2 进一步图像优化
去除噪点

binary = cv2.medianBlur(binary, 3)
使用 中值滤波 去除噪点,提高识别率。

放大字符
更多内容访问ttocr.com或联系1436423940
resized = cv2.resize(binary, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
放大字符,提高 OCR 识别准确度。

5.3 使用特定语言训练数据
Tesseract 默认使用 eng(英语)进行识别,如果验证码主要是数字,可以使用:


text = pytesseract.image_to_string(binary, lang="eng+osd", config="--psm 6")
lang="eng+osd":结合 eng(英语)和 osd(自动方向检测)

你也可以训练自己的 OCR 语言模型,提高识别率。

猜你喜欢

转载自blog.csdn.net/asfdsgdf/article/details/146572299
今日推荐