OpenCV图像旋转实战:旋转、裁剪和透视变换,轻松搞定
发布时间: 2024-08-12 14:34:09 阅读量: 40 订阅数: 47
opencv 图像旋转 任一点坐标转换 裁剪图像
![OpenCV图像旋转实战:旋转、裁剪和透视变换,轻松搞定](https://ask.qcloudimg.com/http-save/yehe-3631517/a0c235b4ad498f14eb1d9ae0adde0ccc.png)
# 1. OpenCV图像旋转基础
OpenCV图像旋转是计算机视觉中一项基本操作,它可以将图像围绕指定中心点旋转一定角度。旋转图像的目的是调整图像方向,使其符合特定要求或增强图像美观度。
### 1.1 旋转中心点和旋转角度
图像旋转需要指定一个旋转中心点和一个旋转角度。旋转中心点是图像中旋转操作的参考点,旋转角度是图像绕中心点旋转的度数。旋转角度可以是正值或负值,正值表示顺时针旋转,负值表示逆时针旋转。
# 2. OpenCV图像旋转实践
### 2.1 旋转图像
#### 2.1.1 旋转中心点和旋转角度
**旋转中心点:**图像旋转操作围绕的固定点,通常为图像的中心点。
**旋转角度:**以弧度或度数表示的图像旋转量。正值表示顺时针旋转,负值表示逆时针旋转。
#### 2.1.2 旋转方式
OpenCV提供了两种旋转图像的方式:
- **仿射变换:**使用 `cv2.warpAffine()` 函数,指定旋转中心点、旋转角度和缩放因子。
- **旋转矩阵:**使用 `cv2.getRotationMatrix2D()` 函数生成旋转矩阵,然后使用 `cv2.warpAffine()` 函数应用旋转。
**代码块:**
```python
import cv2
# 读取图像
image = cv2.imread('image.jpg')
# 旋转中心点
center = (image.shape[1] // 2, image.shape[0] // 2)
# 旋转角度(弧度)
angle = 45 * np.pi / 180
# 仿射变换旋转
rotated_image = cv2.warpAffine(image, cv2.getRotationMatrix2D(center, angle, 1.0), (image.shape[1], image.shape[0]))
# 旋转矩阵旋转
rotation_matrix = cv2.getRotationMatrix2D(center, angle, 1.0)
rotated_image = cv2.warpAffine(image, rotation_matrix, (image.shape[1], image.shape[0]))
```
**逻辑分析:**
- `cv2.getRotationMatrix2D()` 函数根据旋转中心点、旋转角度和缩放因子生成旋转矩阵。
- `cv2.warpAffine()` 函数使用仿射变换或旋转矩阵对图像进行旋转。
### 2.2 裁剪图像
#### 2.2.1 裁剪区域
**裁剪区域:**图像中要保留的特定部分。可以通过矩形、椭圆或多边形来定义。
#### 2.2.2 裁剪方式
OpenCV提供了多种裁剪图像的方式:
- **矩形裁剪:**使用 `cv2.getRectSubPix()` 函数,指定裁剪区域的左上角坐标和大小。
- **椭圆裁剪:**使用 `cv2.ellipse()` 函数绘制椭圆,然后使用 `cv2.bitwise_and()` 函数裁剪图像。
- **多边形裁剪:**使用 `cv2.fillPoly()` 函数绘制多边形,然后使用 `cv2.bitwise_and()` 函数裁剪图像。
**代码块:**
```python
# 矩形裁剪
x, y, w, h = 100, 100, 200, 200
cropped_image = cv2.getRectSubPix(image, (w, h), (x, y))
# 椭圆裁剪
center = (image.shape[1] // 2, image.shape[0] // 2)
axes = (100, 50)
angle = 0
start_angle = 0
end_angle = 360
cropped_image = cv2.ellipse(image, center, axes, angle, start_angle, end_angle, (0, 255, 0), -1)
cropped_image = cv2.bitwise_and(image, cropped_image)
# 多边形裁剪
points = np.array([[100, 100], [200, 100], [200, 200], [100, 200]])
cropped_image = cv2.fillPoly(image, [points], (0, 255, 0))
```
**逻辑分析:**
- `cv2.getRectSubPix()` 函数根据矩形区域的左上角坐标和大小裁剪图像。
- `cv2.ellipse()` 函数绘制椭圆,然后与原始图像进行按位与运算以裁剪图像。
- `cv2.fillPoly()` 函数绘制多边形,然后与原始图像进行按位与运算以裁剪图像。
### 2.3 透视变换
#### 2.3.1 透视变换原理
**透视变换:**一种几何变换,用于将图像从一个透视投影转换为另一个透视投影。它可以用于校正图像失真或创建3D效果。
#### 2.3.2 透视变换矩阵
**透视变换矩阵:**3x3矩阵,用于表示透视变换。它可以将源图像中的点映射到目标图像中的点。
**代码块:**
```python
# 透视变换矩阵
H = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
# 透视变换
transformed_image = cv2.warpPerspective(image, H, (image.shape[1], image.shape[0]))
```
**逻辑分析:**
- `cv2.warpPerspective()` 函数使用透视变换矩阵将图像从一个透视投影转换为另一个透视投影。
# 3.1 图像矫正
#### 3.1.1 倾斜图像矫正
倾斜图像矫正是指将倾斜的图像恢复到正常水平或垂直状态。在OpenCV中,可以使用`cv2.getRotationMatrix2D()`函数和`cv2.warpAffine()`函数来实现图像的倾斜矫正。
```python
import cv2
# 读取倾斜图像
image = cv2.imread('tilted_image.jpg')
# 计算旋转矩阵
angle = 10 # 倾斜角度,单位为度
center = (image.shape[1] // 2, image.shape[0] // 2) # 旋转中心
scale = 1.0 # 缩放因子,保持图像大小不变
rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)
# 矫正图像
corrected_image = cv2.warpAffine(image, rotation_ma
```
0
0