解决任意角度旋转PDF的docTR文本识别校正问题
倾斜PDF文本校正与docTR识别优化方案
倾斜的扫描件(包括任意角度非90/180/270度旋转)会直接降低docTR的OCR识别精度,核心解决思路是先对PDF每页图像做倾斜校正,再输入OCR模型。以下是基于OpenCV的可靠实现方案:
实现步骤
- 将PDF逐页转换为图像
- 对单页图像做灰度化、二值化预处理,突出文本/表格区域
- 通过轮廓分析检测文本的倾斜角度
- 旋转图像校正至水平
- 将校正后的图像输入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
相关产品推荐
相关产品推荐

