【计算机视觉】二、图像形成:2、几何基元和几何变换:2D变换

文章目录

  • 一、向量和矩阵的基本运算
  • 二、几何基元和变换
    • 1、几何基元(Geometric Primitives)
    • 2、几何变换(Geometric Transformations)
      • 1. 各种变换的关系
      • 2. 变换公式
      • 3. 2D变换的层次
      • 4. python实现

一、向量和矩阵的基本运算

【计算机视觉】二、图像形成:1、向量和矩阵的基本运算:线性变换与齐次坐标

二、几何基元和变换

1、几何基元(Geometric Primitives)

  几何基元是计算机图形学中最基本的图形对象,它们是构建更复杂图形的基础单元。常见的几何基元包括:

  • 点(Point): 由一对或一组坐标值表示的零维对象。
  • 线段(Line Segment): 由两个端点确定的一维对象。
  • 多边形(Polygon): 由一系列顶点连接而成的闭合平面图形,是二维对象。
  • 曲线(Curve): 由一系列控制点和方程确定的平滑曲线,如贝塞尔曲线、样条曲线等。
  • 圆(Circle): 由一个圆心和半径确定的二维闭合曲线。
  • 球体(Sphere): 由一个球心和半径确定的三维闭合曲面。

  这些基本的几何基元可以通过组合、变换等操作构建出更加复杂的图形对象,如三维模型、场景等。

2、几何变换(Geometric Transformations)

  几何变换是针对几何基元进行的一系列操作,用于改变其位置、大小、形状或其他属性。常见的几何变换包括:

  • 平移变换(Translation): 沿着一个向量移动对象的位置。
  • 旋转变换(Rotation): 围绕一个点或轴旋转对象。
  • 缩放变换(Scaling): 改变对象的大小,可以是统一缩放或按不同比例缩放。
  • 剪切变换(Shearing): 沿着一个方向倾斜对象。
  • 反射变换(Reflection): 沿着一条线或一个平面对称地反射对象。

  上述变换可以分为 刚体变换 (如平移和旋转)和 非刚体变换 (如缩放、剪切和反射)。刚体变换不改变对象的形状和大小,只改变其位置和方向。非刚体变换会改变对象的形状或大小。此外,还有一些更复杂的变换:

  • 欧几里得变换=刚体变换=等距变换
  • 相似变换(Similarity Transformation): 包括欧几里得变换和等比例缩放。
  • 仿射变换(Affine Transformation): 包括相似变换、缩放、反射和剪切。
  • 射影变换(Projective Transformation): 也称透视变换,可以将三维物体投影到二维平面上。

  几何变换通常使用矩阵表示,对点或向量进行矩阵乘法即可完成变换操作。不同的变换对应不同的变换矩阵。

1. 各种变换的关系

  使用文氏图(Venn diagram)的形式展示二维变换之间的关系和包含情况:

在这里插入图片描述

  • 最内层圆圈表示恒等变换(Identity)和旋转变换(Rotation)。
  • 包围它的第二层椭圆表示刚体变换(Rigid/Euclidean),它包含了平移(Translation)和旋转变换。
  • 第三层椭圆表示相似变换(Similitudes),除了包含刚体变换之外,还包含等比例缩放(Isotropic Scaling)。
    • 相似变换只包含等比例缩放而没有一般的缩放。
  • 最后一个椭圆表示线性变换(Linear),它包括缩放(Scaling)、反射(Reflection)和错切(Shear)等一般线性变换。

