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

news2025/3/10 21:02:48

文章目录

  • 一、向量和矩阵的基本运算
  • 二、几何基元和变换
    • 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.coloradmin.cn/o/1519591.html

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

相关文章

【研发日记】Matlab/Simulink技能解锁(五)——Simulink布线技巧

前言 见《【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug》 见《【研发日记】Matlab/Simulink技能解锁(二)——在Function编辑窗口Debug》 见《【研发日记】Matlab/Simulink技能解锁(三)——在Stateflow编辑窗口Debug》 见《【研发日记】Matlab/Simulink…

HarmonyOS ArkUI入门—HarmonyOS ArkUI来开发一个健康饮食应用

本文演示如果在DevEco Studio 3里面,用HarmonyOS的ArkUI来开发一个健康饮食应用。体验HarmonyOS 3最新API 9! 获取HarmonyOS应用 HarmonyOS的ArkUI来开发一个健康饮食的ArkUI程序“ArkUIHealthyDiet”,基础代码已经有了[1],个人…

DHCP-SNOOPING-嗅探/窥探

DHCP-SNOOPING 私接设备了,非终端收到了报文 所有接口设置为非信任,然后单独配置其中一个接口为信任

《ARM汇编与逆向工程 蓝狐卷 基础知识》

推荐一本专注于Arm逆向分析技术的好书《ARM汇编与逆向工程 蓝狐卷 基础知识》,3月21日将在点赞者中抽取粉丝进行本书包邮免费赠送。 目录 正文内容简介作者简介译者简介目录了解更多 正文 与传统的CISC(Complex Instruction Set Computer,复…

聚道云连接器助力航信费控与用友U8无缝对接,赋能供应链管理!

客户介绍 某供应链管理有限公司是一家专注于供应链管理和物流服务的领先企业,在行业内享有盛誉。公司业务遍布全球,拥有庞大的客户群和丰富的行业经验。近年来,公司不断加大数字化投入,以提升运营效率和服务水平。 客户痛点 在…

springboot274基于web的电影院购票系统

电影院购票系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装电影院购票系统软件来发挥其高效…

渗透测试实战思路分析

免责声明:文章来源真实渗透测试,已获得授权,且关键信息已经打码处理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人…

单片机设计-基于树莓派的wifi小车的设计与实现

项目介绍 有两个目的:1)实现wifi小车的基本功能:使用树莓派(单片机)以及各种电子元器件,组装完成一个智能小车,通过Python、Java、C控制树莓派(单片机)的GPIO&#xff0…

LoadRunner学习:RuntimeSetting、参数化、关联、(unfinished

LoadRunner RuntimeSetting 运行时设置 在Vuser中设置Run-time Settings RunLogic:运行逻辑,决定了脚本真正执行逻辑, Init和End部分代码只能执行一次。决定脚本真正执行逻辑的意思是,在Run中的代码和Number of Iteration决定了…

【Leetcode每日一题】 递归 - 反转链表(难度⭐)(35)

1. 题目解析 题目链接:206. 反转链表 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 一、递归函数的核心任务 递归函数的主要职责是接受一个链表的头指针,并返回该链表逆序后的新头结点。递归…

Linux从0到1——Linux第一个小程序:进度条

Linux从0到1——Linux第一个小程序&#xff1a;进度条 1. 输出缓冲区2. 回车和换行的本质3. 实现进度条3.1 简单原理版本3.2 实际工程版本 1. 输出缓冲区 1. 小实验&#xff1a; 编写一个test.c文件&#xff0c;&#xff1a; #include <stdio.h> #include <unistd.h…

‘sqlcmd‘不是内部或外部命令,也不是可运行的程序或批处理文件。

目录 一、问题 二、下载&安装sqlcmd 实用工具 三、验证 四、结果 一、问题 今天使用批处理文件执行SQLServer数据库的SQL语法时报错&#xff0c;提示sqlcmd不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。&#xff0c;发生这个问题的原因是当前系统缺少…

【开发工具学习_Xshell介绍与安装】

开发工具学习_Xshell介绍与安装 开发工具学习_Xshell介绍与安装Xshell介绍Xshell安装 开发工具学习_Xshell介绍与安装 Xshell介绍 Xshell [1]是一个强大的安全终端模拟软件&#xff0c;它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主…

107. 如何使用Docker以及Docker Compose部署Go Web应用

文章目录 一、为什么需要Docker&#xff1f;二、Docker部署示例1. 准备代码2. 创建Docker镜像3. 编写Dockerfile4. Dockerfile解析5. 构建镜像6. 通过镜像创建容器运行 三、分阶段构建示例四、附带其他文件的部署示例五、关联其他容器六、Docker Compose模式七、总结 本文将介绍…

Android Studio实现内容丰富的安卓图书管理系统

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 项目编号060 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看图书列表 3.查看图书详情 4.评论图书&#xff0c; 5.…

复习C语言基础中的基础:C语言发展、C89 C99有何区别、C语言特点

参考《C程序设计&#xff08;第五版&#xff09;》&#xff08;谭浩强&#xff09;一书&#xff1a; 1. 发展、C89 C99 2. 特点 记得时不时回顾一下背景特点&#xff0c;加深对C语言的理解。

学古琴,万一学错了,还能改吗?

【古琴】学琴容易&#xff0c;改琴难&#xff1b; 错误的观念形成&#xff0c;需要大量的时间去调整大脑和肢体的动作&#xff1b; 当别人在学习新知识的时候&#xff0c;你却在改错误。 在古琴界因为门派和传承的关系&#xff0c;有大量不科学的毛病"&#xff0c;比如音…

HTML—CSS盒子模型(Box Model)

基本介绍&#xff1a; CSS处理网页时&#xff0c;HTML的每一个标签可以看作是一个盒子&#xff0c;网页布局将指定的标签放到指定的位置上摆放&#xff0c;相当于摆放盒子。 每一个标签(盒子)所包含的内容&#xff1a;从外到内 ①外边距(margin)—规定盒子与盒子之间的距离&…

【ShenYu源码阅读】支持提醒通知设计,来看看开源贡献者都做了什么

相信大家碰到源码时经常无从下手&#x1f643;&#xff0c;不知道从哪开始阅读&#xff0c;面对大量代码晕头转向&#xff0c;索性就读不下去了&#xff0c;又浪费了一次提升自己的机会&#x1f62d;。 我认为有一种方法&#xff0c;可以解决大家的困扰&#xff01;那就是通过阅…

百度飞桨大模型训练营:人工智能与大语言模型

1 人工智能基础概念全景介绍 1.1 人工智能概念 解释这些概念 AI是计算机学科下的一个分支学科&#xff0c;旨在使用计算机使之能像人类一样学习和思考问题机器学习是AI的一个子集&#xff0c;它的一个重要特点就是不需要人去做显示编程&#xff08;不用手撕函数&#xff09;&…