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

Python使用pytesseract提取黑底白字识别准确率低如何解决

pytesseract黑底白字数字识别准确率优化方案

先修复现有代码的显性错误

现有代码存在3个直接影响识别结果的低级问题,优先修复:

  • cv2.imread() 仅支持传入文件路径字符串,代码中传入已转换的numpy数组属于无效冗余代码,直接删除即可
  • 字符白名单配置中等号后多余的空格会导致规则不生效,这是数字0被误识别为@/a/e的核心原因之一,白名单参数不要加多余空格
  • Tesseract官方训练集全部基于白底黑字样本训练,直接传入黑底白字图像会大幅降低识别准确率,必须做反色处理

预处理流程优化

替换原有预处理逻辑,适配工业数字/黑底白字场景:

  • 滤波保留字符边缘的前提下去掉背景噪点
  • 转灰度后做反色操作,转换为Tesseract适配的白底黑字格式
  • 用OTSU自动阈值替代手动写死的240阈值,避免画面亮度不均导致的字符残缺
  • 增加小核形态学操作,去除画面细碎亮斑噪点

Tesseract参数调优

  • PSM模式从4改为11(稀疏文本模式),适配图中分散排布的多段文本
  • 白名单补全需要识别的大写英文字符(图中存在NIT、LUX等前缀),严格限制识别范围减少误判
  • 保持OEM 3模式(默认+LSTM神经网络识别)即可

修正后可直接运行的代码

import numpy as np
import cv2
import pytesseract
from PIL import Image

def preprocess(im):
    # 双边滤波去噪,不破坏字符边缘
    im = cv2.bilateralFilter(im, 5, 55, 60)
    # 转灰度图
    im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
    # 反色:黑底白字转白底黑字,适配Tesseract训练集
    im = cv2.bitwise_not(im)
    # OTSU自动计算最优二值化阈值
    _, im = cv2.threshold(im, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    # 2x2核做开运算,去除细碎背景噪点
    kernel = np.ones((2,2), np.uint8)
    im = cv2.morphologyEx(im, cv2.MORPH_OPEN, kernel)
    return im

# 修正读图逻辑
img = Image.open("Image.png")
img_cv = cv2.cvtColor(np.array(img), cv2.COLOR_RGBA2BGR)
processed_im = preprocess(img_cv)

# 修正配置参数,去掉多余空格,调整PSM模式,补全白名单字符
custom_config = r"--oem 3 --psm 11 -c tessedit_char_whitelist='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ. '"
text = pytesseract.image_to_string(processed_im, lang='eng', config=custom_config)
print(text.strip())

进阶优化方向

如果上述调整后仍有个别识别误差,可尝试以下方案:

  • 替换默认英文训练集,使用工业数字/数码管专用Tesseract训练集,对这类规整数字字体的识别准确率远高于通用训练集
  • 若图像中各文本块位置固定,可按坐标裁剪出每个单独的数值区域分别识别,避免不同区域字符互相干扰
  • 若原图像字符尺寸过小,可使用双线性插值将图像放大2-3倍,让字符高度保持在30-40像素区间,符合Tesseract的最优识别尺寸要求

内容的提问来源于stack exchange,提问作者thethe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:30:44