Python OpenCV实现图像旋转:详解与代码示例
Python OpenCV实现图像旋转:详解与代码示例
本文将介绍如何使用Python和OpenCV库实现图像旋转。我们将详细解释旋转矩阵的构建过程,以及如何调整图像尺寸以避免信息丢失。
1. 旋转原理
图像旋转是指以图像的中心为原点,将图像上的所有像素点绕该点旋转一定角度的操作。OpenCV中可以使用cv2.warpAffine函数实现图像的仿射变换,而旋转是仿射变换的一种特殊情况。
2. 旋转矩阵
在进行图像旋转时,需要使用旋转矩阵来计算每个像素点的新坐标。二维旋转矩阵的定义如下:
M = [[cos(theta), -sin(theta), tx], [sin(theta), cos(theta), ty]]
其中:
theta是旋转角度,逆时针为正方向。-(tx, ty)是平移量,用于控制旋转后的图像位置。
3. OpenCV实现
OpenCV中可以使用cv2.getRotationMatrix2D函数来创建旋转矩阵,然后使用cv2.warpAffine函数进行图像旋转。
**代码示例:**pythonimport cv2import numpy as npimport matplotlib.pyplot as plt
def Rotate(img, angle): ''' 旋转图像
参数: img: 输入图像 angle: 旋转角度,逆时针为正方向
返回值: 旋转后的图像 ''' # 获取图像的高度和宽度 height, width = img.shape # 计算图像的中心点坐标 center = (width // 2, height // 2) # 根据给定的角度和中心点坐标创建旋转矩阵 M = cv2.getRotationMatrix2D(center, -angle, 1.0) # 获取旋转矩阵的绝对值的第一行第一列元素 cos = np.abs(M[0, 0]) # 获取旋转矩阵的绝对值的第一行第二列元素 sin = np.abs(M[0, 1]) # 计算旋转后图像的新宽度和新高度 nW = int((height * sin) + (width * cos)) nH = int((height * cos) + (width * sin)) # 更新旋转矩阵的第一行第三列元素和第二行第三列元素 M[0, 2] += (nW / 2) - center[0] M[1, 2] += (nH / 2) - center[1] # 对图像进行仿射变换,得到旋转后的图像 image_rotation = cv2.warpAffine(img, M, (nW, nH), borderValue=255) # 返回旋转后的图像 return image_rotation
读取图像img = cv2.imread('png_files/lena.png', 0)# 获取图像的尺寸h, w = img.shape# 创建旋转矩阵M = cv2.getRotationMatrix2D([h//2, w//2], -30, 1.0)# 使用cv2.warpAffine函数进行旋转img_new1 = cv2.warpAffine(img, M, (h, w))# 使用自定义Rotate函数进行旋转img_new2 = Rotate(img, 30)
显示图像plt.figure()plt.subplot(121)plt.imshow(img, cmap='gray')plt.axis('off')plt.subplot(222)plt.imshow(img_new1, cmap='gray')plt.axis('off')
plt.subplot(224)plt.imshow(img_new2, cmap='gray')plt.axis('off')plt.suptitle('你的学号')plt.show()
4. 代码解释
-
Rotate(img, angle)函数: - 该函数接受一张图像和旋转角度作为输入,返回旋转后的图像。 - 首先,获取输入图像的尺寸和中心点坐标。 - 然后,使用cv2.getRotationMatrix2D函数创建旋转矩阵。 - 接着,根据旋转矩阵计算旋转后图像的尺寸,并更新旋转矩阵的平移量,确保旋转后的图像居中显示。 - 最后,使用cv2.warpAffine函数对图像进行仿射变换,实现图像旋转。 -
主程序: - 首先,读取一张灰度图像,并使用
cv2.getRotationMatrix2D函数创建旋转矩阵。 - 然后,分别使用cv2.warpAffine函数和自定义的Rotate函数对图像进行旋转。 - 最后,使用matplotlib.pyplot库将原始图像和旋转后的图像显示出来。
5. 总结
本文介绍了如何使用Python和OpenCV库实现图像旋转,并详细解释了旋转矩阵的构建过程和图像尺寸的调整方法。希望本文能够帮助你理解图像旋转的原理,并掌握使用OpenCV进行图像旋转的操作。
原文地址: http://www.cveoy.top/t/topic/bAmU 著作权归作者所有。请勿转载和采集!