如何使用doctr直接处理倾斜图像并输出排版规整的OCR文本?
如何使用doctr直接处理倾斜图像并输出排版规整的OCR文本?
我太懂你这种糟心的感觉了——明明OCR把每个字都认对了,结果因为图像倾斜,按原始坐标拼接出来的文本完全读不通,像乱码一样!其实你不用额外找工具先去斜,doctr本身就有能力直接搞定这个问题,核心就是把参数用对、排序逻辑调整好。
先说说你之前代码里的问题:虽然你开启了export_as_straight_boxes=True和detect_orientation=True这两个关键参数,但你没有对页面里的文本块(blocks)和行(lines)按垂直位置排序,倾斜图像里的blocks和lines默认顺序可能不是从上到下的,导致拼接顺序混乱;另外,你处理单词的排序逻辑是对的,但前提是得先把blocks和lines的层级顺序理清楚。
下面是调整后的代码,我给你标注了关键修改点:
def read_pdf(file_path): model = ocr_predictor( det_arch='db_resnet50', reco_arch='crnn_vgg16_bn', pretrained=True, export_as_straight_boxes=True, # 自动将倾斜文本框校正为水平状态 detect_orientation=True # 检测页面整体方向并做全局校正 ) doc = DocumentFile.from_pdf(file_path) result = model(doc) full_text = [] for page in result.pages: page_text = [] # 第一步:按文本块的顶部y坐标排序,确保从上到下处理 for block in sorted(page.blocks, key=lambda b: b.geometry[0][1]): # 第二步:对每个块内的行也按顶部y坐标排序 for line in sorted(block.lines, key=lambda l: l.geometry[0][1]): # 第三步:行内单词按校正后的x坐标排序,保证从左到右的阅读顺序 line_text = ' '.join([word.value for word in sorted(line.words, key=lambda w: w.geometry[0][0])]) page_text.append(line_text) # 用换行符连接行,还原正常段落排版 full_text.append('\n'.join(page_text)) return '\n'.join(full_text)
关键逻辑解释:
export_as_straight_boxes=True:这是核心!它会让doctr自动把检测到的倾斜文本框校正为水平状态,每个单词的坐标都会转换成校正后的水平位置,这样按x坐标排序就完全符合正常阅读顺序了。- 排序blocks和lines:倾斜图像的文本块和行在原始检测结果里的顺序可能不是从上到下,所以必须按它们的顶部y坐标(
geometry[0][1],也就是左上角的y值)排序,确保我们从上到下、从左到右拼接文本。 - 正确拼接行和页:之前你用空格连接所有行,导致页面排版混乱,改成用换行符连接行和页,就能还原正常的文本段落结构。
调整后,不用先去斜图像,直接跑代码就能得到规整的文本,效果和你先去斜再OCR完全一样:
World War ml or the Second World War (1 September 1939 - 2 September 1945) was a global conflict between two coalitions: the Allies and the Axis powers. Nearly all the world's countries--including all the great powers--participated, with many investing all available economic, industrial, and scientific capabilities in pursuit of total war,
而不是之前那种混乱的输出:
World War ml or the was a global conflict Second World War (1 the world's between two coalitions: September 1939 - 2
备注:内容来源于stack exchange,提问作者Q_Q_
相关产品推荐
相关产品推荐

