简介
在图像处理领域,旋转操作是常见且重要的基本操作之一。无论是图像校正、数据增强,还是特征提取,旋转都扮演着关键角色。OpenCV 提供了多种方法来实现图像旋转,本文将详细介绍这些方法,并通过示例代码演示其具体应用。
经验 | OpenCV图像旋转的原理与技巧 (qq.com)
方法一:使用 cv2.getRotationMatrix2D
和 cv2.warpAffine
这是 OpenCV 中最常用的旋转方法,适用于任意角度的旋转。
步骤:
- 计算旋转矩阵:使用
cv2.getRotationMatrix2D
函数。 - 应用仿射变换:使用
cv2.warpAffine
函数。
示例代码:
import cv2 as cv
import numpy as np
def rotate_image(image, angle):
(h, w) = image.shape[:2]
center = (w // 2, h // 2)
# 计算旋转矩阵
M = cv.getRotationMatrix2D(center, angle, 1.0)
# 计算旋转后的图像尺寸
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]
# 应用仿射变换
rotated = cv.warpAffine(image, M, (new_w, new_h))
return rotated
# 加载图像
image = cv.imread('images/test.png')
if image is None:
raise FileNotFoundError("图像路径错误,请检查路径是否正确!")
# 旋转图像
angle = 45 # 旋转角度
rotated_image = rotate_image(image, angle)
# 显示结果
cv.imshow("Original Image", image)
cv.imshow("Rotated Image", rotated_image)
cv.waitKey(0)
cv.destroyAllWindows()
代码解析:
- 计算旋转矩阵:
cv.getRotationMatrix2D(center, angle, scale)
返回一个 2×3 的旋转矩阵。center
:旋转中心点。angle
:旋转角度,正值表示逆时针旋转。scale
:缩放因子,1.0 表示不缩放。
- 调整旋转矩阵的平移部分:为了确保旋转后的图像完整显示,需要调整旋转矩阵的平移部分。
- 应用仿射变换:
cv.warpAffine
函数根据旋转矩阵对图像进行仿射变换。
方法二:使用 cv2.transpose
和 cv2.flip
对于 90、180、270 度的旋转,可以使用矩阵转置和翻转操作实现。
示例代码:
import cv2 as cv
def rotate_image_90(image, clockwise=True):
if clockwise:
# 顺时针旋转90度
rotated = cv.transpose(image)
rotated = cv.flip(rotated, 1)
else:
# 逆时针旋转90度
rotated = cv.transpose(image)
rotated = cv.flip(rotated, 0)
return rotated
# 加载图像
image = cv.imread('images/test.png')
if image is None:
raise FileNotFoundError("图像路径错误,请检查路径是否正确!")
# 旋转图像
rotated_image_cw = rotate_image_90(image, clockwise=True)
rotated_image_ccw = rotate_image_90(image, clockwise=False)
# 显示结果
cv.imshow("Original Image", image)
cv.imshow("Rotated Image CW", rotated_image_cw)
cv.imshow("Rotated Image CCW", rotated_image_ccw)
cv.waitKey(0)
cv.destroyAllWindows()
代码解析:
- 转置矩阵:
cv.transpose(image)
将图像矩阵进行转置操作。 - 翻转图像:
cv.flip
函数对图像进行翻转。flipCode=1
:水平翻转。flipCode=0
:垂直翻转。
方法三:使用 numpy.rot90
numpy
库提供了 rot90
函数,可以方便地对图像进行 90 度的旋转。
import cv2 as cv
import numpy as np
# 加载图像
image = cv.imread('images/test.png')
if image is None:
raise FileNotFoundError("图像路径错误,请检查路径是否正确!")
# 旋转图像
rotated_image = np.rot90(image, k=1) # k=1 表示逆时针旋转90度
# 显示结果
cv.imshow("Original Image", image)
cv.imshow("Rotated Image", rotated_image)
cv.waitKey(0)
cv.destroyAllWindows()
代码解析:
np.rot90
:对数组进行 k 次 90 度逆时针旋转。k=1
:旋转 90 度。k=2
:旋转 180 度。k=3
:旋转 270 度。
© 版权声明
转载请注明出处,并标明原文链接。
本网站尊重知识产权,如有侵权,请及时联系我们删除。
本站所有原创内容仅用于学习和交流目的,未经作者和本站授权不得进行商业使用或盈利行为。
本网站尊重知识产权,如有侵权,请及时联系我们删除。
本站所有原创内容仅用于学习和交流目的,未经作者和本站授权不得进行商业使用或盈利行为。
THE END
暂无评论内容