2. 变换公式

  1. 平移变换

    • 二维平移: x ′ = [ I t ] x x' = \begin{bmatrix}I & t\end{bmatrix}x x=[It]x
    • 或: x ′ = [ I t 0 T 1 ] x x' = \begin{bmatrix}I & t\\0^T & 1\end{bmatrix}x x=[I0Tt1]x
  2. 欧式变换(旋转+平移)

    • 二维欧式: x ′ = [ R t ] x x' = \begin{bmatrix}R & t\end{bmatrix}x x=[Rt]x
      其中R是2x2旋转矩阵: R = [ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] R = \begin{bmatrix}\cos\theta & -\sin\theta\\\sin\theta & \cos\theta\end{bmatrix} R=[cosθsinθsinθcosθ]
  3. 相似变换(缩放+旋转+平移)

    • 二维相似: x ′ = [ s R t ] x x' = \begin{bmatrix}sR & t\end{bmatrix}x x=[sRt]x
      其中s为等比例缩放因子,R为旋转矩阵
  4. 仿射变换

    • 二维仿射: x ′ = [ a 00 a 01 a 02 a 10 a 11 a 12 ] x x' = \begin{bmatrix}a_{00} & a_{01} & a_{02}\\a_{10} & a_{11} & a_{12}\end{bmatrix}x x=[a00a10a01a11a02a12]x
  5. 射影变换

    • 二维射影: x ′ = H x ,   H  为任意3x3矩阵 x' = Hx,\ H\ \text{为任意3x3矩阵} x=Hx, H 为任意3x3矩阵

这些变换矩阵提供了将点或向量从一个坐标空间变换到另一个坐标空间的数学表示方法,是计算机图形学、计算机视觉等领域的基础工具。通过设计合适的变换矩阵,可以实现各种几何变换,例如平移、旋转、缩放、透视投影等。

不同类型的变换矩阵在形式和自由度上有所区别,平移矩阵比较简单,相似变换增加了缩放,仿射变换支持非等比缩放和错切,而射影变换是最通用的。矩阵的秩决定了变换的自由度和约束条件。

3. 2D变换的层次

  自由度越高,变换的灵活性就越大,但保留的不变性也就越少。最右侧的图标展示了了这些变换所保留的不变性:平移保留方向、刚体保留长度、相似保留角度、仿射保留平行线、射影只保留直线不变

在这里插入图片描述

  1. 平移变换(translation)
    矩阵形式: [ I t ] 2 × 3 \begin{bmatrix}I & t\end{bmatrix}_{2\times 3} [It]2×3
    自由度: 2 (对应x,y平移分量)
    保留不变性: 方向(orientation)

  2. 刚体变换(rigid/Euclidean)
    矩阵形式: [ R t ] 2 × 3 \begin{bmatrix}R & t\end{bmatrix}_{2\times 3} [Rt]2×3
    自由度: 3 (1个旋转分量+2个平移分量)
    保留不变性: 长度(lengths)

  3. 相似变换(similarity)
    矩阵形式: [ s R t ] 2 × 3 \begin{bmatrix}sR & t\end{bmatrix}_{2\times 3} [sRt]2×3
    自由度: 4 (1个旋转分量+1个缩放分量+2个平移分量)
    保留不变性: 角度(angles)

  4. 仿射变换(affine)
    矩阵形式: [ A ] 2 × 3 \begin{bmatrix}A\end{bmatrix}_{2\times 3} [A]2×3
    自由度: 6 (组合缩放、错切、旋转、平移)
    保留不变性: 平行线(parallelism)

  5. 射影变换(projective)
    矩阵形式: [ H ] 3 × 3 \begin{bmatrix}H\end{bmatrix}_{3\times 3} [H]3×3
    自由度: 8
    保留不变性: 直线(straight lines)

4. python实现

import numpy as np


# 1. 平移变换
def translation(tx, ty):
    T = np.array([[1, 0, tx],
                  [0, 1, ty],
                  [0, 0, 1]])
    return T


# 2. 欧式变换(旋转+平移)
def rigid_transform(theta, tx, ty):
    T = np.array([[np.cos(theta), -np.sin(theta), tx],
                  [np.sin(theta), np.cos(theta), ty],
                  [0, 0, 1]])
    return T


# 3. 相似变换(缩放+旋转+平移)
def similarity_transform(s, theta, tx, ty):
    T = np.array([[s * np.cos(theta), -s * np.sin(theta), tx],
                  [s * np.sin(theta), s * np.cos(theta), ty],
                  [0, 0, 1]])
    return T


# 4. 仿射变换
def affine_transform(a00, a01, a02, a10, a11, a12):
    T = np.array([[a00, a01, a02],
                  [a10, a11, a12],
                  [0, 0, 1]])
    return T


