基于OpenCV与pytesseract提取图片数字及位置的问题求助
数字识别及位置提取解决方案
问题描述
我需要从附图中提取数字及其相对位置,目前使用Python的pytesseract工具,但最初无识别结果;尝试用OpenCV进行预处理(代码如下)后,仍无法识别单个数字,寻求相关配置或预处理方案的帮助。
image = cv2.imread("plano5.png") gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)[1] text = pytesseract.image_to_string(thresh,config='--psm 11 --oem 3 -c tessedit_char_whitelist=0123456789')
优化方案
一、图像预处理优化
针对单个数字识别,预处理需强化数字轮廓、消除干扰,可尝试以下步骤:
- 降噪处理:用高斯模糊或中值滤波去除图像噪点,避免噪点被误判为字符
- 反转阈值:如果数字是浅色、背景深色,反转图像为黑字白底,匹配Tesseract默认识别逻辑
- 形态学增强:用闭运算(先膨胀后腐蚀)填补数字内部的断裂,强化轮廓
- ROI裁剪:如果数字集中在特定区域,提前裁剪图像减少无关区域干扰
二、Tesseract配置调整
原配置的--psm 11适用于稀疏文本场景,单个数字识别需调整PSM模式:
- 改用
--psm 10:强制识别单个字符,匹配你的需求 - 保留
oem 3(混合识别模式)或尝试oem 1(纯LSTM模式) - 用
image_to_data代替image_to_string,直接获取数字的坐标位置
优化后完整代码
import cv2 import pytesseract # 读取图像 image = cv2.imread("plano5.png") gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 1. 降噪:高斯模糊去除噪点 blurred = cv2.GaussianBlur(gray, (3, 3), 0) # 2. 反转阈值:将浅色数字转为黑字白底(若原本是黑字白底可省略) thresh = cv2.threshold(blurred, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] # 3. 形态学闭运算:填补数字断裂,强化轮廓 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2)) processed_img = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel) # Tesseract配置:单个字符识别模式+数字白名单 custom_config = r'--psm 10 --oem 3 -c tessedit_char_whitelist=0123456789' # 提取数字及位置信息 result_data = pytesseract.image_to_data(processed_img, config=custom_config, output_type=pytesseract.Output.DICT) # 过滤低置信度结果,输出有效数字和位置 total_boxes = len(result_data['text']) for idx in range(total_boxes): # 置信度>60的结果更可靠,可根据实际情况调整阈值 if int(result_data['conf'][idx]) > 60: digit = result_data['text'][idx] x, y, width, height = result_data['left'][idx], result_data['top'][idx], result_data['width'][idx], result_data['height'][idx] print(f"识别数字: {digit}, 位置坐标: (x={x}, y={y}), 尺寸: 宽{width}, 高{height}")
额外提示
- 若数字较大,可调整形态学核的大小(如
(3,3)) - 若图像存在倾斜,可先添加旋转矫正步骤
- 测试时可将
processed_img保存为本地文件,查看预处理效果后再调整参数
内容的提问来源于stack exchange,提问作者Willy
相关产品推荐
相关产品推荐

