使用 Python 和 Tesseract 实现英文数字验证码识别(进阶优化版)

在本教程中,我们将详细探讨如何使用 Python 和 Tesseract OCR 引擎识别英文数字验证码。验证码识别不仅仅依赖于 Tesseract 本身,还涉及一些图像预处理方法和识别技巧,以提升识别率,尤其是在处理复杂或扭曲的验证码时。

  1. 环境准备
    首先,您需要安装必要的工具和库。

(1)安装 Tesseract OCR 引擎
Linux 系统:

sudo apt-get update
sudo apt-get install tesseract-ocr
macOS 系统:

brew install tesseract
Windows 系统: 下载并安装 Tesseract OCR,并确保将安装路径添加到系统的环境变量中。

(2)安装 Python 库
使用 pip 安装以下 Python 库:

pip install pytesseract pillow numpy opencv-python
pytesseract 用于 Python 和 Tesseract 的接口。

Pillow 用于加载和操作图像。

opencv-python 和 numpy 用于图像处理和预处理。

  1. 图像预处理方法
    验证码的图像质量对 OCR 识别效果至关重要。以下是一些常用的图像预处理方法,可以帮助提高识别准确性。

(1)灰度化
将彩色图像转换为灰度图像是最基本的预处理步骤。灰度化减少了颜色信息的干扰,聚焦于形状和纹理。

def to_grayscale(image):
return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
(2)二值化
二值化将图像转换为黑白两种颜色,便于识别。可以通过全局阈值或者自适应阈值来实现。

def binarize_image(image):
_, binary_image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
return binary_image
(3)去噪
去噪能够去除图像中的干扰点和不规则噪声,使字符轮廓更加清晰。可以使用中值滤波或者高斯滤波来去噪。

def denoise_image(image):
return cv2.GaussianBlur(image, (5, 5), 0)
(4)自适应阈值化
在背景复杂的情况下,使用自适应阈值化方法更能适应不同区域的光照变化。

def adaptive_threshold(image):
return cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_MEAN_C,
cv2.THRESH_BINARY, 11, 2)
3. OCR 识别
将经过预处理的图像传递给 Tesseract OCR 引擎进行字符识别。Tesseract 是一个开源的 OCR 引擎,能够识别多种语言的文本。

import pytesseract
from PIL import Image

def recognize_text_from_image(image):
# 使用 Tesseract 识别文本
text = pytesseract.image_to_string(image, config='--psm 6')
return text.strip()
config='--psm 6' 设置 Tesseract 的页面分割模式为 6,适合于常规的单一文本行。

  1. 完整示例代码
    将所有的预处理方法和识别过程整合在一起,得到一个完整的验证码识别程序。

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

设置 Tesseract 路径

pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe" # 根据你的安装路径调整

def preprocess_image(image_path):
# 读取图像
image = cv2.imread(image_path)

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

# 二值化图像
binary_image = cv2.threshold(gray_image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

# 去噪处理
denoised_image = cv2.GaussianBlur(binary_image, (5, 5), 0)

# 自适应阈值
adaptive_image = cv2.adaptiveThreshold(denoised_image, 255, cv2.ADAPTIVE_THRESH_MEAN_C,
                                      cv2.THRESH_BINARY, 11, 2)

return adaptive_image

def recognize_captcha(image_path):
# 预处理图像
processed_image = preprocess_image(image_path)

# 将处理后的图像转换为 PIL 图像以便 Tesseract 识别
pil_image = Image.fromarray(processed_image)

# 使用 Tesseract OCR 进行识别
captcha_text = pytesseract.image_to_string(pil_image, config='--psm 6')
return captcha_text.strip()

def main():
image_path = "captcha_example.png" # 替换为实际验证码图片的路径
result = recognize_captcha(image_path)
print(f"识别的验证码是: {result}")

if name == "main":
main()
5. 进一步优化
(1)字符分割
对于字符重叠或者连在一起的验证码,直接使用 OCR 可能会导致识别错误。我们可以通过字符分割来将每个字符独立出来进行识别。

def split_characters(image):
contours, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
characters = []
更多内容访问ttocr.com或联系1436423940
for contour in contours:
# 获取每个字符的边界框
x, y, w, h = cv2.boundingRect(contour)
if w > 10 and h > 10: # 忽略噪点
character = image[y:y+h, x:x+w]
characters.append(character)

return characters

通过分割字符,我们可以分别识别每个字符,而不是整体进行识别。

(2)训练 Tesseract
Tesseract 提供了训练功能,如果你需要识别某些特殊字体或者自定义字符集,可以通过训练 Tesseract 来提升识别效果。

Tesseract 的训练过程较为复杂,涉及到生成训练数据、训练模型、导出训练文件等步骤。具体可以参考 Tesseract 的官方文档。

posted @ 2025-04-16 12:11  ttocr、com  阅读(85)  评论(0)    收藏  举报