OpenCV 旋转图像

Ammar Ali 2024年2月15日
  1. 在 Python 中使用 OpenCV 的 rotate() 函数旋转图像
  2. 在 Python 中使用 OpenCV 的 warpAffine() 函数旋转图像
OpenCV 旋转图像

本教程将讨论在 Python 中使用 OpenCV 的 rotate()warpAffine() 函数旋转图像。

在 Python 中使用 OpenCV 的 rotate() 函数旋转图像

我们可以使用 OpenCV 的 rotate() 函数来旋转图像。rotate() 函数的第一个参数是我们要旋转的图像。第二个参数指定图像将旋转多少以及哪个方向。

使用 rotate() 函数旋转图像只有三种方法。我们可以将第二个参数设置为 cv2.ROTATE_90_CLOKWISE 以将图像顺时针旋转 90 度。

我们可以使用 cv2.ROTATE_180 将图像旋转 180 度或翻转它。我们可以使用 cv2.ROTATE_90_COUNTERCLOCKWISE 将图像逆时针旋转 90 度或顺时针旋转 270 度。这是使用 rotate() 函数旋转图像的仅有的三个角度。

例如,让我们使用 imread() 函数读取图像,将其顺时针旋转 90 度,然后使用 imshow() 函数将其与原始图像一起显示。请参阅下面的代码。

import cv2
import numpy as np

image = cv2.imread("cat.jpg")
image_norm = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE)

cv2.imshow("original Image", image)
cv2.imshow("Rotated Image", image_norm)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:

旋转图像

使用 rotate(),我们只能在三个角度上旋转图像,但如果我们想在每个角度上旋转图像,我们可以使用 warpAffine() 函数,如下所述。

在 Python 中使用 OpenCV 的 warpAffine() 函数旋转图像

我们可以使用 OpenCV 的 warpAffine() 函数以任意角度旋转图像。warpAffine() 函数将一个矩阵转换为另一个矩阵。

要旋转图像,我们必须使用 OpenCV 的 getRotationMatrix2D() 函数找到其旋转矩阵。

getRotationMatrix2D() 的第一个参数是我们想要旋转的图像的中心。第二个参数是旋转的角度,第三个参数是图像的比例。

如果比例小于 1,则图像的尺寸会比原始图像小,或者说,它会被缩小。如果比例为正数,图像将被缩放或放大。如果比例为 1,则图像不会被缩放。

warpAffine() 函数的第一个参数是我们想要旋转的图像。第二个参数是旋转矩阵,第三个参数是输出图像的大小。

例如,让我们将上面的图像围绕其中心旋转 45 度。请参阅下面的代码。

import cv2
import numpy as np

image = cv2.imread("cat.jpg")

(h, w) = image.shape[:2]
center = (w / 2, h / 2)
angle = 30
scale = 1

M = cv2.getRotationMatrix2D(center, angle, scale)
rotated = cv2.warpAffine(image, M, (w, h))

cv2.imshow("original Image", image)
cv2.imshow("Rotated Image", rotated)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:

使用 warpAffine 旋转图像

在上面的代码中,我们使用 shape 方法求给定图像的长宽,然后通过取一半的长宽来计算图像的中心。我们可以改变中心、角度和比例值来得到想要的结果。

我们还可以使用 borderMode 参数设置输出图像的边框模式。默认情况下,边框模式设置为 cv2.BORDER_CONSTANT,如你所见,输出图像的角落没有边框。

我们可以将边框模式设置为 cv2.BORDER_TRANSPARENT。输出图像将具有与原始图像相同的边框,或者角将保持不变。

我们可以将边框模式设置为 cv2.BORDER_REPLICATE。将使用附近的像素绘制输出图像的边框或角。

单击此链接了解有关边框模式的更多详细信息。

作者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

相关文章 - Python OpenCV

相关文章 - OpenCV Image