1. 项目概述
在计算机视觉和图像标注领域,Labelme是一款广受欢迎的开源图像标注工具。但在实际项目中,我们经常需要对已标注的图像进行旋转等几何变换操作。这个Python脚本工具就是为了解决一个常见痛点:如何保持图像和标注框的同步旋转。
我曾在多个图像处理项目中遇到过这样的需求:当原始图像需要旋转时,手动重新标注不仅耗时耗力,而且难以保证标注精度。这个工具通过自动化处理,可以同时旋转图像和对应的Labelme标注文件,确保两者始终保持一致。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心原理与技术实现
2.1 坐标变换的数学基础
图像旋转的核心是坐标变换。在标准数学坐标系中,点(x,y)逆时针旋转θ角度后的新坐标为:
code复制x' = x*cosθ - y*sinθ
y' = x*sinθ + y*cosθ
但在图像处理中,坐标系的原点通常在左上角,y轴方向向下。因此需要调整变换公式:
code复制x' = x*cosθ + y*sinθ
y' = -x*sinθ + y*cosθ
脚本中的关键变换代码正是基于这个原理:
python复制new_dx = dx * cos_a + dy * sin_a
new_dy = -dx * sin_a + dy * cos_a
2.2 实现步骤详解
-
图像读取与预处理:
- 使用Pillow库的
Image.open读取图像 - 通过
ImageOps.exif_transpose自动修正图像方向(处理手机拍摄照片的EXIF方向问题)
- 使用Pillow库的
-
图像旋转处理:
- 调用
img.rotate方法进行旋转 expand=True参数确保画布自动扩大以适应旋转后的图像- 使用BICUBIC插值算法保持图像质量
- 调用
-
标注点坐标变换:
- 将每个标注点平移到图像中心坐标系
- 应用旋转变换矩阵
- 将点平移回新画布的坐标系
-
元数据更新:
- 更新JSON中的图像宽高信息
- 清空可能存在的imageData字段(避免Base64数据过大)
3. 使用指南与参数说明
3.1 两种运行方式
- 直接修改脚本运行:
在main()函数中修改以下默
