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

如何让Pytesseract按表单框顺序返回文本以优化LLM实体提取?

解决Pytesseract表单OCR文本顺序错乱问题

一、调整Pytesseract参数优化识别顺序

你当前使用的--psm 12模式更适配稀疏文本场景,对表单这类结构化布局支持有限,可尝试以下参数调整:

  • 切换PSM模式:优先测试--psm 4(假设文本按列对齐,适配表单常见的标签-值两列布局)或--psm 6(将图像视为单一文本块,按自然阅读顺序输出)。示例代码:
text = pytesseract.image_to_string(image, lang='eng', config='--psm 4')
  • 基于坐标手动排序:如果参数调整后仍无法解决,可通过pytesseract.image_to_data()获取每个文本块的坐标信息,按位置重新排序。核心逻辑是按行(y坐标)分组,同一行内按x坐标从左到右排列,确保标签与对应值相邻:
import pandas as pd
# 获取带坐标的OCR结果
df = pd.DataFrame(pytesseract.image_to_data(image, output_type='data.frame'))
# 过滤有效文本行
df = df[df['text'].notna()]
# 按行(top值)和列(left值)排序
df = df.sort_values(['top', 'left'])
# 拼接成有序文本
ordered_text = ' '.join(df['text'].tolist())

二、通用替代方案

如果Pytesseract本身难以满足需求,可尝试以下思路:

  • 图片预处理:用OpenCV对扫描件做二值化、降噪处理,强化表单框线和文本对比度,帮助OCR更好识别布局:
import cv2
# 读取并转灰度图
image = cv2.imread('your_form.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 二值化处理(可根据实际情况调整阈值)
_, processed_image = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
# 传入Pytesseract识别
text = pytesseract.image_to_string(processed_image, lang='eng', config='--psm 4')
  • 使用布局感知型OCR模型:比如LayoutLM系列模型,它能同时利用文本内容和空间位置信息,直接提取表单中的键值对(标签-值对应关系),无需依赖OCR文本顺序。
  • 结合位置信息喂给LLM:将OCR输出的所有文本(含坐标)传入LLM,明确告知每个文本块的位置信息,让LLM基于位置判断标签与对应值的关联。比如把每个文本块格式设为[top:X, left:Y] 文本内容,再提示LLM:"根据以下带位置的文本,提取患者姓名、年龄等实体,注意标签(如Patient Name)和对应值的位置对应关系"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 11:15:59