【PCL】ICP(Iterative Closest Point)原理剖析——仿射变换(Affine Transformation)数学模型

本文主要是介绍【PCL】ICP(Iterative Closest Point)原理剖析——仿射变换(Affine Transformation)数学模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录&索引

  • 1 几何变换
  • 2 仿射变换
    • 2.1 平移
    • 2.2 缩放
    • 2.3 剪切
    • 2.4 旋转
    • 2.5 组合
  • 3 结论


包含相同内容的两幅图像可能由于成像角度、透视关系乃至镜头自身原因所造成的几何失真而呈现出截然不同的外观,这就给观测者或是图像识别程序带来了困扰。通过适当的几何变换可以最大程度地消除这些几何失真所产生的负面影响,有利于我们在后续的处理和识别工作中将注意力集中子图像内容本身,更确切地说是图像中的对象,而不是该对象的角度和位置等。因此,几何变换常常作为其他图像处理应用的预处理步骤, 是图像归一化的核心工作之一。

1 几何变换

变换模型是指根据待匹配图像与背景图像之间几何畸变的情况,所选择的能最佳拟合两幅图像之间变化的几何变换模型。可采用的变换模型有如下几种:刚性变换、仿射变换、透视(投影)变换和非线性变换等,如下图:

c 和 d 的区别可以看下图:

其中仿射变换就是我们本文要讨论的,而仿射变换中的平移、旋转则是刚性 ICP 的重点,本文将以二维仿射变换为例,阐述仿射变化的数学模型。


2 仿射变换

仿射变换(Affine Transformation)

Affine Transformation 是一种二维坐标到二维坐标之间的线性变换,保持二维图形的“平直性”(译注:straightness,即变换后直线还是直线不会打弯,圆弧还是圆弧)和“平行性”(译注:parallelness,其实是指保二维图形间的相对位置关系不变,平行线还是平行线,相交直线的交角不变)。

仿射变换可以通过一系列的原子变换的复合来实现,包括:平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)

仿射变换(二维)可以用下面公式表示:

参考:图像变换的基本模型

矩阵乘法的规则如下所示:
在这里插入图片描述
具体到二维的仿射变换的计算如下:

2.1 平移

将每一点移动到 (x+tx, y+ty),变换矩阵为:
在这里插入图片描述
平移变换是一种“刚体变换”,rigid-body transformation,就是不会产生形变的理想物体。

效果:
在这里插入图片描述

2.2 缩放

将每一点的横坐标放大(缩小)至 sx 倍,纵坐标放大(缩小)至 sy 倍,变换矩阵为:
在这里插入图片描述
变换效果如下:
在这里插入图片描述

2.3 剪切

变换矩阵为:
在这里插入图片描述
相当于一个横向剪切与一个纵向剪切的复合:
在这里插入图片描述
效果:
在这里插入图片描述

2.4 旋转

目标图形围绕原点顺时针旋转 theta 弧度,变换矩阵为:
在这里插入图片描述
效果:
在这里插入图片描述

2.5 组合

旋转变换,目标图形以 (x, y) 为轴心顺时针旋转 theta 弧度,变换矩阵为:
在这里插入图片描述
相当于两次平移变换与一次原点旋转变换的复合:
在这里插入图片描述
先移动到中心节点,然后旋转,然后再移动回去。

这个转换矩阵也可以下面这样描述:


3 结论

常用转换矩阵如下:


这篇关于【PCL】ICP(Iterative Closest Point)原理剖析——仿射变换(Affine Transformation)数学模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/idiot5lie/article/details/115353829
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/222011

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

kotlin中的模块化结构组件及工作原理

《kotlin中的模块化结构组件及工作原理》本文介绍了Kotlin中模块化结构组件,包括ViewModel、LiveData、Room和Navigation的工作原理和基础使用,本文通过实例代码给大家... 目录ViewModel 工作原理LiveData 工作原理Room 工作原理Navigation 工

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente

MySQL的隐式锁(Implicit Lock)原理实现

《MySQL的隐式锁(ImplicitLock)原理实现》MySQL的InnoDB存储引擎中隐式锁是一种自动管理的锁,用于保证事务在行级别操作时的数据一致性和安全性,本文主要介绍了MySQL的隐式锁... 目录1. 背景:什么是隐式锁?2. 隐式锁的工作原理3. 隐式锁的类型4. 隐式锁的实现与源代码分析4

MySQL中Next-Key Lock底层原理实现

《MySQL中Next-KeyLock底层原理实现》Next-KeyLock是MySQLInnoDB存储引擎中的一种锁机制,结合记录锁和间隙锁,用于高效并发控制并避免幻读,本文主要介绍了MySQL中... 目录一、Next-Key Lock 的定义与作用二、底层原理三、源代码解析四、总结Next-Key L

Spring Cloud Hystrix原理与注意事项小结

《SpringCloudHystrix原理与注意事项小结》本文介绍了Hystrix的基本概念、工作原理以及其在实际开发中的应用方式,通过对Hystrix的深入学习,开发者可以在分布式系统中实现精细... 目录一、Spring Cloud Hystrix概述和设计目标(一)Spring Cloud Hystr

MySQL中的MVCC底层原理解读

《MySQL中的MVCC底层原理解读》本文详细介绍了MySQL中的多版本并发控制(MVCC)机制,包括版本链、ReadView以及在不同事务隔离级别下MVCC的工作原理,通过一个具体的示例演示了在可重... 目录简介ReadView版本链演示过程总结简介MVCC(Multi-Version Concurr