Python中如何检测图片旋转问题

有的图片本来查看就是已经旋转 90、180、270 度的,如何将这些图片旋转为正常位置。

数码图片可以检测图片的 exif 信息进行相应的旋转角度使其转正。

但是有的图片没有 exif 信息,无法判断目前该图片是处于“什么旋转角度”。这样的图片我该怎么将其旋转到正确位置。


Python中如何检测图片旋转问题
8 回复

目前没有很好的方法,特定领域的图像可以做(比如文档图像可以做基线检测)

或者图像成份简单的话,可以用 object detection 去找概率最大(即图像内容最合理)的角度?


在Python里检测图片旋转,最直接的方法是用OpenCV的cv2.minAreaRect()配合cv2.boxPoints()来获取最小外接矩形,然后计算旋转角度。这里给个完整的例子:

import cv2
import numpy as np

def detect_rotation(image_path):
    # 读取图片并转为灰度图
    img = cv2.imread(image_path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 二值化处理
    _, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
    
    # 查找轮廓
    contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
    if not contours:
        return 0  # 没找到轮廓就返回0度
    
    # 取最大轮廓
    cnt = max(contours, key=cv2.contourArea)
    
    # 获取最小外接矩形
    rect = cv2.minAreaRect(cnt)
    angle = rect[2]  # 旋转角度
    
    # 调整角度范围到[-90, 0]
    if angle < -45:
        angle = 90 + angle
    
    return angle

# 使用示例
angle = detect_rotation('your_image.jpg')
print(f'检测到的旋转角度: {angle:.2f}度')

这个方法的原理是找到图片中物体的最小外接矩形,然后计算矩形的倾斜角度。对于文档扫描、OCR预处理这些场景特别有用。如果图片背景复杂,可能需要先做预处理(比如去噪、边缘检测)来提高准确性。

简单说就是找最小外接矩形算角度。

首先定义好什么是正确位置

这种只能上机器学习了吧

如#2 所说,某些图片你肉眼都不一定能分辨哪面是正确位置。

这个训练数据挺好弄的,搞个深度网络跑一下,不知道效果好不好。

原本是想用“旋转正确”的图片作为样本去训练神经网络,但是测试样本是“未知旋转角度”,看来只能对训练样本根据不同的旋转角度再细分类别了,训练到“倒立的蒲公英花”这种分类了。

我原本的意思是:除了 部分图片中的 exif 信息,读取一张普通的图片内容中,不知道是否有关于其“旋转角度的”内容?

回到顶部