求tesserocr中与pytesseract.image_to_data等效的函数
用tesserocr替代pytesseract.image_to_data实现结构化文本位置提取
tesserocr没有直接和pytesseract.image_to_data完全同名的函数,但可以通过PyTessBaseAPI结合识别迭代器(Recognition Iteration Level)实现完全等效的功能——提取带层级(块、段落、行、词)编号、文本内容及位置的结构化数据,且速度远快于pytesseract。
核心实现思路
利用tesserocr的RIL(识别层级枚举)对应不同文本结构层级:BLOCK(页面块)、PARA(段落)、TEXTLINE(行)、WORD(词),通过迭代器遍历每个层级的文本单元,同时提取对应层级的编号和位置坐标。
代码示例
import tesserocr from PIL import Image def extract_structured_text(image_path): with tesserocr.PyTessBaseAPI() as api: img = Image.open(image_path) api.SetImage(img) api.Recognize() iterator = api.GetIterator() target_level = tesserocr.RIL.WORD # 从词级开始遍历,覆盖最细粒度 result = [] while iterator.Next(target_level): # 获取各层级的编号(默认从0开始,+1对齐pytesseract的计数逻辑) block_idx = iterator.GetIntAttribute(tesserocr.RIL.BLOCK, tesserocr.ILF_TEXTLINE_INDEX, 0) + 1 para_idx = iterator.GetIntAttribute(tesserocr.RIL.PARA, tesserocr.ILF_TEXTLINE_INDEX, 0) + 1 line_idx = iterator.GetIntAttribute(tesserocr.RIL.TEXTLINE, tesserocr.ILF_TEXTLINE_INDEX, 0) + 1 word_idx = iterator.GetIntAttribute(tesserocr.RIL.WORD, tesserocr.ILF_TEXTLINE_INDEX, 0) + 1 # 获取文本内容和位置坐标 text = iterator.GetUTF8Text(target_level).strip() bbox = iterator.BoundingBox(target_level) # 返回(x1, y1, x2, y2) result.append({ 'block_num': block_idx, 'para_num': para_idx, 'line_num': line_idx, 'word_num': word_idx, 'text': text, 'left': bbox[0], 'top': bbox[1], 'width': bbox[2] - bbox[0], 'height': bbox[3] - bbox[1] }) return result # 调用示例 structured_data = extract_structured_text('your_image.png') for item in structured_data: print(f"块{item['block_num']} 段{item['para_num']} 行{item['line_num']} 词{item['word_num']}: {item['text']} 位置({item['left']},{item['top']})")
关键说明
- 层级对应:
RIL的层级完全匹配pytesseract.image_to_data返回的block_num、par_num、line_num、word_num字段。 - 位置转换:
BoundingBox返回的(x1,y1,x2,y2)可以直接转换为pytesseract中的left、top、width、height。 - 性能优势:tesserocr直接调用Tesseract的C++核心API,避免了pytesseract的跨进程调用开销,速度提升明显。
内容的提问来源于stack exchange,提问作者Daniel Wyatt
相关产品推荐
相关产品推荐

