用 Python 和 Tesseract OCR 实现验证码识别(附完整图像预处理流程)

验证码识别是自动化测试和数据爬取中常见的任务之一。本篇文章将带你一步步构建一个验证码识别工具,使用 Python 搭配 Tesseract OCR 引擎,配合图像预处理技术提高识别准确率。

一、技术选型
语言:Python 3.x

OCR 引擎:Tesseract(Google 出品,免费开源)

图像处理:OpenCV(处理灰度、二值化、降噪等)
更多内容访问ttocr.com或联系1436423940
安装依赖
确保你的环境中安装以下内容:

pip install pytesseract opencv-python pillow numpy
另外,Tesseract OCR 引擎本体必须安装,且路径正确配置。安装地址:

Windows:https://github.com/tesseract-ocr/tesseract

Linux(如 Ubuntu):sudo apt install tesseract-ocr

配置 Tesseract 路径(Windows 用户):

import pytesseract
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
二、完整识别流程代码
保存为 captcha_tesseract.py:

import cv2
import pytesseract
import numpy as np

设置 Tesseract 路径(Windows 用户需要)

pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

图像预处理函数

def preprocess_image(image_path):
image = cv2.imread(image_path)

# 转灰度
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 二值化(大津算法)
_, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 膨胀腐蚀处理(可选)
kernel = np.ones((2, 2), np.uint8)
processed = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)

cv2.imwrite("processed.png", processed)
return processed

OCR识别函数

def recognize_text(image):
custom_config = r'--oem 3 --psm 7 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
text = pytesseract.image_to_string(image, config=custom_config)
return text.strip()

if name == "main":
image_path = "captcha.png"
processed_image = preprocess_image(image_path)
result = recognize_text(processed_image)

print("识别结果:", result)

三、关键步骤讲解

  1. 灰度处理
    将 RGB 图像转换为单通道灰度图,便于后续二值化处理。

  2. 大津阈值法
    自动选择最佳阈值,将灰度图像转换为黑白图像,强调文字区域。

  3. 图像形态学处理
    适当的膨胀、腐蚀操作有助于消除背景噪点或连接断裂字符。

  4. Tesseract 参数说明
    --oem 3:使用 LSTM OCR 引擎

--psm 7:单行文字识别,适合验证码

tessedit_char_whitelist:限制字符集,提高准确性

四、示例识别效果
假设你有如下验证码图像:

图片名称:captcha.png

内容示例:W5RXK

运行程序后输出:

识别结果: W5RXK
五、进一步优化建议
字符分割处理:若字符粘连严重,可借助轮廓检测提取每个字符。

验证码数据增强:模拟多种样式、字体和噪声,训练专用模型(如 CNN)。

替代引擎:Tesseract 不适合高干扰验证码,可考虑 EasyOCR、CRNN、PaddleOCR 等。

API 化:使用 Flask/Django 封装为接口,供网页或爬虫调用。

posted @ 2025-06-06 19:11  ttocr、com  阅读(362)  评论(0)    收藏  举报