使用Python Tesseract OCR提取图片数字失败,求优化方案
提升Tesseract OCR数字识别准确率的方案
针对你遇到的数字识别为空或错误的问题,结合图片特征和现有代码,可从预处理优化、Tesseract参数调整、关键检查点三个方向改进:
一、优化图像预处理流程
现有预处理步骤存在冗余,且参数可能不匹配图片特征,可简化并调整:
方案1:基于PIL的精简预处理
from PIL import Image, ImageEnhance, ImageOps import pytesseract # 加载并裁剪图片(确认bbox坐标完全覆盖数字,无边缘裁切) screenshot = Image.open("screenshot2.png") bbox = (970, 640, 1045, 675) cropped_image = screenshot.crop(bbox) # 放大数字(关键:小尺寸数字放大后识别率显著提升) cropped_image = cropped_image.resize((cropped_image.width * 3, cropped_image.height * 3), Image.LANCZOS) # 增强对比度+转灰度 enhancer = ImageEnhance.Contrast(cropped_image) enhanced_image = enhancer.enhance(3.0) gray_image = enhanced_image.convert("L") # 阈值处理:确保数字为黑色、背景为白色(根据实际图片调整阈值) # 若数字是深色背景浅色字,反转后再阈值;反之直接阈值 thresholded_image = gray_image.point(lambda p: 0 if p < 130 else 255) # 保存处理后的图片用于验证 thresholded_image.save("processed_image.png")
方案2:用OpenCV做专业预处理(推荐)
OpenCV的自适应阈值和形态学操作能更好应对光照不均、噪声问题:
import cv2 import pytesseract # 加载并裁剪图片(OpenCV坐标格式:[y起始:y结束, x起始:x结束]) img = cv2.imread("screenshot2.png") cropped_img = img[640:675, 970:1045] # 放大数字 cropped_img = cv2.resize(cropped_img, None, fx=3, fy=3, interpolation=cv2.INTER_LANCZOS4) # 转灰度+自适应阈值处理 gray = cv2.cvtColor(cropped_img, cv2.COLOR_BGR2GRAY) thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) # 形态学闭运算去除细小噪声 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2)) processed_img = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel) cv2.imwrite("processed_opencv.png", processed_img)
二、调整Tesseract识别参数
现有--psm 13不适合少量数字的识别场景,改用以下配置:
# 针对单行数字的最优配置 text = pytesseract.image_to_string(processed_img, config="--psm 7 --oem 3 -c tessedit_char_whitelist=0123456789") # 提取数字 numbers = [int(num) for num in text.strip() if num.isdigit()] print(numbers)
参数说明:
--psm 7:将图像视为单行文本,匹配两个数字的布局--oem 3:混合使用传统引擎和LSTM引擎,兼顾兼容性和准确率tessedit_char_whitelist=0123456789:强制只识别数字,过滤干扰字符
三、关键检查点
- 验证裁剪区域:打开裁剪后的图片,确认数字完整无裁切,若坐标不准确,调整
bbox数值 - 更新Tesseract版本:旧版本对特殊字体支持差,确保安装最新版(v5.x以上)
- 特殊字体处理:若数字是艺术字体/游戏字体,可收集该字体的数字样本,用Tesseract训练工具生成自定义语言包,大幅提升识别率
内容的提问来源于stack exchange,提问作者felix st-aubin
相关产品推荐
相关产品推荐

