如何用Python从图像中提取分组文本?基于pytesseract实现词组分块
解决Python OCR提取分组文本块的方案
你需要的分组能力是Tesseract原生内置的,不需要自己实现bounding box聚类逻辑,用pytesseract.image_to_data接口即可直接输出按文本块分组的结果。
实现逻辑
image_to_data接口会返回包含文本层级、坐标、置信度、内容的完整结构化数据,内置层级规则如下:
- level=2 对应独立文本块,Tesseract底层会自动根据文本间距、排版识别出分散的独立内容块
- level=5 对应单个单词,同一个
block_num下的所有单词默认属于同一个文本块
你只需要按block_num分组收集单词,即可直接得到需要的嵌套列表结构。
代码实现
import pytesseract from pytesseract import Output from PIL import Image def get_grouped_text(img_path, conf_threshold=60): img = Image.open(img_path) # 可根据场景调整psm参数,分散独立文本块场景推荐用--psm 11(稀疏文本模式) ocr_data = pytesseract.image_to_data( img, output_type=Output.DICT, lang='eng', config='--psm 11' ) grouped_res = [] current_block = None current_words = [] for i in range(len(ocr_data['text'])): text = ocr_data['text'][i].strip() # 过滤空内容和低置信度结果,阈值可自行调整 if not text or ocr_data['conf'][i] < conf_threshold: continue block_num = ocr_data['block_num'][i] # 切换文本块时存入结果 if block_num != current_block: if current_words: grouped_res.append(current_words) current_block = block_num current_words = [] current_words.append(text) # 存入最后一个文本块的内容 if current_words: grouped_res.append(current_words) return grouped_res
调用该函数即可直接返回你要求的嵌套列表格式,比如示例场景下返回结果为[["Hello", "World"], ["Foo", "bar"]]。
内容的提问来源于stack exchange,提问作者Tom Atix
相关产品推荐
相关产品推荐

