如何在OpenCV Python中旋转图像?
在图像处理中,常常需要对图像进行旋转操作,比如将横屏图片旋转成竖屏状态,或者将斜着的文字图片调整为正常状态等。在OpenCV Python中,可以通过简单的操作实现图像的旋转功能。
下面介绍几种实现图像旋转的方式。
1. 使用cv2.getRotationMatrix2D()函数
cv2.getRotationMatrix2D(center, angle, scale)函数可以获得一个2×3的旋转矩阵,其中center表示旋转中心点的坐标,angle表示旋转的角度,scale表示缩放比例。
import cv2
img = cv2.imread('img.jpg', 1)
(h, w) = img.shape[:2] # 获取图像的宽和高
# 定义旋转中心坐标
center = (w / 2, h / 2)
# 定义旋转角度
angle = 30
# 定义缩放比例
scale = 1
# 获得旋转矩阵
M = cv2.getRotationMatrix2D(center, angle, scale)
# 进行旋转操作
result = cv2.warpAffine(img, M, (w, h))
# 显示旋转后的图片
cv2.imshow('result', result)
# 按下任意键退出
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 使用cv2.transpose()函数
cv2.transpose(src)函数可以实现将一幅图像的行和列进行交换,实现旋转的效果。比如,原来图像的形状为(h, w),交换之后的形状就是(w, h)。
同时,在图像处理中,经常会使用cv2.flip()函数进行图像的上下翻转和左右翻转操作。
下面,我们可以将这两个函数结合起来,实现图像的旋转效果。
import cv2
img = cv2.imread('img.jpg', 1)
# 进行矩阵转置,相当于逆时针旋转90度
img = cv2.transpose(img)
# 进行左右翻转,相当于再旋转180度
img = cv2.flip(img, 1)
# 显示旋转后的图片
cv2.imshow('result', img)
# 按下任意键退出
cv2.waitKey(0)
cv2.destroyAllWindows()
3. 使用Numpy数组进行图像旋转
在Python中,可以使用Numpy库常用的矩阵操作函数进行矩阵旋转。对于图像来说,其本质上就是一个三维的数组,因此可以在代码中定义Numpy数组,并使用相关操作函数进行旋转。
import cv2
import numpy as np
img = cv2.imread('img.jpg', 1)
# 定义旋转角度
angle = 45
# 定义缩放比例
scale = 1
# 获取图像的中心坐标
(h, w) = img.shape[:2]
center = (w / 2, h / 2)
# 构造旋转矩阵
M = cv2.getRotationMatrix2D(center, angle, scale)
# 计算正弦和余弦值
cos = np.abs(M[0, 0])
sin = np.abs(M[0, 1])
# 计算旋转后新图像的尺寸
new_w = int((h * sin) + (w * cos))
new_h = int((h * cos) + (w * sin))
# 调整旋转后的矩阵
M[0, 2] += (new_w / 2) - center[0]
M[1, 2] += (new_h / 2) - center[1]
# 进行仿射变换
result = cv2.warpAffine(img, M, (new_w, new_h))
# 显示旋转后的图像
cv2.imshow('result', result)
# 按下任意键退出
cv2.waitKey(0)
cv2.destroyAllWindows()
注意,在使用Numpy数组进行旋转时,需要特别注意变换后的图像大小的计算方法。
结论
本文介绍了3种常见的方法实现图像旋转,在实际应用中,根据实际需要选择合适的方法。值得注意的是,图像旋转过程中可能存在黑边问题,因此可以使用cv2.copyMakeBorder()函数在旋转后的图像周围添加所需的颜色以避免黑边的影响。