如何通过OCR识别电子秤数字?已生成掩码图但无法提取数字
电子秤数字提取解决方案
问题分析
当前代码生成的掩码图像已成功分离数字区域,但后续过度膨胀的形态学操作易导致数字变形,加上Tesseract配置不够精准,最终无法正确识别数字。
改进方案
1. 优化图像预处理
针对掩码图像清理噪声、增强数字轮廓,确保数字边缘清晰无粘连;
2. 调整Tesseract配置
使用适配单行数字的页面分割模式,同时限定识别字符范围,提升识别精度。
完整代码实现
import cv2 import numpy as np import pytesseract # 加载已生成的掩码图像(灰度模式读取) msk = cv2.imread("/Users/ahx/Desktop/msk.png", 0) # 预处理:去除小噪声,增强数字连贯性 # 开运算(先腐蚀再膨胀)清除小斑点噪声 kernel_open = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2)) clean_msk = cv2.morphologyEx(msk, cv2.MORPH_OPEN, kernel_open, iterations=1) # 适度膨胀,让数字笔画更连贯 kernel_dilate = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) dilated_msk = cv2.dilate(clean_msk, kernel_dilate, iterations=1) # 反转图像,转为白色背景黑色文字(符合Tesseract识别习惯) processed_img = 255 - dilated_msk # 裁剪数字区域:通过轮廓定位去除多余背景 contours, _ = cv2.findContours(dilated_msk, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) if contours: max_contour = max(contours, key=cv2.contourArea) x, y, w, h = cv2.boundingRect(max_contour) # 扩大裁剪范围,避免截断数字边缘 x = max(0, x - 5) y = max(0, y - 5) w = min(processed_img.shape[1], w + 10) h = min(processed_img.shape[0], h + 10) processed_img = processed_img[y:y+h, x:x+w] # 保存预处理后的图像用于调试 cv2.imwrite("/Users/ahx/Desktop/processed.png", processed_img) # Tesseract配置:指定仅识别数字和小数点,适配单行文本 custom_config = r'--oem 3 --psm 7 -c tessedit_char_whitelist=0123456789.' txt = pytesseract.image_to_string(processed_img, config=custom_config) # 清理识别结果,保留有效字符 result = ''.join([c for c in txt if c.isdigit() or c == '.']) print("识别结果:", result) # 显示预处理后的图像 cv2.imshow("Processed Image", processed_img) cv2.waitKey(0) cv2.destroyAllWindows()
关键改进点说明
- 预处理优化:开运算去除小噪声,适度膨胀避免数字笔画断裂,反转图像匹配Tesseract的识别偏好;
- 区域裁剪:通过轮廓定位提取数字区域,减少无关背景对OCR的干扰;
- Tesseract配置:
--oem 3:使用默认OCR引擎,兼容性更强;--psm 7:将图像视为单行文本,适配电子秤数字的布局;- 字符白名单限定仅识别数字和小数点,过滤无关字符。
内容的提问来源于stack exchange,提问作者Mansi Sathawane
相关产品推荐
相关产品推荐

