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. 代码解释

  1. Rotate(img, angle) 函数: - 该函数接受一张图像和旋转角度作为输入,返回旋转后的图像。 - 首先,获取输入图像的尺寸和中心点坐标。 - 然后,使用 cv2.getRotationMatrix2D 函数创建旋转矩阵。 - 接着,根据旋转矩阵计算旋转后图像的尺寸,并更新旋转矩阵的平移量,确保旋转后的图像居中显示。 - 最后,使用 cv2.warpAffine 函数对图像进行仿射变换,实现图像旋转。

  2. 主程序: - 首先,读取一张灰度图像,并使用 cv2.getRotationMatrix2D 函数创建旋转矩阵。 - 然后,分别使用 cv2.warpAffine 函数和自定义的 Rotate 函数对图像进行旋转。 - 最后,使用 matplotlib.pyplot 库将原始图像和旋转后的图像显示出来。

5. 总结

本文介绍了如何使用Python和OpenCV库实现图像旋转,并详细解释了旋转矩阵的构建过程和图像尺寸的调整方法。希望本文能够帮助你理解图像旋转的原理,并掌握使用OpenCV进行图像旋转的操作。

Python OpenCV实现图像旋转:详解与代码示例

原文地址: http://www.cveoy.top/t/topic/bAmU 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录