【OpenCV几何变换】:图像旋转与仿射变换的详细教程
发布时间: 2024-12-03 10:21:02 阅读量: 17 订阅数: 16
![【OpenCV几何变换】:图像旋转与仿射变换的详细教程](https://opengraph.githubassets.com/aa2229f96c1044baae1f91a6a38d0120b8a8ca7f00e1210a022f62558a9322f8/opencv/opencv/issues/17069)
参考资源链接:[OpenCV-Python中文教程:官方指南带目录PDF](https://wenku.csdn.net/doc/6412b487be7fbd1778d3fe47?spm=1055.2635.3001.10343)
# 1. OpenCV几何变换概述
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它拥有丰富的视觉处理功能,能够帮助我们轻松实现图像和视频的捕获、处理、分析和展示。几何变换是OpenCV中的一个重要领域,它允许我们对图像进行旋转、缩放、平移、扭曲等操作,以适应不同场景下的应用需求。几何变换广泛应用于图像校正、图像拼接、增强现实、机器视觉系统等领域。在本章中,我们将概览OpenCV几何变换的核心概念和技术,为深入学习各个具体变换方法打下基础。
# 2. 图像旋转的理论与实践
## 2.1 图像旋转的基本概念
### 2.1.1 旋转中心与旋转角度
在进行图像旋转时,旋转中心是一个非常重要的概念。旋转中心可以看作是图像围绕其进行旋转的点。在二维空间中,旋转中心决定了图像旋转的轨迹,从而影响到旋转后图像的位置。
旋转角度是指图像旋转的角度大小,其单位通常是度(°)或弧度(rad)。在OpenCV中,图像的旋转操作通常是在逆时针方向上进行的,可以通过设置一个正值来实现逆时针旋转,设置负值则实现顺时针旋转。
### 2.1.2 旋转变换的数学模型
图像旋转可以通过线性代数中的旋转变换矩阵来实现,其数学模型可以表示为:
```
| cosθ -sinθ x_c |
R = | sinθ cosθ y_c |
| 0 0 1 |
```
其中,`θ` 表示旋转角度,`(x_c, y_c)` 表示旋转中心的坐标。矩阵中的 `x_c` 和 `y_c` 允许我们在图像的任意点设置旋转中心。
## 2.2 图像旋转的OpenCV实现
### 2.2.1 使用cv2.getRotationMatrix2D获取旋转矩阵
在OpenCV中,`cv2.getRotationMatrix2D` 函数被用来计算2D图像旋转的变换矩阵。这个矩阵随后可以用 `cv2.warpAffine` 函数应用到原图上,完成图像旋转操作。
函数的定义如下:
```python
M = cv2.getRotationMatrix2D(center, angle, scale)
```
- `center`:旋转中心的坐标 `(x_c, y_c)`。
- `angle`:旋转角度,以度为单位。
- `scale`:缩放比例,通常用于同时放大或缩小图像。
### 2.2.2 应用warpAffine进行图像旋转
`cv2.warpAffine` 函数应用旋转矩阵 `M` 对图像进行实际的旋转操作。其使用方式如下:
```python
rotated_image = cv2.warpAffine(src, M, dsize)
```
- `src`:原始图像。
- `M`:通过 `cv2.getRotationMatrix2D` 获取的旋转矩阵。
- `dsize`:输出图像的大小,设置为 `-1, -1` 时,输出图像的大小与输入图像相同。
## 2.3 图像旋转实践案例分析
### 2.3.1 简单图像旋转操作实例
下面给出一个简单的图像旋转操作实例。首先,读取一张图片,然后使用 `cv2.getRotationMatrix2D` 获取旋转矩阵,接着使用 `cv2.warpAffine` 实现旋转:
```python
import cv2
import numpy as np
# 读取图片
image = cv2.imread('example.jpg')
# 设置旋转中心和角度
center = (image.shape[1]//2, image.shape[0]//2)
angle = 45
# 获取旋转矩阵
M = cv2.getRotationMatrix2D(center, angle, 1.0)
# 执行旋转操作
rotated_image = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
# 显示原图和旋转后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Rotated Image', rotated_image)
# 等待按键后关闭所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
```
### 2.3.2 结合ROI的图像旋转进阶操作
在某些情况下,可能只希望对图像的一个特定区域(Region of Interest, ROI)进行旋转。这可以通过定义ROI的坐标,然后只对这部分进行旋转操作来实现。
假设我们想要旋转图像中从坐标 (x1, y1) 到 (x2, y2) 的区域:
```python
# 定义ROI的坐标
x1, y1 = 50, 50
x2, y2 = 150, 150
# 创建ROI掩码
mask = np.zeros_like(image)
cv2.rectangle(mask, (x1, y1), (x2, y2), (255, 255, 255), -1)
# 获取ROI
roi = image.copy()
cv2.rectangle(roi, (x1, y1), (x2, y2), (0, 0, 0), 1)
# 将ROI的其余部分置为0
image[y1:y2, x1:x2] = 0
# 应用旋转矩阵到原图并只保留旋转后的ROI区域
rotated_image = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
rotated_roi = rotated_image[y1:y2, x1:x2].copy()
# 合并旋转后的ROI和其余部分
rotated_image[y1:y2, x1:x2] = rotated_roi
# 显示原始和旋转后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Rotated Image with ROI', rotated_image)
# 等待按键后关闭所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
```
以上代码首先创建了一个掩码,用于定义旋转的区域,然后将图像其余部分设置为黑色(即0)。这样,在旋转后,只有定义的ROI区域会发生旋转。最后,将旋转后的ROI复制回原始图像中的对应位置,从而实现了只旋转ROI区域的效果。
# 3. 仿射变换的理论与实践
## 3.1 仿射变换基础
### 3.1.1 仿射变换的定义与性质
仿射变换(Affine transformation)是图像处理中一种基本而重要的几何变换。它是线性变换与平移的组合,保持了图像的“平直性”和“平行性”。也就是说,在仿射变换中,直线经过变换后仍然是直线,且平行线经过变换后仍然保持平行。
仿射变换具有以下性质:
- **线性保持性**:仿射变换保持了图像的线性特征。
- **平行线保持性**:任意两组平行线在仿射变换后仍然保持平行。
- **比例不变性**:仿射变换不保持距离和角度,即长度和角度的度量不保持不变。
- *
0
0