【计算机视觉】二、图像形成: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.mzph.cn/news/747614.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

echarts绘制 联系词(关键字)

<template><div><div>【关键词条】</div><div ref"target" class"w-full h-full" stylewidth:300px;height:300px></div></div> </template><script setup> import { ref, onMounted,watch } from …

使用docker-compose部署Redis集群

一、部署三主三从的Redis集群 分别为6个节点建立挂载目录&#xff0c;每个目录下建立数据、配置、日志文件夹。 docker-compose内容如下&#xff1a; version: 3 services:redis1:image: redis:6.2.3restart: alwaysports:- "6379:6379"- "16379:16379"v…

融入Facebook的世界:探索数字化社交的魅力

融入Facebook的世界&#xff0c;是一场数字化社交的奇妙之旅。在这个广袤的虚拟社交空间中&#xff0c;人们可以尽情展现自己、分享生活&#xff0c;与全球朋友、家人和同事保持紧密联系&#xff0c;共同探索社交互动的乐趣与魅力。让我们深入了解这个世界的魅力所在&#xff1…

基于SpringBoot+Vue的电商应用系统的设计与实现

1 绪论 1.1研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。这样的大环境让那些止步不前&…

2.2 HTML5保留的常用标签

2.2.1 基础标签 1. 段落标签<p> 段落标签<p>和</p>用于形成一个新的段落&#xff0c;段落与段落之间默认为空一行进行分割。 2. 标题标签<h1>-<h6> HTML5使用<hn>和</hn>来标记文本中的标题&#xff0c;其中n需要替换为数字&#x…

腾讯云对象存储的在Java使用步骤介绍

腾讯云对象存储的在Java使用步骤介绍 创建一个腾讯云的账户 这个自己去创建&#xff0c;然后开通对象存储服务&#xff0c;如下 有了账号就要创建一个对象存储的桶&#xff0c;也就是存储对象的一个容器 如果你想只有自己放存放的就设置 私有读写 &#xff0c;如果想用网络直…

webstorm如何调试uniapp项目

1、webstorm安装Uniapp Tool项目&#xff0c;并根据要求配置Hbuilder和微信开发者工具&#xff1b; 2、运行/调试配置 3、运行uniapp项目&#xff0c;然后运行调试即可愉快的在webstorm上加断点调试了

【技术类-03】python实现docx表格文字的“手动换行符(软回车)”变成“段落标记(硬回车)”

作品展示——docx表格内的手动换行符更改硬回车 背景需求&#xff1a; 这篇成功把docx文本段落&#xff08;无表格&#xff09;中的“手动换行符&#xff08;软回车&#xff09;”变成“段落标记&#xff08;硬回车&#xff09;。 【技术类-02】python实现docx段落文字的“手…

企业内部培训考试系统单场培训会议解决方案

企业日常内训中&#xff0c;有些时候也会组织会议培训&#xff0c;再按照会议日程分上下午签到进行培训考勤&#xff0c;并形成培训签到表&#xff0c;如果用活动报名工具&#xff0c;一般只能实现单次的签到考勤&#xff0c;如果用培训班系统则操作过于繁琐&#xff0c;不利于…

子查询 封装属性创建Connection连接类 数据库连接池

子查询 在select语句中包含另一个select 语句 -->子查询 子查询的分类 单行单列子查询 在where子句中使用 运算符 ! > < -- 查询工资比公司平均工资高的员工信息 -- 查询与员工’smith‘同职位的员工信息 -- 查询比员工joins入职…

工业制造领域系统:SCADA、PLC、DCS、MES、HMI、ERP等,一文秒懂

工业制造控制系统在工业制造领域起到了关键的作用&#xff0c;帮助企业提高生产效率、降低成本、提高产品质量和安全性。不同的企业根据自身需求和规模&#xff0c;可能会选择使用其中的一种或多种系统。 SCADA系统&#xff08;Supervisory Control and Data Acquisition&…

数据和类型转换

文章目录 数据类型数字类型数字操作NaNJavaScript算术运算符的执行顺序 字符串类型&#xff08;string&#xff09;字符串拼接模板字符串 未定义类型&#xff08;undefined&#xff09;布尔类型&#xff08;boolean&#xff09;null&#xff08;空类型&#xff09; 类型转换显式…

【DL经典回顾】激活函数大汇总(十三)(Sinc SwiGLU附代码和详细公式)

激活函数大汇总&#xff08;十三&#xff09;&#xff08;Sinc & SwiGLU附代码和详细公式&#xff09; 更多激活函数见激活函数大汇总列表 一、引言 欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里&#xff0c;激活函数扮演着不可…

ARM 寄存器学习:(一)arm多种模式下得寄存器

一.ARM7种状态以及每种状态的寄存器&#xff1a; ARM 处理器共有 7 种不同的处理器模式&#xff0c;在每一种处理器模式中可见的寄存器包括 15 个通用寄存器( R0~R14)、一个或两个(User和Sys不是异常模式&#xff0c;没有spsr寄存器)状态寄存器&#xff08;cpsr和spsr&…

Unity开发一个FPS游戏之二

在之前的文章中,我介绍了如何开发一个FPS游戏,添加一个第一人称的主角,并设置武器。现在我将继续完善这个游戏,打算添加敌人,实现其智能寻找玩家并进行对抗。完成的效果如下: fps_enemy_demo 下载资源 首先是设计敌人,我们可以在网上找到一些好的免费素材,例如在Unity…

KKView远程控制: todesk内网穿透

Todesk内网穿透&#xff1a;实现远程访问的新途径 在数字化时代&#xff0c;远程访问已成为许多企业和个人的基本需求。Todesk作为一款远程桌面控制软件&#xff0c;其内网穿透功能为用户提供了便捷、安全的远程访问体验。本文将介绍Todesk内网穿透的原理、应用场景及其优势&a…

【C++ 】list 类

1. 标准库中的list类 list 类 的介绍&#xff1a; 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代 2. list与forward_list非常相似&#xff1a;最主要的不同在于forward_list是单链表 3. 与其他的序列式容器相比(a…

爆肝总结,Python接口自动化测试-接口关联实例,一文打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 参数关联&#xf…

Python解释器安装

下载Python解释器 如果您从未安装过Python解释器&#xff0c;那么在编写Python代码前需要安装该解释器。什么是Python解释器呢&#xff1f; “Python解释器”就像是一个能够理解和执行Python编程语言的“翻译官”。你写的Python代码&#xff08;一系列指令&#xff09;需要有一…

Redis:持久化、线程模型、大 key

Redis持久化方式有什么方式&#xff1f; Redis 的读写操作都是在内存中&#xff0c;所以 Redis 性能才会高&#xff0c;但是当 Redis 重启后&#xff0c;内存中的数据就会丢失&#xff0c;那为了保证内存中的数据不会丢失&#xff0c;Redis 实现了数据持久化的机制&#xff0c…