如何使用Python在OpenCV中执行图像旋转?
OpenCV 是一款开源计算机视觉库,其中包含众多图像处理算法,广泛应用于计算机视觉领域。在处理图像时,常常需要执行旋转操作。本文将介绍如何使用 Python 和 OpenCV 旋转图像。
1. 基本的图像旋转
在 OpenCV 中,可以使用函数 cv2.getRotationMatrix2D 来获得一个旋转矩阵,再使用函数 cv2.warpAffine 对图像进行旋转操作。
下面给出一个示例,顺时针旋转 45 度:
import cv2
import numpy as np
img = cv2.imread("test.jpg")
rows, cols = img.shape[:2]
M = cv2.getRotationMatrix2D((cols/2,rows/2),45,1)
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow("dst", dst)
cv2.waitKey(0)
解释一下上述代码:
- 首先,我们使用 cv2.imread 函数读取图片。该函数会将图片解码为一个 NumPy 数组。
- 获得图片的行数和列数。为了方便,可以使用 Python 的切片语法来获取图像的尺寸。注意,OpenCV 中的图像数组是以行列格式存储的。
- 使用 cv2.getRotationMatrix2D 函数获得一个旋转矩阵 M。该函数接受三个参数:旋转中心点坐标、旋转角度(顺时针为正)、缩放比例。
- 使用 cv2.warpAffine 函数对图像进行旋转操作。该函数接受三个参数:源图像、旋转矩阵 M、输出图像大小。在这里,我们将输出图像的大小设为源图像的大小。
2. 已知旋转角度和旋转中心坐标的图像旋转
在上述示例中,我们旋转的中心是图片的中心,旋转角度为 45 度。但有时候,我们需要指定旋转中心的坐标和旋转的角度。
下面给出一个例子,将图片绕着左上角旋转 30 度:
import cv2
import numpy as np
img = cv2.imread("test.jpg")
rows, cols = img.shape[:2]
# 定义旋转中心和旋转角度
M = cv2.getRotationMatrix2D((0, 0), 30, 1)
# 计算旋转后的新坐标
cos = np.abs(M[0, 0])
sin = np.abs(M[0, 1])
new_w = int((rows * sin) + (cols * cos))
new_h = int((rows * cos) + (cols * sin))
M[0, 2] += (new_w / 2) - cols
M[1, 2] += (new_h / 2) - rows
# 执行旋转操作
dst = cv2.warpAffine(img, M, (new_w, new_h))
cv2.imshow("dst", dst)
cv2.waitKey(0)
在上述代码中,我们首先定义旋转中心坐标为 (0, 0),旋转角度为 30 度,然后计算旋转后图片的新坐标。最后,使用 cv2.warpAffine 函数对图像进行旋转操作。
3. 逆时针旋转 90 度
如果需要对图像进行逆时针方向的旋转操作,可以通过将旋转中心坐标改为图片的左上角,并将旋转角度改为 -90 度来实现。
下面给出一个示例:
import cv2
import numpy as np
img = cv2.imread("test.jpg")
# 获取图片的行数和列数
rows, cols = img.shape[:2]
# 逆时针旋转90度
M = cv2.getRotationMatrix2D((0,0), -90, 1)
# 计算旋转后的新坐标
new_w = rows
new_h = cols
M[0, 2] += new_w
M[1, 2] = new_h
# 执行旋转操作
dst = cv2.warpAffine(img, M, (new_w, new_h))
cv2.imshow("dst", dst)
cv2.waitKey(0)
在上述代码中,我们首先获取图片的行数和列数,然后将旋转中心坐标设为图片的左上角,旋转角度为 -90 度,计算旋转后的新坐标。最后,使用 cv2.warpAffine 函数对图像进行旋转操作。
结论
本文介绍了如何使用 Python 和 OpenCV 对图像进行旋转操作。我们可以指定旋转中心的坐标和旋转角度,并计算出旋转后的新坐标,最后使用 cv2.warpAffine 函数对图像进行旋转操作。希望这篇文章能帮助大家更好地理解图像旋转的实现方式。