在大多数图像处理库中:
顺时针旋转 = 负角度
# OpenCV/PIL 的旋转约定
cv2.rotate(image, cv2.ROTATE_90_COUNTERCLOCKWISE) # 逆时针90° = +90°
cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE) # 顺时针90° = -90° = 270°
在 MinerU 的方向分类模型中,输出的旋转角度表示的是需要旋转多少度来恢复正常方向,具体含义如下:
0° → 图片已经是正常方向,无需旋转
ocr_tools/universal_doc_parser/models/adapters/mineru_adapter.py但是,MinerU 的方向分类模型 返回的是:
0° → 正常方向
90° → 需要顺时针旋转90°才能恢复(图片当前是逆时针旋转了90°)
180° → 需要旋转180°才能恢复(倒置)
270° → 需要顺时针旋转270°才能恢复(图片当前是顺时针旋转了90°)
关键理解:模型返回的是"需要旋转多少度来恢复正常",而不是"图片当前旋转了多少度"。
rotated_table, table_angle = self.preprocessor.process(cropped_table)会返回恢复正常方向的图片和角度值
作用: PDF坐标系与图像坐标系的转换
核心函数:
pdf_rotation_to_image_rotation(): PDF旋转角度转换为图片旋转角度transform_bbox_for_rotation_fitz(): fitz引擎的完整几何坐标变换transform_bbox_for_rotation_pypdfium2(): pypdfium2引擎的坐标值交换坐标系说明:
旋转定义(重要):
旋转转换映射: | PDF Rotation (顺时针) | 图片 Rotation (逆时针) | |---------------------|---------------------| | 0° | 0° | | 90° | 270° | | 180° | 180° | | 270° | 90° |
关键区别: | 特性 | fitz | pypdfium2 | |------|------|-----------| | 输入坐标系 | PDF原始坐标系 | 已旋转的坐标系(但bbox顺序错误) | | 变换类型 | 几何空间变换 | 坐标值交换(修正min/max) | | 复杂度 | 高(涉及旋转公式) | 低(只是交换) |