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

如何使用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)

关键逻辑解释:

  1. export_as_straight_boxes=True:这是核心!它会让doctr自动把检测到的倾斜文本框校正为水平状态,每个单词的坐标都会转换成校正后的水平位置,这样按x坐标排序就完全符合正常阅读顺序了。
  2. 排序blocks和lines:倾斜图像的文本块和行在原始检测结果里的顺序可能不是从上到下,所以必须按它们的顶部y坐标(geometry[0][1],也就是左上角的y值)排序,确保我们从上到下、从左到右拼接文本。
  3. 正确拼接行和页:之前你用空格连接所有行,导致页面排版混乱,改成用换行符连接行和页,就能还原正常的文本段落结构。

调整后,不用先去斜图像,直接跑代码就能得到规整的文本,效果和你先去斜再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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:44:34