# 5. 射影变换
def projective_transform(H):
    return H


# 使用示例
points = np.array([[1, 2], [3, 4], [5, 6]])

# 平移变换
T = translation(10, 20)
new_points = np.hstack([points, np.ones((3, 1))]).dot(T.T)[:, :2]
print(new_points)

# 欧式变换
R = rigid_transform(np.pi / 4, 10, 20)
new_points = np.hstack([points, np.ones((3, 1))]).dot(R.T)[:, :2]
print(new_points)

# 相似变换 
S = similarity_transform(0.5, np.pi / 3, 10, 20)
new_points = np.hstack([points, np.ones((3, 1))]).dot(S.T)[:, :2]
print(new_points)

# 仿射变换
A = affine_transform(1, 0.5, 10, 0, 1, 20)
new_points = np.hstack([points, np.ones((3, 1))]).dot(A.T)[:, :2]
print(new_points)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/459776.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工业物联网平台在水务环保、暖通制冷、电力能源等行业的应用

随着科技的不断发展,工业物联网平台作为连接物理世界与数字世界的桥梁,正逐渐成为推动各行业智能化转型的关键力量。在水务环保、暖通制冷、电力能源等行业,工业物联网平台的应用尤为广泛,对于提升运营效率、降低能耗、优化管理等…

【C++设计模式】UML图的介绍及其画法

文章目录 前言一、UML图的介绍1.1 UML图是什么1.2 UML图的作用 二、UML图的画法2.1 最简单的UML图2.2 继承的UML图2.3 关联关系2.4 聚合关系2.5 组合关系2.6 依赖关系 总结 前言 在软件开发过程中,设计模式是一种被广泛应用的方法,它为解决特定问题提供…

利用数据驱动的MEG分析方法提取fMRI静息态网络

摘要 静息态网络(RSN)的电生理基础仍存在争议。特别是,尚未确定一个能够同样有效解释所有静息态网络的原理性机制。虽然脑磁图(MEG)和脑电图(EEG)是确定RSN电生理基础的首选方法,但目前没有标准的RSN分析流程。本文比较了从MEG数据中提取RSNs的两种现有…

Profinet转CC-Link网关操作技巧及功能

Profinet转CC-Link网关(XD-PNCR20)是一款可有效连接CCLINK总线和Profinet网络的通讯网关。Profinet转CC-Link网关主要功能是将各种CCLINK总线和Profinet网络连接起来,实现各种总线的互联通信。 Profinet转CC-Link网关连接到Profinet总线中做…

电源常用通讯电路详解

数字电源的采样和PWM驱动电路原理,通过这些技术,数字电源可以在内部形成控制闭环。但是要实现电源的控制和管理,还是需要与数字控制核心建立通讯连接。本期将带领大家了解数字电源常用的通讯电路。 一、常用的通讯方式 在前面数字电源与模拟…

Could not transform the global plan to the frame of the controller

报错: [ERROR] [1710509295.679888409, 296.695000000]: Extrapolation Error: Lookup would require extrapolation 0.003000000s into the future. Requested time 295.747000000 but the latest data is at time 295.744000000, when looking up transform from…

详解C++运算符重载

目录 运算符重载 1.运算符重载概念的回顾 2. 运算符重载 3. < 运算符重载 4. 赋值运算符 4.1赋值运算符和拷贝构造的区别 4.2赋值运算符重载格式 4.3 默认赋值重载 运算符重载 1.运算符重载概念的回顾 C为了增强代码的可读性引入了运算符重载&#xff0c;运…

力扣题目训练(21)

2024年2月14日力扣题目训练 2024年2月14日力扣题目训练605. 种花问题617. 合并二叉树628. 三个数的最大乘积289. 生命游戏299. 猜数字游戏149. 直线上最多的点数 2024年2月14日力扣题目训练 2024年2月14日第二十一天编程训练&#xff0c;今天主要是进行一些题训练&#xff0c;…

fortran,进坟墓了吗?新型快速开发工具突现,该何去何从?

