如何识别读取图片中的数字?pytesseract单数字识别失效及检测方案咨询
问题1 单字符(数字)图像识别优化技巧
你当前识别返回空结果的核心原因大概率是预处理后的二值图不符合Tesseract的默认识别规则:Tesseract要求输入为深色字符、浅色背景,如果你的二值图是亮数字、暗背景,首先要做颜色反转。其余优化技巧如下:
- 尺寸适配:将单数字ROI统一缩放至高度30~50像素区间,Tesseract对过大或过小的字符识别准确率会大幅下降。
- 边框填充:给字符周围增加10~15像素的同背景色边框,避免字符边缘贴到图像边界,Tesseract的分割算法对贴边字符的敏感度极低。
- 参数微调:除了你用的
--psm 10(单字符模式),也可以尝试--psm 8(单个词模式)、--psm 7(单行文本模式),部分喷涂、印刷字符场景下适配效果更好。 - 二值化优化:如果存在字符笔画断裂、粘连问题,替换全局固定阈值二值化为自适应二值化,保留完整字符笔画。
优化后的代码参考如下:
import cv2 import pytesseract # number_5为你预处理得到的二值图 # 1. 颜色反转(适配Tesseract黑字白底要求) inv_img = cv2.bitwise_not(number_5) # 2. 增加白色边框填充 pad_img = cv2.copyMakeBorder(inv_img, 10, 10, 10, 10, cv2.BORDER_CONSTANT, value=[255,255,255]) # 3. 缩放到适配高度 h, w = pad_img.shape[:2] resize_img = cv2.resize(pad_img, (int(w*(40/h)), 40), interpolation=cv2.INTER_CUBIC) # 识别 text = pytesseract.image_to_string(resize_img, lang='eng', config='--psm 8 --oem 3 -c tessedit_char_whitelist=0123456789')
问题2 支持返回数字 bounding box的检测方案
- 轻量场景(简单背景、数字少):直接用Tesseract自带的检测接口,
pytesseract.image_to_boxes()可直接返回所有识别到的字符的坐标框,无需额外接入模型。 - 复杂场景(背景干扰多、数字倾斜/密集):可选用以下成熟方案:
- CRAFT:轻量场景文本检测模型,对小字符、喷涂/印刷字符的检测效果优秀,可返回所有文本区域的坐标框,后续配合识别模型即可得到内容。
- PPOCR系列:开源端到端OCR套件,自带检测+识别能力,内置数字优化模型,对工业喷涂、手写等场景适配度高,开箱即用。
- YOLO系列微调:如果你的场景均为同类喷涂数字,仅需标注几十至上百张样本,微调YOLOv5/YOLOv8即可得到速度、精度都满足工业需求的检测模型。
内容的提问来源于stack exchange,提问作者Alexandre Tavares
相关产品推荐
相关产品推荐

