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 信息,读取一张普通的图片内容中,不知道是否有关于其“旋转角度的”内容?

