使用 Python 和 Tesseract 实现英文数字验证码识别(进阶优化版)
在本教程中,我们将详细探讨如何使用 Python 和 Tesseract OCR 引擎识别英文数字验证码。验证码识别不仅仅依赖于 Tesseract 本身,还涉及一些图像预处理方法和识别技巧,以提升识别率,尤其是在处理复杂或扭曲的验证码时。
- 环境准备
首先,您需要安装必要的工具和库。
(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 用于图像处理和预处理。
- 图像预处理方法
验证码的图像质量对 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,适合于常规的单一文本行。
- 完整示例代码
将所有的预处理方法和识别过程整合在一起,得到一个完整的验证码识别程序。
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 的官方文档。
浙公网安备 33010602011771号