Python中的仿射变换

2025年1月5日 | 阅读 5 分钟

什么是仿射变换?

仿射变换是一种几何变换过程,其中原始图像被变换,使得输出图像保持平行。这保持了共线性、直线的平行性以及两点之间距离的比率。仿射变换由矩阵映射 (x / -> Mx + b) 表示,其中 M 是线性矩阵,b 是偏移向量。仿射变换包括平移、旋转、缩放、剪切等变换。

我们将使用 OpenCV 在 Python 中执行仿射变换。

关于 OpenCV

OpenCV 是一个用于机器学习、计算机视觉和图像处理的开放源代码库。它用于通过处理图像和视频来识别和识别物体、面部以及许多其他事物,例如手写图像。仿射变换是一种用于修复几何缺陷的变换类型。仿射变换表示为 2x3 矩阵。

仿射变换中有几种变换

  • 使用 cv2.rotate 旋转图像
  • 使用 cv2.resize 缩放图像
  • 使用 cv2.getPerspectiveTransform 进行平移
  • 使用 cv2.warpAffin 进行透视变换

在实现之前,我们需要使用 pip 命令下载 opencv-python 库

现在,我们将导入库

在这里,我们将了解仿射变换的不同方法和函数。

cv2.getPerspectiveTransform 方法

此函数用于使用三个对应点对来评估仿射变换。它形成一个 2x3 的仿射变换矩阵。

getPerspectiveTransform( ) 方法的语法

其中

  • source = 源图像的坐标
  • destination = 目标图像的坐标

也可以写成

cv2.warpAffine( ) 方法

它用于评估和实现重映射例程。

cv2.warpAffine( ) 方法的语法

其中

  • source = 源图像
  • matrix = 变换矩阵
  • imgsize = 输出图像的大小
  • destination = 输出图像,其大小和类型与源图像相同
  • flag = 它决定插值方法
  • mode = 它定义了像素插值方法
  • value = 它给出了常数边界的值

让我们来实现仿射变换并理解它处理不同变换的不同方法。

使用 getAffineTransform( ) 和 warpAffine( ) 方法

它用于通过将图像从一个位置移动到另一个位置来平移图像。

代码

输出

Affine Transformation in Python

此代码显示了 cv2.getAffineTransform( )cv2.warpAffine( ) 函数的使用,以对图像实现仿射变换。我们首先导入所需的库,然后读取图像。然后,使用 getAffineTransform( ) 和 warpAffine( ) 函数,我们变换了图像。输出既包括输入图像也包括变换后的输出图像。

现在,我们将实现包括缩放、旋转等在内的多种变换,使用仿射变换。

图像旋转

仿射变换中的图像旋转是指图像以圆形运动方式移动。它以顺时针和逆时针方向旋转图像。要旋转图像,使用 cv2.rotate( ) 函数。它以 90 度的倍数旋转图像。

cv2.rotate( ) 函数的语法

其中

  • img = 源图像
  • rotation = 旋转类型

参数 rotation 接受三个值,用于指定如何旋转图像

  1. ROTATE_90_CLOCKWISE: 它将图像顺时针旋转 90 度。
  2. ROTATE_90_COUNTERCLOCKWISE: 它将图像逆时针旋转 90 度,或者我们可以说它将图像顺时针旋转 270 度。
  3. ROTATE_180: 它将图像顺时针旋转 180 度。

下面是仿射变换中旋转图像的实现。

代码

输出

Affine Transformation in Python

在这里,我们导入了所有必要的库,并使用 imread( ) 函数读取了图像。然后,使用 rotate( ) 函数,我们通过其代码以每次旋转的方式旋转了图像。

图像缩放

缩放是指调整图像大小。它会导致像素信息发生变化。当我们减小图像大小时,我们需要对像素进行重采样,而当我们增大图像大小时,我们需要重建图像。我们可以使用插值方法来缩放图像。它使用 cv2.resize( ) 函数实现。

resize( ) 函数的语法

其中

  • src = 输入图像
  • dst = 输出图像
  • dsize = 输出图像大小
  • fx = 水平轴的缩放因子
  • fy = 垂直轴的缩放因子
  • interpolation = 定义插值方法

让我们通过在 Python 中实现来理解图像的重采样。

代码

输出

Affine Transformation in Python

在此,我们导入了库并使用了 resize( ) 函数来缩放图像。我们先缩小了图像尺寸,然后又放大了图像。

图像透视变换

透视变换是我们改变图像透视以进行更好分析的过程。它通过一个 3x3 的矩阵来进行,我们可以通过改变坐标来改变透视。要评估透视变换,我们可以使用 cv2.warpPerspective( ) 方法。

warpPerspective( ) 函数的语法

其中

  • src = 源图像
  • mat = 变换矩阵
  • dsize = 输出图像的大小
  • dst = 输出图像,其大小和类型与源图像相同
  • flag = 它决定插值方法
  • mode = 它定义了像素插值方法
  • value = 它给出了常数边界的值

在 Python 中实现透视变换

代码

输出

Affine Transformation in Python

我们使用了 cv2.warpPerspective( ) 和 cv2.getPerspectiveTransform( ) 函数,它们变换了图像并改变了其透视。