pytesseract无法识别指定数字,错误输出“ones”该如何排查解决?
问题原因
识别错误的核心是Tesseract默认未限制字符识别范围,你裁剪的数字字体中,1易被识别为字母o/n,5易被识别为字母s,因此输出了错误结果ones。
解决方法
第一步:增加识别字符限制,调整识别模式
调用image_to_string时传入config参数,限制仅识别数字,同时指定单文本块识别模式适配裁剪后的小尺寸数字图,修改后的识别代码如下:Check_Price = pytesseract.image_to_string(Image.open('Price.png'), lang='eng', config='--psm 8 --oem 3 -c tessedit_char_whitelist=0123456789')参数说明:
--psm 8表示将输入图像视为单个单词,适配短数字识别场景tessedit_char_whitelist=0123456789直接限制Tesseract仅返回数字结果,彻底排除字母识别干扰
第二步(识别率仍低时使用):增加图像预处理步骤
裁剪后的图像如果尺寸过小、对比度低,也会影响识别效果,可以增加灰度转换、二值化、放大等预处理操作:import cv2 import numpy as np # 读取裁剪后的图像 img = cv2.imread('Price.png') # 转换为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化处理,增强数字和背景的对比度 thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] # 放大2倍,适配Tesseract的识别精度要求 thresh = cv2.resize(thresh, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) # 传入处理后的图像进行识别 Check_Price = pytesseract.image_to_string(thresh, lang='eng', config='--psm 8 --oem 3 -c tessedit_char_whitelist=0123456789')第三步:调整裁剪范围
确认当前裁剪参数是否完整保留了数字的全部边缘,可适当将left调小2-3像素、right调大2-3像素,避免数字边缘被裁剪导致识别出错。
以上步骤按顺序尝试即可,绝大多数场景仅需第一步就能解决识别错误问题。
内容的提问来源于stack exchange,提问作者BreadBoy
相关产品推荐
相关产品推荐

