Python中使用pytesseract与OpenCV进行图像转文字时识别准确率低的解决方案求助
Python中使用pytesseract与OpenCV进行图像转文字时识别准确率低的解决方案求助
Hi Cristi, 我完全懂你现在的烦恼——直接用原始图片跑OCR很容易因为图像对比度不够、有噪声或者字符特征不明显,导致识别出一堆错误内容,就像你得到的结果里出现29212x这种明显不对的字符。结合你的场景,我给你几个针对性的优化方案,应该能大幅提升识别准确率:
一、先做好图像预处理(这是提升准确率的关键!)
Tesseract对输入图像的要求很高,干净的黑白二值图识别效果最好,所以先给图像做这几步处理:
- 转灰度图:彩色图像的色彩信息会干扰识别,先转成灰度图,减少计算量和不必要的干扰
- 二值化(阈值处理):把图像变成纯黑纯白的二值图,让字符和背景彻底分离。推荐用Otsu自动阈值,它能根据图像自动计算最合适的阈值,适合处理光照不均的情况;如果效果不好,也可以试试自适应阈值
- 去除噪声:用中值滤波消除图像中的小噪点,避免这些噪点被识别成多余的字符
二、调整Tesseract的识别参数
通过自定义参数限制识别范围和模式,能有效减少错误率:
- 指定字符白名单:你的图像里只有数字、
x、K、.这些字符,直接告诉Tesseract只识别这些字符,就能过滤掉其他可能的错误识别 - 设置合适的页面分割模式(PSM):你的内容是多行连续文本,用
--psm 6(假设输入是单一的均匀文本块)就很合适,避免Tesseract错误分割文本
优化后的完整代码
import pytesseract import cv2 # 加载图像 imagem = cv2.imread("imagem.png") # 预处理流程 # 转灰度图 gray_img = cv2.cvtColor(imagem, cv2.COLOR_BGR2GRAY) # Otsu自动阈值二值化(反转后字符为白色,背景为黑色,更符合Tesseract的识别习惯) binary_img = cv2.threshold(gray_img, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] # 中值滤波去除小噪声 clean_img = cv2.medianBlur(binary_img, 3) # 自定义Tesseract配置参数 # --oem 3:使用默认的OCR引擎模式 # --psm 6:假设输入是单一的均匀文本块 # tessedit_char_whitelist:只允许识别指定字符 custom_config = r'--oem 3 --psm 6 -c tessedit_char_whitelist=0123456789xK.' # 识别文本 texto = pytesseract.image_to_string(clean_img, config=custom_config) print(texto)
额外优化建议
如果上面的方法还达不到你的预期,可以试试这些:
- 缩放图像:如果原始图像的字符很小,用
cv2.resize(imagem, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)把图像放大2倍,让字符轮廓更清晰 - 调整阈值参数:如果Otsu阈值效果不好,可以换成普通阈值,手动调整阈值数值,比如
cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY_INV) - 更新Tesseract版本:确保你用的是最新版本的Tesseract,新版本的识别模型经过训练,准确率会更高
备注:内容来源于stack exchange,提问作者Cristi Garcia
相关产品推荐
相关产品推荐

