揭秘OpenCV图像几何变换:旋转、平移、缩放、透视变换的实战指南
发布时间: 2024-08-08 18:55:55 阅读量: 14 订阅数: 13
# 1. 图像几何变换概述**
图像几何变换是一类操作,用于改变图像中对象的形状、大小或位置。这些变换广泛应用于图像处理、计算机视觉和图形学中。OpenCV(Open Source Computer Vision Library)是一个流行的计算机视觉库,它提供了强大的函数来执行图像几何变换。
在本章中,我们将介绍图像几何变换的基本概念,包括旋转、平移、缩放和透视变换。我们将探讨这些变换的数学原理,并展示如何使用 OpenCV 函数来实现它们。
# 2. 旋转变换
### 2.1 基本原理和公式
旋转变换是将图像围绕一个指定中心点旋转一定角度的过程。其基本原理是应用旋转矩阵将图像中的每个像素坐标进行变换。旋转矩阵是一个 2x3 的矩阵,其形式如下:
```
[cos(θ) -sin(θ) tx]
[sin(θ) cos(θ) ty]
```
其中:
* θ 为旋转角度(弧度制)
* tx 和 ty 为旋转中心点的 x 和 y 坐标
### 2.2 OpenCV中旋转变换函数
OpenCV 提供了两个函数来进行图像旋转变换:
#### 2.2.1 cv2.getRotationMatrix2D()
该函数用于计算旋转矩阵。其语法如下:
```python
cv2.getRotationMatrix2D(center, angle, scale)
```
其中:
* center:旋转中心点的坐标 (x, y)
* angle:旋转角度(弧度制)
* scale:图像缩放因子(可选,默认为 1)
#### 2.2.2 cv2.warpAffine()
该函数用于应用仿射变换,包括旋转、平移和缩放。其语法如下:
```python
cv2.warpAffine(src, M, dsize)
```
其中:
* src:输入图像
* M:仿射变换矩阵
* dsize:输出图像的大小
**代码示例:**
```python
import cv2
import numpy as np
# 读取图像
image = cv2.imread('image.jpg')
# 计算旋转矩阵
M = cv2.getRotationMatrix2D((image.shape[1] // 2, image.shape[0] // 2), 45, 1)
# 应用旋转变换
rotated_image = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
# 显示旋转后的图像
cv2.imshow('Rotated Image', rotated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
**逻辑分析:**
* 首先,计算旋转矩阵,指定旋转中心点为图像中心,旋转角度为 45 度,缩放因子为 1。
* 然后,使用 `cv2.warpAffine()` 函数应用旋转变换,将输入图像 `image` 旋转 45 度。
* 最后,显示旋转后的图像。
**参数说明:**
* `center`:旋转中心点坐标,是一个元组 `(x, y)`。
* `angle`:旋转角度,单位为弧度制。
* `scale`:图像缩放因子,默认为 1。
* `M`:仿射变换矩阵,是一个 2x3 的矩阵。
* `dsize`:输出图像的大小,是一个元组 `(width, height)`。
# 3. 平移变换**
### 3.1 基本原理和公式
平移变换是一种几何变换,它将图像中的所有像素沿水平或垂直方向移动一个指定的距离。其基本原理是通过一个平移矩阵将图像中的每个像素移动指定的距离。平移矩阵是一个 2x3 的矩阵,如下所示:
```
[1 0 tx]
[0 1 ty]
```
其中:
* `tx` 是水平平移距离
* `ty` 是垂直平移距离
### 3.2 OpenCV中平移变换函数
OpenCV 提供了两个函数来执行平移变换:`cv2.translate()` 和 `cv2.warpAffine()`.
#### 3.2.1 cv2.translate()
`cv2.translate()` 函数直接对图像进行平移操作,其语法如下:
```python
cv2.translate(image, M, dst=None, borderMode=cv2.BORDER_CONSTANT, value=0)
```
其中:
* `image`:输入图像
* `M`:平移矩阵,如上所示
* `dst`:输出图像(可选)
* `borderMode`:边界处理模式,指定图像边界外的像素如何处理
* `value`:边界填充值
#### 3.2.2 cv2.warpAffine()
`cv2.warpAffine()` 函数可以执行更通用的仿射变换,其中平移变换是仿射变换的一种特殊情况。其语法如下:
```python
cv2.warpAffine(image, M, dsize, dst=None, flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, value=0)
```
其中:
* `image`:输入图像
* `M`:仿射变换矩阵,平移变换时使用平移矩阵
* `dsize`:输出图像的大小
* `dst`:输出图像(可选)
* `flags`:插值方法
* `borderMode`:边界处理模式
* `value`:边界填充值
**代码示例:**
以下代码示例演示了如何使用 `cv2.translate()` 函数平移图像:
```python
import cv2
# 读取图像
image = cv2.imread('image.jpg')
# 定义平移距离
tx = 100
ty = 50
# 创建平移矩阵
M = np.float32([[1, 0, tx], [0, 1, ty]])
# 执行平移变换
translated_image = cv2.translate(image, M)
# 显示平移后的图像
cv2.imshow('Translated Image', translated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
**逻辑分析:**
* `cv2.imread()` 函数读取输入图像。
* 定义了平移距离 `tx` 和 `ty`。
* 使用 `np.float32()` 创建了平移矩阵 `M`。
* `cv2.translate()` 函数使用平移矩阵 `M` 将图像平移了指定的距离。
* 最后,显示了平移后的图像。
**参数说明:**
* `tx` 和 `ty`:平移距离,正值向右或向下平移,负值向左或向上平移。
* `M`:平移矩阵,定义了平移变换。
* `dsize`:输出图像的大小,对于平移变换,可以与输入图像大小相同。
* `flags`:插值方法,用于在平移过程中重新采样图像。
# 4. 缩放变换**
**4.1 基本原理和公式**
缩放变换是指将图像中的所有像素点按照一定的比例进行放大或缩小。缩放变换的数学公式如下:
```
[x'] = [s 0 0] * [x]
[y'] = [0 s 0] * [y]
[1 ] = [0 0 1] * [1]
```
其中:
* `(x, y)` 表示原始图像中的像素坐标
* `(x', y')` 表示缩放后的图像中的像素坐标
* `s` 表示缩放因子
**4.2 OpenCV中缩放变换函数**
OpenCV提供了两种缩放变换函数:`cv2.resize()`和`cv2.warpAffine()`。
**4.2.1 cv2.resize()**
`cv2.resize()`函数使用插值算法对图像进行缩放。它支持多种插值方法,包括:
* `cv2.INTER_NEAREST`:最近邻插值
* `cv2.INTER_LINEAR`:双线性插值
* `cv2.INTER_CUBIC`:三次样条插值
```python
import cv2
# 读取图像
image = cv2.imread('image.jpg')
# 使用最近邻插值缩放图像到一半大小
resized_image = cv2.resize(image, (0, 0), fx=0.5, fy=0.5, interpolation=cv2.INTER_NEAREST)
# 显示缩放后的图像
cv2.imshow('Resized Image', resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
**4.2.2 cv2.warpAffine()**
`cv2.warpAffine()`函数使用仿射变换对图像进行缩放。它需要一个仿射变换矩阵作为参数,该矩阵表示缩放变换。
```python
import cv2
# 读取图像
image = cv2.imread('image.jpg')
# 创建缩放矩阵
scale_matrix = cv2.getRotationMatrix2D((0, 0), 0, 0.5)
# 使用仿射变换缩放图像
scaled_image = cv2.warpAffine(image, scale_matrix, (image.shape[1], image.shape[0]))
# 显示缩放后的图像
cv2.imshow('Scaled Image', scaled_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
# 5. 透视变换**
**5.1 基本原理和公式**
透视变换是一种几何变换,它可以将图像中的对象从一个透视角度投影到另一个透视角度。透视变换矩阵是一个3x3矩阵,它描述了从一个透视平面到另一个透视平面的映射关系。
透视变换矩阵的公式如下:
```
[x'] = [a b c] [x]
[y'] [d e f] [y]
[1] [g h 1] [1]
```
其中,(x, y)是原始图像中的点坐标,(x', y')是变换后的图像中的点坐标,a-h是透视变换矩阵的元素。
**5.2 OpenCV中透视变换函数**
OpenCV提供了两个函数来执行透视变换:cv2.getPerspectiveTransform()和cv2.warpPerspective()。
**5.2.1 cv2.getPerspectiveTransform()**
cv2.getPerspectiveTransform()函数用于计算透视变换矩阵。它需要四个点对作为输入,其中每个点对都对应于原始图像中的一个点和变换后的图像中的一个点。
```python
import cv2
# 定义四个点对
src_points = np.array([[0, 0], [100, 0], [0, 100], [100, 100]])
dst_points = np.array([[50, 50], [150, 50], [50, 150], [150, 150]])
# 计算透视变换矩阵
M = cv2.getPerspectiveTransform(src_points, dst_points)
```
**5.2.2 cv2.warpPerspective()**
cv2.warpPerspective()函数用于应用透视变换到图像上。它需要透视变换矩阵、原始图像和目标图像大小作为输入。
```python
# 应用透视变换
dst = cv2.warpPerspective(img, M, (width, height))
```
其中,img是原始图像,width和height是目标图像的宽度和高度。
0
0