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




