Prechádzať zdrojové kódy

feat: 添加旋转角度约定差异文档,明确图像处理与方向分类模型的旋转约定

zhch158_admin 5 dní pred
rodič
commit
7a2a36a5bb

+ 63 - 0
docs/ocr_tools/universal_doc_parser/PDF,图片,方向检测模型-旋转角度.md

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