You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:19:29