18.图像的旋转变换

目录

        1 概念讲解及用处

        2 函数详解

        2.1 rotate函数实现旋转操作

       2.2 warpAffine仿射变换实现旋转

        3 数学原理及数学推导公式

        4 用C++编写代码进行实现

        1 概念讲解及用处

        图像旋转是指将图像围绕某个中心点进行旋转,使其改变方向和角度。这种操作在许多应用中都很有用,例如纠正图像的倾斜、图像配准、角度测量等。通过图像旋转,可以对图像进行几何变换,从而改变其外观和方向,方便后续处理或显示。

        2 函数详解

        2.1 rotate函数实现旋转操作

        OpenCV中的图像旋转函数为cv::rotate,其原型如下:

void rotate(InputArray src, OutputArray dst, int rotateCode);
其中,src表示输入图像,dst表示输出图像,rotateCode表示旋转代码,用于指定旋转方向。常见的旋转代码包括:

ROTATE_90_CLOCKWISE:逆时针旋转90度
ROTATE_180:旋转180度
ROTATE_90_COUNTERCLOCKWISE:顺时针旋转90度
此外,也可以通过指定旋转矩阵来实现更复杂的旋转变换,使用函数cv::warpAffine。

       2.2 warpAffine仿射变换实现旋转

        当然我们也可以利用防射变换的函数,来达到旋转的效果。warpAffine是OpenCV中用于图像仿射变换的函数之一,它可以实现图像的旋转、平移、缩放等操作。该函数的原型如下:

void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags = INTER_LINEAR, int borderMode = BORDER_CONSTANT, const Scalar& borderValue = Scalar());
参数说明:

src:输入图像。
dst:输出图像,大小为dsize。
M:二维变换矩阵,即仿射矩阵。
dsize:输出图像的尺寸。
flags:插值方法的标志,用于指定如何对输入图像进行采样。默认值为INTER_LINEAR,表示双线性插值。
borderMode:边界模式的标志,用于指定当图像反向变换而得到的空白区域的填充方式。默认值为BORDER_CONSTANT,表示常数填充。
borderValue:边界填充的颜色,当borderMode为BORDER_CONSTANT时有效。

        在图像旋转中,我们可以使用warpAffine函数来实现图像的旋转操作。首先,需要构造一个旋转矩阵,然后将其作为参数传递给M。旋转矩阵可以使用cv::getRotationMatrix2D函数生成,它的原型如下:

Mat getRotationMatrix2D(Point2f center, double angle, double scale);
参数说明:

center:旋转中心点,一般为图像的中心点。
angle:旋转角度,以度为单位。
scale:缩放比例,默认为1.0。

        3 数学原理及数学推导公式

        图像旋转的数学原理基于线性代数中的矩阵变换。旋转变换可以通过旋转矩阵来表示,常见的2D旋转矩阵为:

\begin{bmatrix} cos\theta &-sin\theta \\ sin\theta & cos\theta \end{bmatrix}

\left\{\begin{matrix} x' = x * cos(\theta ) - y * sin(\theta ) & \\ y' = x * sin(\theta ) + y * cos(\theta ) & \end{matrix}\right.

        其中,θ表示旋转的角度。通过将旋转矩阵作用于图像上的每个像素点,可以实现图像的旋转变换。

        4 用C++编写代码进行实现

        下面是一个使用OpenCV进行图像旋转的简单示例代码:

#include <opencv2/opencv.hpp>

int main() {
    // 加载图像
    cv::Mat image = cv::imread("image.jpg");

    // 设置旋转角度
    double angle = 45.0;

    // 计算旋转中心
    cv::Point2f center(image.cols / 2.0, image.rows / 2.0);

    // 计算旋转矩阵
    cv::Mat rotationMatrix = cv::getRotationMatrix2D(center, angle, 1.0);

    // 执行旋转变换
    cv::Mat rotatedImage;
    cv::warpAffine(image, rotatedImage, rotationMatrix, image.size());

    // 显示结果
    cv::imshow("Original Image", image);
    cv::imshow("Rotated Image", rotatedImage);
    cv::waitKey(0);

    return 0;
}

        这段代码加载了一张图像,然后指定旋转角度为45度。接着,计算旋转中心和旋转矩阵,并使用cv::warpAffine函数执行旋转变换。最后,使用cv::imshow函数显示原始图像和旋转后的图像。

        这就是使用OpenCV进行图像旋转的基本步骤和方法。通过调整旋转角度和旋转中心,可以实现不同方向和角度的图像旋转。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别叭叭儿—好好学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值