学习笔记-计算机视觉01-仿射变换、欧拉角

 理论部分📖

        仿射变换包括缩放、平移、旋转、反射、错切,仿射变换后保持不变的性质:

  • 凸性:原来是直线仿射变换后还是直线
  • 共线性:若几个点变换前在一条线上,则仿射变换后仍然在一条线上
  • 平行性:若两条线变换前平行,则变换后仍然平行
  • 共线比例不变性:变换前一条线上两条线段的比例,在变换后比例不变

        最基础的仿射变换就是线性变换+平移,可以写成如下形式:

        这显然不是线性的,为了把仿射变换变成线性变换,或者说统一变换矩阵的格式,重新定义2D中的点和向量,给它们增加一个维度,那么上面的仿射变换就可以用一个变换矩阵来表示。


🧐为什么点的第三维是1,而向量的第三维是0?

  • 两个点做差即可得到向量。(x1,y1,1)-(x2,y2,1)=(x1-x2,y1-y2,0)
  • 向量具有方向性,平移向量不改变其坐标值。tx,ty应该和0相乘
  • 两个点相加是它们的中点。(x1,y1,1)+(x2,y2,1)=(x1+x2,y1+y2,2)=((x1+x2)/2,(y1+y2)/2,1)

        因此,2D的缩放、旋转、平移矩阵分别如下所示:

      &

### 仿射变换的基本原理 仿射变换是一种在几何中常用的变换方法,它能够在保持图形的“平直性”和“平行性”的前提下,对图形进行各种线性变换和位移。仿射变换可以看作是线性变换(如旋转、缩放)与平移操作的组合。在计算机视觉中,仿射变换常用于图像的几何变换,例如图像的旋转、平移、缩放等[^1]。 仿射变换的数学表达式可以表示为: $$ \begin{bmatrix} x' \\ y' \end{bmatrix} = \begin{bmatrix} a & b \\ c & d \end{bmatrix} \cdot \begin{bmatrix} x \\ y \end{bmatrix} + \begin{bmatrix} e \\ f \end{bmatrix} $$ 其中 $(x, y)$ 是原始坐标点,$(x', y')$ 是变换后的坐标点,矩阵 $\begin{bmatrix} a & b \\ c & d \end{bmatrix}$ 表示线性变换部分(如旋转、缩放、剪切等),而向量 $\begin{bmatrix} e \\ f \end{bmatrix}$ 表示平移操作。仿射变换的变换矩阵通常表示为一个 $2 \times 3$ 的矩阵: $$ \begin{bmatrix} a & b & e \\ c & d & f \end{bmatrix} $$ ### 仿射变换的性质 1. **自由度**:仿射变换具有6个自由度,对应变换矩阵中的6个系数 $a, b, c, d, e, f$。因此,仿射变换可以完全由这6个参数决定[^1]。 2. **保持平行性**:仿射变换能够保持直线的平行性。也就是说,变换后互相平行的直线仍然保持平行。 3. **保持形状**:仿射变换可以将三角形映射为另一个三角形,但不能保证将四边形以上的多边形映射为等边数的多边形[^1]。 4. **组合变换**:仿射变换的乘积和逆变换仍然是仿射变换。这意味着多个仿射变换可以组合为一个变换,且变换的逆操作也可以通过计算逆矩阵实现[^1]。 5. **几何变换能力**:仿射变换能够实现平移、旋转、缩放等基本几何变换[^1]。 ### 仿射变换在图像处理中的应用 在计算机视觉中,仿射变换常用于图像的几何变换。例如,在OpenCV中,可以通过以下方式实现仿射变换: 1. **手动指定变换矩阵**:对于简单的变换(如平移、旋转、缩放),可以直接构造一个 $2 \times 3$ 的变换矩阵,并将其传递给 `cv2.warpAffine()` 函数。需要注意的是,变换矩阵的数据类型必须为 `np.float32`。 2. **自动求解变换矩阵**:对于复杂的变换,可以通过已知的三组对应点(原图中的三点和变换后的三点)来求解仿射变换矩阵。OpenCV提供了 `cv2.getAffineTransform()` 函数来计算变换矩阵,然后将其传递给 `cv2.warpAffine()` 函数进行图像变换[^3]。 ### 示例代码 以下是一个使用OpenCV进行仿射变换的Python示例代码: ```python import cv2 import numpy as np # 读取图像 image = cv2.imread('input.jpg') # 定义三个点用于计算仿射变换矩阵 pts1 = np.float32([[50, 50], [200, 50], [50, 200]]) pts2 = np.float32([[10, 100], [200, 50], [100, 250]]) # 计算仿射变换矩阵 M = cv2.getAffineTransform(pts1, pts2) # 应用仿射变换 rows, cols = image.shape[:2] transformed_image = cv2.warpAffine(image, M, (cols, rows)) # 显示结果 cv2.imshow('Transformed Image', transformed_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值