在C、Python等流行语言风头正劲的时候&#xff0c;Fortran对于新一代开发者而言&#xff0c;却显得陌生甚至闻所未闻。 然而&#xff0c;Fortran作为计算机领域首个被广泛推广的高级语言&#xff0c;自1956年诞生至今已逾60载&#xff0c;承载着无数程序员的青春记忆。 在许多…

蓝桥杯 - 大石头的搬运工 C++ 前缀和 算法 附Java python

题目 思路和解题方法 这段代码的目标是计算给定点集的最小总移动成本&#xff0c;使得所有点都在同一直线上。它通过计算每个点左边和右边的移动成本&#xff0c;然后在所有可能的分割点中选择最小成本。具体步骤如下&#xff1a; 读取输入的点集&#xff0c;每个点表示为 (y, …

十三、项目相关方管理

十三、项目相关方管理 1、项目相关方管理 ​ 识别相关方是定期识别相关项目方&#xff0c;分析和记录他们的利益、参与度、相互依赖性、影响力和对项目成功的潜在影响的过程。 ** 1.1 关键技术 数据表现 相关方分析会产品相关方清单和关于相关方的各种信息&#xff0c;例如…

【机器学习】走进监督学习:构建智能预测模型的第一步

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

沃通SSL证书证券行业应用案例

金融证券行业作为现代经济体系中的重要组成部分&#xff0c;其安全性直接关系到国家经济的稳定和广大投资者的利益。沃通SSL证书基于密码技术保护传输数据的机密性、完整性&#xff0c;通过权威身份认证确保服务器身份真实性&#xff0c;已持续为众多知名证券行业客户提供服务&…

【图像分类】基于深度学习的人脸表情识别(开心、悲伤、生气三个类别,ResNet网络)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。(专栏订阅用户订阅专栏后免费提供数据集和源码一份,超级VIP用户不在服务范围之内,不想订阅专栏的兄弟们可以私信…

恒创科技:什么是BGP线路服务器?BGP机房的优点是什么?

在当今的互联网架构中&#xff0c;BGP(边界网关协议)线路服务器和BGP机房扮演着至关重要的角色。BGP作为一种用于在自治系统(AS)之间交换路由信息的路径向量协议&#xff0c;它确保了互联网上的数据能够高效、准确地从一个地方传输到另一个地方。那么&#xff0c;究竟什么是BGP…

sklearn.model_selection.learning_curve的详细介绍(包含ShuffleSplit()介绍)

提示&#xff1a;sklearn.model_selection.learning_curve的详细介绍 文章目录 1、需求分析2、learning_curve主要输出参数3、learning_curve主要参数4、learning_curve作用5、learning_curve代码6、ShuffleSplit&#xff08;&#xff09; 1、需求分析 通过参数train_size选取…

OJ_点菜问题(背包问题)

题干 C实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<vector> using namespace std;int main() {int c, n;scanf("%d%d", &c, &n);int p[101];int v[101];for (int i 0; i < n; i){scanf("%d%d", &p[i],…

深入探讨MES管理系统与MOM系统之间的关系

在制造业的信息化浪潮中&#xff0c;各种系统与技术层出不穷&#xff0c;其中MES制造执行系统和MOM制造运营管理无疑是备受瞩目的两大主角。尽管它们都是制造业信息化不可或缺的部分&#xff0c;但许多人对它们之间的区别与联系仍感到困惑。本文将对MES管理系统和MOM系统进行深…

一键分割,瞬间转换!轻松驾驭视频的无限可能

在数字化的世界里&#xff0c;视频内容已成为我们日常生活与工作中不可或缺的一部分。然而&#xff0c;处理这些多媒体文件时&#xff0c;常常需要花费大量的时间和精力进行分割、转换和编辑。现在&#xff0c;有了这款强大的“一键分割与转换”工具&#xff0c;你将能够轻松驾…

细说C++反向迭代器:原理与用法

文章目录 一、引言二、反向迭代器的原理与实现细节三、模拟实现C反向迭代器反向迭代器模板类的设计反向迭代器的使用示例与测试 一、引言 迭代器与反向迭代器的概念引入 迭代器&#xff08;Iterator&#xff09;是C标准模板库&#xff08;STL&#xff09;中的一个核心概念&am…
最新文章