使用 Python 和 Tesseract 实现英文数字验证码识别

在本教程中,我们将使用 Python 和 Tesseract OCR 引擎来识别英文数字验证码。通过结合一些图像处理技巧,如灰度化、二值化和去噪,我们可以显著提高验证码识别的准确性。

  1. 环境准备

首先,您需要安装 Tesseract OCR 引擎和 Python 库。如果尚未安装,请按照以下步骤进行设置。

(1)安装 Tesseract OCR 引擎

Linux 系统:
更多内容访问ttocr.com或联系1436423940
sudo apt-get update
sudo apt-get install tesseract-ocr

macOS 系统:

brew install tesseract

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

(2)安装 Python 库

使用 pip 安装 pytesseract 和 Pillow 库:

pip install pytesseract pillow numpy opencv-python

pytesseract 用于将 Tesseract 引擎与 Python 集成。

Pillow 是一个图像处理库,用于加载和处理图像文件。

numpy 和 opencv-python 用于图像处理,提升验证码识别的效果。

  1. 代码实现

下面是实现验证码识别的 Python 代码。我们将使用 Pillow 进行图像加载,使用 OpenCV 进行图像预处理,然后使用 Tesseract OCR 来识别数字验证码。

(1)导入所需的库
import pytesseract
from PIL import Image
import cv2
import numpy as np

(2)配置 Tesseract 路径(Windows 系统)

在 Windows 系统中,如果 Tesseract 没有自动添加到 PATH 环境变量中,您需要手动指定 Tesseract 可执行文件的路径。

设置 Tesseract 可执行文件的路径

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

(3)图像预处理

我们将使用 OpenCV 进行一些图像预处理步骤,如将图像转换为灰度图、二值化图像以及去噪,帮助提高 OCR 识别的准确性。

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

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

# 使用二值化处理图像
_, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)

# 应用去噪(可选)
denoised = cv2.fastNlMeansDenoising(binary, None, 3, 7, 21)

return denoised

灰度化:通过将图像转换为灰度图像,我们减少了颜色信息的干扰,专注于形状和纹理。

二值化:通过将图像转换为黑白二值图像,我们使得字符更加清晰易识别。

去噪:通过去除图像中的噪点,使得字符边缘更加明显,从而提高识别准确性。

(4)识别验证码

使用 Tesseract OCR 来识别图像中的字符,并输出识别的结果。

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

# 转换为 PIL 图像对象,以便传递给 pytesseract
pil_image = Image.fromarray(processed_image)

# 使用 Tesseract 识别图像中的文本
text = pytesseract.image_to_string(pil_image, config='--psm 6')

return text

image_to_string 方法会从处理过的图像中提取文本,--psm 6 是 Tesseract 的页面分隔模式,它适用于有文本的图片。

(5)测试验证码识别
def main():
image_path = "captcha_image.png" # 替换为验证码图片的路径
result = recognize_captcha(image_path)
print("识别结果:", result)

if name == "main":
main()

  1. 进一步优化
    (1)自适应二值化

如果验证码的背景比较复杂,传统的二值化可能效果不好。这时可以使用自适应阈值来提高效果。

def adaptive_thresholding(image):
# 使用自适应阈值化算法来增强图像
return cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2)

此方法根据图像的局部特性动态调整每个像素的阈值,可以有效处理复杂背景。

(2)字符分割

如果验证码图像中的字符是相互连接的,OCR 可能无法正确识别。在这种情况下,我们可以先进行字符分割,将字符单独提取出来,然后逐个识别。

def split_characters(image):
# 轮廓查找与字符分割
contours, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

characters = []

for contour in contours:
    # 获取字符的边界框
    x, y, w, h = cv2.boundingRect(contour)
    character = image[y:y+h, x:x+w]
    characters.append(character)

return characters

此方法可以将图像中的字符分割开来,从而单独识别每个字符,减少字符间干扰。

posted @ 2025-09-19 17:57  ttocr、com  阅读(22)  评论(0)    收藏  举报