二维几何变换python 二维几何变换实验心得

掌握线性代数: 了解线性变换及其几何意义


向量变换简介

线性代数中许多问题的核心在于线性变换的概念。简单地说,线性变换是两个向量空间之间的函数,它保留了向量加法和标量乘法的运算。这些转换将抽象的数学理论转化为有形的、现实世界的应用。


1. 什么是线性变换和非线性变换?

线性变换和非线性变换是线性代数和几何学中的基本概念,用于区分不同的运算如何影响向量空间中的点或形状。

线性变换

线性变换是两个向量空间之间的映射,它保留了向量加法和标量乘法的运算。如果变换 T 满足任何向量 uv 以及任何标量 c 的以下两个属性,则认为该变换 T 是线性的:

  1. 加法:T(u + v) = T(u) + T(v)
  2. 同种:T(c?u) = c?T(u)

线性变换的最常见示例包括:

  • 旋转:绕轴旋转形状而不更改其大小或形状。
  • 反射:在直线或平面上翻转形状。
  • 平移:将形状从一个位置移动到另一个位置,而不改变其大小或方向。

属性:进行这些转换后,形状将保留:

  • 相同尺寸
  • 相同面积
  • 相同的角度
  • 相同的行长

非线性变换

非线性变换不会保留向量加法和标量乘法的属性。这些变换可以扭曲弯曲或更改对象的形状。示例包括:

  • 调整大小(也称为膨胀、收缩、扩展或压缩):更改形状的大小,同时可能更改其比例或比率。

2. 在 2D 和 3D 中可视化线性变换

要完全掌握线性变换,可视化它们如何影响平面或空间中的矢量和形状会很有帮助。在 2D 中,线性变换可以由描述变换如何改变标准基向量的矩阵来表示。

例如,考虑 2D 转换矩阵 A:

此矩阵转换向量:

转换为新向量:

旋转示例(旋转 °):在二维中将矢量逆时针旋转角度 θ 的旋转矩阵由下式给出:

将此矩阵应用于向量会使其绕原点旋转 θ 度。

在这里尝试一下:

得到:

扩展示例:沿两个轴将向量大小加倍的缩放矩阵为:

此转换会拉伸空间,使对象看起来更大:

在 3D 中,转换的操作类似,但具有额外的维度。可视化这些变换有助于我们了解它们的效果,例如围绕轴旋转对象或沿一个或多个维度缩放对象。

3. 在 Python 中实现线性变换

在这里,我们将在 2D 中实现和可视化一个简单的线性变换。

此代码转换单个 vector 并显示 before 和 after 状态:

import numpy as np
import matplotlib.pyplot as plt

def plot_vector(ax, vector, color):
    ax.quiver(0, 0, vector[0], vector[1], angles='xy', scale_units='xy', scale=1, color=color)

def plot_transformation(vector, matrix):
    # Create subplots
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(, 5))
    
    # Plot original vector
    ax1.set_title("Original Vector")
    ax1.set_xlim(-5, 5)
    ax1.set_ylim(-5, 5)
    ax1.grid(True)
    plot_vector(ax1, vector, 'b')
    
    # Apply transformation
    transformed_vector = np.dot(matrix, vector)
    
    # Plot transformed vector
    ax2.set_title("Transformed Vector")
    ax2.set_xlim(-5, 5)
    ax2.set_ylim(-5, 5)
    ax2.grid(True)
    plot_vector(ax2, transformed_vector, 'r')
    
    plt.tight_layout()
    plt.show()

# Define a vector
vector = np.array([2, 3])

# Define a transformation matrix (e.g., -degree rotation)
theta = np.pi/2  #  degrees
matrix = np.array([[np.cos(theta), -np.sin(theta)],
                   [np.sin(theta), np.cos(theta)]])
plot_transformation(vector, matrix)

输出:

定义了两个函数:

  • plot_vector():用于在给定轴上绘制向量的辅助函数。
  • plot_transformation():主要功能是将转换可视化。

4. 将转换应用于真实世界的数据

线性变换并不局限于抽象向量空间;它们在许多领域都有实际应用,例如图像处理。例如,您可以应用转换来缩放或旋转图像。

示例:使用 Python 进行图像缩放和旋转

让我们来看看如何使用 Python 将线性变换应用于图像:

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

def apply_transformation(image, matrix):
    rows, cols = image.shape[:2]
    return cv2.warpAffine(image, matrix, (cols, rows))

def plot_images(original, scaled, rotated):
    fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(, 5))
    
    ax1.imshow(cv2.cvtColor(original, cv2.COLOR_BGR2RGB))
    ax1.set_title('Original Image')
    ax1.axis('off')
    
    ax2.imshow(cv2.cvtColor(scaled, cv2.COLOR_BGR2RGB))
    ax2.set_title('Scaled Image')
    ax2.axis('off')
    
    ax3.imshow(cv2.cvtColor(rotated, cv2.COLOR_BGR2RGB))
    ax3.set_title('Rotated Image')
    ax3.axis('off')
    
    plt.tight_layout()
    plt.show()

# Load an image (replace with your own image path)
image = cv2.imread('ML.png')

# Scaling transformation
scale_factor = 
scale_matrix = np.array([[scale_factor, 0, 0],
                         [0, scale_factor, 0]])
scaled_image = apply_transformation(image, scale_matrix)

# Rotation transformation
angle =   # degrees
rows, cols = image.shape[:2]
rotation_matrix = cv2.getRotationMatrix2D((cols/2, rows/2), angle, 1)
rotated_image = apply_transformation(image, rotation_matrix)

# Display the results
plot_images(image, scaled_image, rotated_image)

输出:

定义了两个辅助函数:

  • apply_transformation():使用 OpenCV 的 warpAffine() 函数将给定的变换矩阵应用于图像。
  • plot_images() :并排显示原始图像、缩放图像和旋转图像。

结论

线性变换是线性代数中的强大工具,既提供理论见解,又提供实际应用。从在 2D 和 3D 空间中旋转和缩放对象到处理图像,了解这些转换对于在涉及数学、工程或计算机科学领域工作的任何人来说都至关重要。

原文链接:,转发请注明来源!