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

解决任意角度旋转PDF的docTR文本识别校正问题

倾斜PDF文本校正与docTR识别优化方案

倾斜的扫描件(包括任意角度非90/180/270度旋转)会直接降低docTR的OCR识别精度,核心解决思路是先对PDF每页图像做倾斜校正,再输入OCR模型。以下是基于OpenCV的可靠实现方案:

实现步骤

  1. 将PDF逐页转换为图像
  2. 对单页图像做灰度化、二值化预处理,突出文本/表格区域
  3. 通过轮廓分析检测文本的倾斜角度
  4. 旋转图像校正至水平
  5. 将校正后的图像输入docTR完成OCR

完整代码

import cv2
import numpy as np
from doctr.io import DocumentFile
from doctr.models import ocr_predictor

def correct_skew(image, delta=1, angle_limit=5):
    """校正图像倾斜角度,支持任意小角度倾斜与180度旋转"""
    # 转换为灰度图
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # 自适应二值化,适配不同光照的扫描件
    thresh = cv2.adaptiveThreshold(
        gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2
    )
    # 提取图像中最大的5个轮廓(优先取文本/表格区域)
    contours, _ = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
    contours = sorted(contours, key=cv2.contourArea, reverse=True)[:5]

    if not contours:
        return image

    # 计算轮廓的平均倾斜角度
    total_angle = 0
    for cnt in contours:
        rect = cv2.minAreaRect(cnt)
        rect_angle = rect[2]
        # 调整角度范围(minAreaRect返回的角度是-90到0,转换为0到90)
        if rect_angle < -45:
            rect_angle += 90
        total_angle += rect_angle

    avg_angle = total_angle / len(contours)

    # 处理180度旋转的特殊情况
    if abs(avg_angle - 180) < 10:
        rotate_angle = 180
    # 过滤微小角度波动,避免不必要的旋转
    elif abs(avg_angle) > angle_limit:
        rotate_angle = avg_angle
    else:
        rotate_angle = 0

    # 执行图像旋转
    h, w = image.shape[:2]
    center = (w // 2, h // 2)
    rotation_matrix = cv2.getRotationMatrix2D(center, rotate_angle, 1.0)
    corrected_image = cv2.warpAffine(
        image, rotation_matrix, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE
    )
    return corrected_image

# 初始化docTR OCR模型
ocr = ocr_predictor(pretrained=True)

# 加载PDF并逐页校正
pdf_pages = DocumentFile.from_pdf("my/path.pdf")
corrected_pages = []

for page in pdf_pages:
    # docTR返回的是RGB格式,转换为OpenCV支持的BGR格式
    page_bgr = cv2.cvtColor(page, cv2.COLOR_RGB2BGR)
    # 执行倾斜校正
    corrected_bgr = correct_skew(page_bgr)
    # 转回RGB格式供docTR处理
    corrected_rgb = cv2.cvtColor(corrected_bgr, cv2.COLOR_BGR2RGB)
    corrected_pages.append(corrected_rgb)

# 运行OCR并可视化结果
result = ocr(corrected_pages)
result.show(corrected_pages)

参数调整说明

  • angle_limit:默认5度,若你的文档倾斜角度普遍更大,可适当调高(如10度),避免过滤有效倾斜角度
  • 自适应阈值的参数(11,2):可根据扫描件的清晰度调整,数值越大对光照变化的鲁棒性越强

适用场景

  • 任意小角度倾斜的扫描件PDF
  • 包含表格、纯文本的倾斜文档
  • 180度倒置的扫描件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 00:53:21