透视变换矩阵每个参数的意义

透视变换矩阵用于将三维世界中的物体映射到二维平面,通常用于计算机视觉和图像处理中的图像变换。透视变换通过一个 3x3 矩阵来实现,该矩阵通常是这样的形式:

M=[abcdefgh1] M = \begin{bmatrix} a & b & c \\ d & e & f \\ g & h & 1 \end{bmatrix} M= adgbehcf1

这个矩阵的每个元素都有其特定的意义,下面是每个参数的解释:

1. a, b, d, e — 线性变换部分

这些参数控制着图像的缩放、旋转、剪切等线性变换操作。

  • ae:主要决定图像在 x 和 y 方向上的缩放。如果这两个值是大于 1 的数字,图像会放大;如果小于 1,图像会缩小。
  • bd:决定了图像的倾斜度,也可以理解为剪切变换。例如,b 值非零时,图像的垂直线会倾斜,d 值非零时,图像的水平线会倾斜。

2. c, f — 平移

这些参数控制着图像的平移。

  • c:控制图像在 x 轴上的平移,即图像的水平方向移动。
  • f:控制图像在 y 轴上的平移,即图像的垂直方向移动。

3. g, h — 透视变换

这些参数影响图像的透视效果,改变图像远近的感觉。

  • gh 通常影响图像的透视缩放。它们会让图像的远近物体产生透视效果,从而改变图像中物体的相对大小。
  • 当 g 或 h 的值不为零时,图像会出现倾斜或变形,通常给人一种透视缩放的效果。

4. 1 — 同次坐标

矩阵的最后一个元素通常是固定的1,表示“同次坐标”(homogeneous coordinates)。它是透视变换矩阵的一个重要特性,使得矩阵可以表示包括平移、旋转和透视在内的所有仿射变换以及透视变换。

总结:

  • a, b, d, e:控制线性变换,包括缩放、旋转、剪切等。
  • c, f:控制平移操作。
  • g, h:控制透视效果,影响远近物体的大小和位置。
  • 1:表示同次坐标。

透视变换矩阵通过这些参数可以实现平移、旋转、缩放、剪切以及透视变换等操作,在图像处理中尤为重要,特别是在将三维场景投影到二维平面时。


以下是一个使用 Python 和 OpenCV 实现透视变换的例子。在这个例子中,我们会读取一张图片,指定四个源点和目标点,使用透视变换矩阵将图像从一个平面投影到另一个平面。

安装 OpenCV

首先,确保你安装了 OpenCV:

pip install opencv-python

代码示例:

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取输入图像
image = cv2.imread('input_image.jpg')

# 显示原始图像
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title("Original Image")
plt.show()

# 定义原始图像中的四个点(源点)
src_points = np.float32([[50, 50], [400, 50], [50, 400], [400, 400]])

# 定义变换后的四个点(目标点)
dst_points = np.float32([[10, 100], [400, 50], [100, 500], [400, 450]])

# 计算透视变换矩阵
matrix = cv2.getPerspectiveTransform(src_points, dst_points)

# 执行透视变换
result_image = cv2.warpPerspective(image, matrix, (image.shape[1], image.shape[0]))

# 显示变换后的图像
plt.imshow(cv2.cvtColor(result_image, cv2.COLOR_BGR2RGB))
plt.title("Transformed Image")
plt.show()

解释:

  1. cv2.imread('input_image.jpg'): 读取一张输入图像。请确保文件路径正确。
  2. src_pointsdst_points: 分别是原始图像和目标图像上的四个点的坐标。你可以根据需要调整这些坐标来执行不同的变换。
  3. cv2.getPerspectiveTransform(src_points, dst_points): 计算透视变换矩阵。
  4. cv2.warpPerspective(image, matrix, (width, height)): 根据透视变换矩阵对图像进行透视变换,widthheight 是变换后图像的尺寸。
  5. plt.imshow(): 使用 matplotlib 显示原图和变换后的图像。

注意:

  • src_points 是你选择的原始图像中的四个点,它们应该构成一个矩形或四边形。
  • dst_points 是你想要将这些点映射到的目标位置,可以是任何四个点。
  • 图像的输出会通过 plt.imshow() 显示在窗口中。

通过这个例子,你可以对图像应用透视变换,从而实现例如校正、图像扭曲、或者从不同的视角查看图像等效果。


通过 Python 和 OpenCV 实现一个示例,其中我们逐步修改透视变换矩阵的不同参数,以展示每个参数如何影响图像变换的效果。通过这个练习,你将看到透视变换矩阵每个元素的不同含义。

