当前位置: 首页 > news >正文

【计算机视觉】二、图像形成: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)

相关文章:

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

文章目录 一、向量和矩阵的基本运算二、几何基元和变换1、几何基元(Geometric Primitives)2、几何变换(Geometric Transformations)1. 各种变换的关系2. 变换公式3. 2D变换的层次4. python实现 一、向量和矩阵的基本运算 【计算机视觉】二、图像形成:1、向量和矩阵…...

蓝桥杯---棋盘(典型的二维差分问题)

题目链接:棋盘 这道题真的是非常典型的二维差分问题了(在我个人看来),题目中的0和1,我们直接让差分数组,偶数就是0,奇数就是1.初始化是0,是白子(偶数)&#x…...

OpenHarmony教程指南—ArkTS时钟

简单时钟 介绍 本示例通过使用ohos.display 接口以及Canvas组件来实现一个简单的时钟应用。 效果预览 使用说明 1.界面通过setInterval实现周期性实时刷新时间,使用Canvas绘制时钟,指针旋转角度通过计算得出。 例如:"2 * Math.PI /…...

uniapp遇到的问题

【uniapp】小程序中input输入框的placeholder-class不生效解决办法 解决:写在scope外面 uniapp设置底部导航 引用:https://www.jianshu.com/p/738dd51a0162 【微信小程序】moveable-view / moveable-area的使用 https://blog.csdn.net/qq_36901092/…...

oppo前端开发一面

提问: 1. 谈谈你怎么实现响应式布局 2. 谈谈你对weback的了解,vite和webpack的区别,webpack loader 3. 你项目怎么用CI/CD(不懂,只知道自动化部署了😭) 4. ts中type和interface区别 5. axi…...

案例分析篇09:Web架构设计相关20个考点(7~11)(2024年软考高级系统架构设计师冲刺知识点总结)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…...

为什么“玄学”与营销联系?媒介盒子分析

在去年有年轻人在上班与上进之中,选择上香,而今年有咖啡品牌买咖啡送木鱼,还有香飘飘在普陀山吸好运,望山楂直接覆盖香火最旺的寺庙,玄学营销的势头甚至盖过了联名营销,呈现节点化的趋势。为什么会这样&…...

C++常用容器总结

容器分为三类,顺序容器,关联容器和适配器。顺序容器又分为连续的容器(vector,array),顺序容器中的离散容器(list,slist,forward_list),离连形的de…...

C# Onnx C2PNet 图像去雾 室外场景

目录 介绍 效果 模型信息 项目 代码 下载 C# Onnx C2PNet 图像去雾 室外场景 介绍 github地址:https://github.com/YuZheng9/C2PNet [CVPR 2023] Curricular Contrastive Regularization for Physics-aware Single Image Dehazing 效果 模型信息 Model P…...

【English Learning】Day13

2024/03/14 和小录打卡的第13天 目录 Words & phrases Words & phrases incrredibly incredibly busy 超级忙merely not merely 不仅仅tragedy a terible tregedy 可怕的悲剧a personal tragedy 个人遭遇strive strive to be best 努力做最好的strive for peace 为和平…...

智障版本GPT3实现

背景,实现GPT3,采用python代码。调库hf及tf2.0+基础。 由于完全实现GPT模型及其预训练过程涉及大量的代码和计算资源,以下是一个基于TensorFlow 2.x的简化版GPT模型构建和调用的示例。请注意,这仅展示了模型的基本结构,实际运行需替换为真实数据集和预处理步骤,且无法直…...

【ubuntu】安装 Anaconda3

目录 一、Anaconda 说明 二、操作记录 2.1 下载安装包 2.1.1 官网下载 2.1.2 镜像下载 2.2 安装 2.2.1 安装必要的依赖包 2.2.2 正式安装 shell 和 base 的切换 2.2.3 检测是否安装成功 方法一 方法二 方法三 2.3 其他 三、参考资料 3.1 安装资料 3.2 验证是否…...

代码随想录|Day20|二叉树09|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 思路&#xff1a;利用二叉搜索树的性质&#xff0c;对于每个节点&#xff0c;判断其是否在区间内&#xff1a; 如果节点值 < low&#xff0c;则此节点和其左子树都不在范围内如果节点值 > high&#xff0c;则此节点和其右子树都不在范围内如果 low &…...

开源的java 代码分析库介绍

本文将为您详细讲解开源的 Java 代码分析库&#xff0c;以及如何安装这些库、它们的特性、区别和应用场景。Java 社区提供了多种代码分析工具&#xff0c;这些工具可以帮助您在 Java 应用程序中进行代码质量评估、性能分析、安全检查等功能。 1. CheckStyle 安装 - 通过…...

基于udp协议的网络通信(windows客户端版+简易聊天室版),重定向到终端

目录 和windows通信 引入 思路 WSADATA 代码 运行情况 简单的聊天室 思路 重定向 代码 terminal.hpp -- 重定向函数 服务端 客户端 运行情况 和windows通信 引入 linux和windows都需要联网,虽然他们系统设计不同,但网络部分一定是相同的,所以套接字也是一样的 这…...

Qt+FFmpeg+opengl从零制作视频播放器-7.OpenGL播放视频

在上一节Qt+FFmpeg+opengl从零制作视频播放器-6.视频解码中,我们学到了如何将视频数据解码成YUV原始数据,并且保存到本地,最后使用工具来播放YUV文件。 本节使用QOpenGLWidget来渲染解码后的YUV视频数据。 首先简单介绍QOpenGLWidget的使用。 QOpenGLWidget类是用于渲染O…...

用两个栈实现简单的四则运算

题目要求&#xff1a;给定一个字符串如“12*3”,没有括号&#xff0c;要求利用栈的知识来处理结果算出答案 我的思路&#xff1a;建立两个栈&#xff0c;一个存放数据&#xff0c;一个存放符号&#xff0c;再定义一个结构体做为操作的主体&#xff0c;然后制作几个函数&#x…...

<个人笔记>数论

1.快速幂 (1)求解问题&#xff1a; 给定 n组 ai,bi,pi求 aibi mod pi 的值。 (2)主要思想&#xff1a;任何一个数(b)&#xff0c;可以被 n 个 2k 相加获得。 即 b 2k1 2k2 2k3 … 2logb。 快速幂模板&#xff1a; typedef long long LL;LL qmi(int a,int b,int p){LL re…...

CMS垃圾收集

初始标记 需要暂停所有的其他线程&#xff0c;但这个阶段会很快完成。它的目的是标记所有的根对象&#xff0c;以及被根对象直接引用的对象&#xff0c;以及年轻代指向老年代的对象&#xff0c;不会遍历对象关系&#xff0c;单线程执行。 并发标记阶段 不需要暂停应用线程&a…...

Incorrect DECIMAL value: ‘0‘ for column ‘‘ at row -1

用mysql插入数据的时候&#xff0c;报了上面的错误。 语句类似&#xff1a;INSERT INTO t_aa(c1,c2,c3,a1,a2,a3) SELECT t1,t2,t3,b1,b2,b3 FROM ( SELECT, t1,t2,t3 cast(ifnull(d1,0)as decimal(8,1) b1, cast(ifnull(d2,0) as decimal(8,1) b2, …...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...

32位寻址与64位寻址

32位寻址与64位寻址 32位寻址是什么&#xff1f; 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元&#xff08;地址&#xff09;&#xff0c;其核心含义与能力如下&#xff1a; 1. 核心定义 地址位宽&#xff1a;CPU或内存控制器用32位…...

LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考

目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候&#xff0c;显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...