使用OCR及pytesseract识别图片数字出错的解决咨询
问题描述
尝试识别下图(currentbid.png:
)中的数字,但识别结果总是出现字母或错误数字。比如图片实际是98.7M,识别结果却是19 9947 )M。已经试过用Tesseract做灰度转换、反转等处理,都没效果,推测是小数点影响了识别,但无法移除小数点或修改字体。想知道怎么解决这个问题,或者怎么训练模型?
当前使用的代码如下:
pyautogui.screenshot("bidpossible.png", region=(900, 310, 450, 60)) #bidpossible originalImage = cv2.imread('bidpossible.png') grayImage = cv2.cvtColor(originalImage, cv2.COLOR_BGR2GRAY) (_, blackAndWhiteImage) = cv2.threshold(grayImage, 127, 255, cv2.THRESH_BINARY_INV) custom_config = r'--psm 8' text = pytesseract.image_to_string(blackAndWhiteImage, config=custom_config) print('Extracted Text: ', text)
一、优化图像预处理
- 用自适应阈值替代固定阈值:固定阈值127无法适配图像局部明暗差异,改用自适应阈值能更精准分割字符与背景:
blackAndWhiteImage = cv2.adaptiveThreshold(grayImage, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) - 添加形态学操作去噪:通过闭运算消除小数点周围的干扰像素,让字符边缘更清晰:
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2)) blackAndWhiteImage = cv2.morphologyEx(blackAndWhiteImage, cv2.MORPH_CLOSE, kernel)
二、调整Tesseract识别配置
- 限定识别字符集:只允许识别数字、小数点和字母M,缩小识别范围,减少错误匹配:
custom_config = r'--psm 8 -c tessedit_char_whitelist=0123456789.M' - 切换PSM模式:
--psm 8是单字符识别模式,换成--psm 7(将图像视为单行文本)更适配当前数字加单位的格式:custom_config = r'--psm 7 -c tessedit_char_whitelist=0123456789.M'
三、训练自定义Tesseract模型(上述方法无效时)
- 准备训练样本:收集足够多同字体的数字、小数点图像,生成
.tif格式文件,并为每个样本创建.box标注文件(标注每个字符的位置和内容)。 - 生成训练数据集:使用Tesseract的
tesstrain.sh工具,将样本转换为.lstmf格式的训练文件。 - 微调模型:基于官方基础模型(如
eng.traineddata)进行训练,生成自定义的.traineddata模型文件。 - 调用自定义模型:在代码中指定使用自己训练的模型:
text = pytesseract.image_to_string(blackAndWhiteImage, lang='custom_model', config=custom_config)
内容的提问来源于stack exchange,提问作者philM
相关产品推荐
相关产品推荐

