返回

画像变形之 OpenCV 图像仿射变换详解

人工智能

OpenCV 中的图像仿射变换

图像仿射变换是一种几何变换,它允许对图像进行平移、旋转、缩放和错切等操作。在计算机视觉中,仿射变换广泛用于图像配准、透视校正和图像增强等任务。

理论基础

仿射变换是线性变换,它通过 2x3 的仿射矩阵将输入图像坐标变换到输出图像坐标。仿射矩阵的具体形式为:

| a b tx |
| c d ty |
| 0 0 1  |

其中,(a, b) 表示 x 轴方向的缩放和错切,(c, d) 表示 y 轴方向的缩放和错切,(tx, ty) 表示平移量。

OpenCV 实现

OpenCV 提供了 cv2.warpAffine() 函数来实现图像仿射变换。该函数接收输入图像、仿射矩阵和输出图像大小作为参数,并返回变换后的图像。

import cv2
import numpy as np

# 输入图像
image = cv2.imread('input.jpg')

# 仿射矩阵(平移、缩放、旋转)
M = np.array([[1, 0, 100], [0, 1, 50], [0, 0, 1]])

# 应用仿射变换
warped = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

# 显示变换后的图像
cv2.imshow('Warped Image', warped)
cv2.waitKey(0)

应用示例

平移图像

平移是通过设置 txty 来实现的。例如,以下代码将图像向右平移 100 像素,向下平移 50 像素:

M = np.array([[1, 0, 100], [0, 1, 50], [0, 0, 1]])

缩放图像

缩放可以通过设置 ad 来实现。例如,以下代码将图像缩放为原来的一半大小:

M = np.array([[0.5, 0, 0], [0, 0.5, 0], [0, 0, 1]])

旋转图像

旋转可以通过设置 a, b, cd 来实现。例如,以下代码将图像旋转 45 度:

angle = np.radians(45)
M = np.array([[np.cos(angle), -np.sin(angle), 0], [np.sin(angle), np.cos(angle), 0], [0, 0, 1]])

错切图像

错切可以通过设置 bc 来实现。例如,以下代码将图像沿 x 轴错切 30 度:

M = np.array([[1, 0.5, 0], [0, 1, 0], [0, 0, 1]])

结论

仿射变换是一种强大的图像变形技术,广泛用于图像处理和计算机视觉。通过理解背后的数学原理和 OpenCV 中的实现方式,我们可以轻松实现图像的平移、旋转、缩放和错切。