步骤:

  1. 导入必要的库:OpenCV 和 matplotlib
  2. 读取原图:展示原始图像
  3. 设置四个源点和目标点:这些点将用于计算透视变换矩阵
  4. 逐步修改矩阵中的每个参数:看看它们如何影响变换后的图像。

代码实现:

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
image = cv2.imread('input_image.jpg')

# 显示原图
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title("Original Image")
plt.show()

# 定义原始图像中的四个源点(源点的位置可以根据实际需要选择)
src_points = np.float32([[50, 50], [400, 50], [50, 400], [400, 400]])

# 定义目标图像中的四个点(目标点的位置可以逐步修改)
dst_points = np.float32([[50, 100], [400, 50], [100, 500], [400, 450]])

# 计算透视变换矩阵
matrix = cv2.getPerspectiveTransform(src_points, dst_points)

# 执行透视变换
result_image = cv2.warpPerspective(image, matrix, (image.shape[1], image.shape[0]))

# 显示变换后的图像
plt.imshow(cv2.cvtColor(result_image, cv2.COLOR_BGR2RGB))
plt.title("Transformed Image")
plt.show()

逐步修改矩阵中的每个参数:

接下来,我们逐步修改透视变换矩阵中的参数,看看它们如何影响图像。

1. 修改 gh 参数 - 观察透视效果:

# 修改 g 和 h 的值,控制透视效果
new_dst_points = np.float32([[50, 100], [400, 50], [100, 500], [400, 450]])

# 计算新的透视变换矩阵
matrix_with_perspective = cv2.getPerspectiveTransform(src_points, new_dst_points)

# 执行变换
transformed_image_perspective = cv2.warpPerspective(image, matrix_with_perspective, (image.shape[1], image.shape[0]))

# 显示变换后的图像
plt.imshow(cv2.cvtColor(transformed_image_perspective, cv2.COLOR_BGR2RGB))
plt.title("Transformed Image with Perspective Effect")
plt.show()

2. 修改 ae 参数 - 观察缩放效果:

# 修改缩放比例,改变 a 和 e
src_points_scaled = np.float32([[50, 50], [450, 50], [50, 450], [450, 450]])
dst_points_scaled = np.float32([[50, 100], [450, 50], [150, 500], [450, 450]])

# 计算新的透视变换矩阵
matrix_scaled = cv2.getPerspectiveTransform(src_points_scaled, dst_points_scaled)

# 执行变换
transformed_image_scaled = cv2.warpPerspective(image, matrix_scaled, (image.shape[1], image.shape[0]))

# 显示变换后的图像
plt.imshow(cv2.cvtColor(transformed_image_scaled, cv2.COLOR_BGR2RGB))
plt.title("Transformed Image with Scaling Effect")
plt.show()

3. 修改 cf 参数 - 观察平移效果:

# 修改平移值,改变 c 和 f
new_dst_points_translation = np.float32([[100, 150], [500, 150], [100, 600], [500, 600]])

# 计算新的透视变换矩阵
matrix_translation = cv2.getPerspectiveTransform(src_points, new_dst_points_translation)

# 执行变换
transformed_image_translation = cv2.warpPerspective(image, matrix_translation, (image.shape[1], image.shape[0]))

# 显示变换后的图像
plt.imshow(cv2.cvtColor(transformed_image_translation, cv2.COLOR_BGR2RGB))
plt.title("Transformed Image with Translation Effect")
plt.show()

4. 修改 a, b, d, e 参数 - 观察剪切和旋转效果:

# 修改旋转和剪切效果,改变 a, b, d, e
new_dst_points_skew = np.float32([[100, 50], [400, 50], [50, 400], [450, 450]])

# 计算新的透视变换矩阵
matrix_skew = cv2.getPerspectiveTransform(src_points, new_dst_points_skew)

# 执行变换
transformed_image_skew = cv2.warpPerspective(image, matrix_skew, (image.shape[1], image.shape[0]))

# 显示变换后的图像
plt.imshow(cv2.cvtColor(transformed_image_skew, cv2.COLOR_BGR2RGB))
plt.title("Transformed Image with Skew Effect")
plt.show()

总结:

  • gh 参数:控制透视效果,产生深度和视角的变化。
  • ae 参数:控制图像的缩放效果。
  • cf 参数:控制图像的平移效果。
  • a, b, d, e 参数:控制旋转、剪切等线性变换。

通过这些代码段,你可以看到每个参数如何逐步影响图像的透视效果,理解透视变换矩阵中的每个参数的作用。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