You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Pytesseract无法识别图像表格第二列文本,求解决方案

解决Pytesseract无法识别表格第二列文本的思路

我看你遇到的问题是表格第二列识别失败,第一、三列却正常,试过去灰背景和膨胀都没效果。结合这类场景的常见问题,给你几个实用的解决方向:

  • 调整二值化策略,用自适应阈值替代固定阈值
    你之前用的128固定阈值可能不适合第二列的浅灰背景+浅色文字的低对比度情况。试试用OpenCV的自适应阈值,它能根据局部区域的明暗自动调整阈值,更适合这种不均匀的背景:

    import cv2
    import numpy as np
    from PIL import Image
    import pytesseract
    
    # 裁剪后的第二列图像a(你的box_2裁剪结果)
    cv_img = cv2.cvtColor(np.array(a), cv2.COLOR_RGB2BGR)
    gray = cv2.cvtColor(cv_img, cv2.COLOR_BGR2GRAY)
    # 自适应阈值处理,反转后变成黑字白底
    thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
    pil_img = Image.fromarray(thresh)
    print(pytesseract.image_to_string(pil_img))
    
  • 先反转图像颜色
    第二列的文字大概率是浅色(比如灰色)、背景是稍深一点的灰色,这种情况下直接二值化很难区分。反转图像后变成深色文字+浅色背景,更符合Tesseract的识别偏好:

    gray = a.convert('L')
    # 反转像素值
    inverted_img = Image.eval(gray, lambda x: 255 - x)
    # 再做二值化(可选,根据效果调整阈值)
    bw_img = inverted_img.point(lambda x: 0 if x < 128 else 255, '1')
    print(pytesseract.image_to_string(bw_img))
    
  • 给Tesseract加针对性配置
    如果第二列是数字或特定格式的文本,可以指定字符白名单和识别模式,减少识别干扰:

    # 假设第二列是数字和小数点,--psm 6表示假设输入是单行文本
    config = '--psm 6 -c tessedit_char_whitelist=0123456789.'
    print(pytesseract.image_to_string(processed_img, config=config))
    
  • 先增强图像对比度
    用PIL的ImageEnhance提升对比度,让文字和背景的差异更明显,再做后续处理:

    from PIL import ImageEnhance
    
    enhancer = ImageEnhance.Contrast(a)
    # 提升2倍对比度,可根据实际效果调整数值
    enhanced_img = enhancer.enhance(2.0)
    gray_enhanced = enhanced_img.convert('L')
    # 调整二值化阈值,这里用180替代128,适配增强后的图像
    bw_img = gray_enhanced.point(lambda x: 0 if x < 180 else 255, '1')
    print(pytesseract.image_to_string(bw_img))
    

之前的方法无效,大概率是因为固定阈值没适配第二列的低对比度,膨胀操作如果参数不对还可能让文字边缘模糊,反而降低识别率。可以先试试反转颜色+自适应阈值的组合,这在这类浅背景文字的场景里效果通常不错。

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

火山引擎 最新活动