OpenCV-Python快速入门系列21图像旋转

简介

在图像处理领域,旋转操作是常见且重要的基本操作之一。无论是图像校正、数据增强,还是特征提取,旋转都扮演着关键角色。OpenCV 提供了多种方法来实现图像旋转,本文将详细介绍这些方法,并通过示例代码演示其具体应用。

经验 | OpenCV图像旋转的原理与技巧 (qq.com)

方法一:使用 cv2.getRotationMatrix2Dcv2.warpAffine

这是 OpenCV 中最常用的旋转方法,适用于任意角度的旋转。

步骤:

  1. 计算旋转矩阵:使用 cv2.getRotationMatrix2D 函数。
  2. 应用仿射变换:使用 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.transposecv2.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
喜欢就支持一下吧
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容