【ITK库学习】使用itk库进行图像配准:变换Transform(一)

目录

  • 1、itkIdentityTransform 一致变换
  • 2、itkTranslationTransform 平移变换
  • 3、itkScaleTransform 比例变换
  • 4、itkRigid2DTransform 刚性2D变换
  • 5、itkCenteredRigid2DTransform 居中刚性2D变换
  • 6、itkEuler2DTransform 欧拉2D变换
  • 7、itkSimilarity2DTransform 2D相似度变换

1、itkIdentityTransform 一致变换

该类的主要用途是调试,它定义身份转换的通用接口。

它将每个点映射到自身,每个向量映射到自身,每个协变向量映射到自身。

此类主要用作默认 Transform,用于初始化那些支持通用 Transform 的类。

此类是根据坐标表示类型(即用于表示点和向量分量的类型)和空间维度进行模板化的。 在这种情况下,输入和输出空间相同,因此只需要一维。

2、itkTranslationTransform 平移变换

该类实现向量空间的平移变换(例如空间坐标)。

平移变换的有点事计算快速并有很容易解释的参数。

使用仿射变换可以获得相同的功能,但性能差异很大。

  • Set/GetParameters():设置/获取用户指定的变换值的参数
  • Set/GetOffset():设置/获取平移变换的偏移量,将 TranslationTransform 的偏移量设置为用户指定的值
  • Set/GetIdentity():将参数设置/获取为 IdentityTransform
  • GetNumberOfParameters():返回完整定义 Transform 的参数数量
  • SetFixedParameters():设置固定参数并更新内部变换,Translation Transform 不需要固定参数,因此该方法的实现是空操作
  • TransformPoint():通过仿射变换进行变换,该方法将自身给定的仿射变换应用于给定的点或向量,返回变换后的点或向量
  • IsLinear():表明该变换是线性的,即给定两个点 P 和 Q,以及标量系数 a 和 b,则T(aP+bQ)=aT§+bT(Q)
  • GetInverse():求仿射变换的逆,此方法创建并返回一个新的 TranslationTransform 对象,该对象是 self 的逆对象,如果 self 不可逆,则返回 false
  • GetInverseTransform():返回此变换的逆矩阵
typedef itk::TranslationTransform<double, Dimension> TransformType;
typename TransformType::Pointer transform = TransformType::New();
typename TransformType::ParametersType ParametersType ;
ParametersType initialParameters(transform->GetNumberOfParameters());
initialParameters[0] = 0.0; // Initial offset in mm along X
initialParameters[1] = 0.0; // Initial offset in mm along Y
transform->SetParameters(initialParameters);

3、itkScaleTransform 比例变换

该类实现向量空间的尺度变换(例如空间坐标)

它能沿着每一维度应用不同的缩放因数。点通过乘以沿着每一维度方向对应的缩放比例因数来实现坐标变换,
向量变换与点相同。协向量通过相应维的比例因子数区分他们成分的方法进行变换。

点: 变换后坐标 = 变换前坐标 * 每个维度变换系数
在这里插入图片描述

使用仿射变换可以获得相同的功能,但性能差异很大,因为仿射变换将使用对角矩阵的矩阵乘法。

  • Set/GetParameters():设置/获取参数,该方法设置用户指定的变换值的参数,参数的组织方式为scale[i] =parameter[i],在 3D 中,坐标 {x,y,z} 的比例参数分别为 {parameter[0],parameter[1],parameter[2]}
  • SetScale():设置/获取缩放变换的因子,此方法无法使用 SetMacro 完成,因为 itk::Array 未定义运算符==,比例尺数组对应于要应用于每个坐标的因子,例如,在 3D 中,scale[0] 对应于 X,scale[1] 对应于 Y,scale[2] 对应于 Z
  • SetIdentity():将转换设置为 Identity,这会将所有比例设置为 1.0
  • Scale():将这个变换与另一个缩放组合起来。 pre 参数在这里无关紧要,因为尺度变换是可交换的,因此 pre 和 postcomposition 是等价的
  • GetInverse():查找比例变换的逆,创建并返回一个新的 ScaleTransform 对象,该对象是 self 的逆,如果 self 不可逆,则返回 false
  • GetInverseTransform():返回此变换的逆矩阵
int Dimension = 3;
typedef  itk::ScaleTransform<ScalarType, Dimension> ScaleTransformType;
typename ScaleTransformType::Pointer scaleTransform = ScaleTransformType::New();
ScaleTransformType::ParametersType scaleParameters(Dimension);
scaleParameters[0] = 0.6;
scaleParameters[1] = 0.7;
scaleParameters[2] = 0.8;
scaleTransform->SetParameters(scaleParameters);

itkScaleLogarithmicTransformitkScaleTransform类似,唯一区别在于变换的参数是尺度的对数,有助于线性化用于优化的表达式。

4、itkRigid2DTransform 刚性2D变换

该类实现向量空间的刚性二维变换(例如空间坐标)。

此变换在 2D 空间中应用刚性变换, 变换被指定为围绕任意中心的旋转,然后是平移,在该类中,平移和旋转是独立的,且旋转使用弧度表示变换方程为:
在这里插入图片描述
其中θ为自转角度,Tx和Ty是变换的成分。旋转以弧度制来进行测量,值在[-π,π]之间;平移使用mm测量。

可以使用单独的 Set 方法或使用 SetParameters() 和 SetFixedParameters() 以序列化形式设置此转换的参数。

可优化参数的序列化是一个由 3 个元素组成的数组,排序如下: p[0] = 角度, p[1] = 平移的 x 分量, p[2] = 平移的 y 分量。

固定参数的序列化是一个由 2 个元素组成的数组,排序如下: p[0] = 中心的 x 坐标, p[1] = 中心的 y 坐标。

中心、平移和底层矩阵偏移向量的访问方法记录在超类 MatrixOffsetTransformBase 中。

  • Set/GetAngle():设置/获取旋转角度(以弧度为单位)
  • SetAngleInDegrees():设置旋转角度(以度为单位)
  • SetIdentity():重置参数以创建和身份转换
  • SetMatrix():设置 Rigid2D Transform 的旋转矩阵,此方法设置表示变换中旋转的 2x2 矩阵,矩阵应是正交的并具有一定的容差
  • Set/GetParameters():设置/获取参数, 有3个参数, p[0] = 角度, p[1] = 平移的 x 分量, p[2] = 平移的 y 分量,旋转中心固定
  • SetVarAngle():更新角度而不重新计算其他内部变量
  • GetInverse():获取该变换的逆变换
  • GetInverseTransform():返回此变换的逆矩阵
typedef itk::Rigid2DTransform<double> TransformType;
typename TransformType::Pointer transform = TransformType::New();
typename TransformType::TranslationType initialTranslation;
initialTranslation[0] = 5.0;      //平移
initialTranslation[1] = 6.0;
typename TransformType::OutputPointType rotationCenter;
rotationCenter[0] = 100;          //旋转中心
rotationCenter[1] = 100;
transform->SetIdentity();
transform->SetCenter(rotationCenter);
transform->SetAngle(1.0);         //旋转角度
transform->SetTranslation(initialTranslation);

5、itkCenteredRigid2DTransform 居中刚性2D变换

该类实现向量空间的居中刚性二维变换(例如空间坐标)

itkRigid2DTransform相似,该变换先围绕任意中心的旋转,然后是平移,主要区别在于,旋转中心可以任意选择进行优化。

可优化参数的序列化是一个由 5 个元素组成的数组,排序如下: p[0] = 角度, p[1] = 中心的 x 坐标, p[2] = 中心的 y 坐标, p[3] = 的 x 分量, 平移 p[4] = 平移的 y 分量。

没有固定的参数。

变换方程为:
在这里插入图片描述
其中θ为自转角度,Cx和Cy为自转中心的坐标,它在自转前被减去在自转后增加恢复,Tx和Ty是变换的成分。旋转以弧度制来进行测量,值在[-π,π]之间;平移使用mm测量。

  • Set/GetParameters():设置/获取变换参数, 有5个参数, p[0] = 角度, p[1] = 中心的 x 坐标, p[2] = 中心的 y 坐标, p[3] = 的 x 分量, 平移 p[4] = 平移的 y 分量

其余函数继承自itkRigid2DTransform

6、itkEuler2DTransform 欧拉2D变换

该类实现向量空间的欧拉二维变换(例如空间坐标)。

此变换应用 2D 空间的刚性变换,变换被指定为平面自转,然后二维平移。

继承自itkRigid2DTransform,与其功能相似。

typedef  itk::Euler2DTransform<double> TransformType;
typename TransformType::Pointer transform = TransformType::New();
transform->SetAngle(0.0);//获取参数、矩阵等
typename TransformType::ParametersType parameters = transform->GetParameters();
typename TransformType::MatrixType matrix = transform->GetMatrix();
typename TransformType::OffsetType offset = transform->GetOffset();

7、itkSimilarity2DTransform 2D相似度变换

该类实现向量空间的相似度2D变换(例如空间坐标)

该变换在 2D 空间中应用均匀尺度和刚性变换,变换被指定为围绕任意中心的缩放旋转,然后是平移, 给定一个旋转角度、均匀比例和平移 2D 偏移,变换公式为:
在这里插入图片描述
其中θ为自转角度,CxCy为自转中心的坐标,它在自转前被减去在自转后增加恢复,TxTy是变换的成分,s为缩放的比例因数。

可以使用单独的 Set 方法或使用 SetParameters() SetFixedParameters() 以序列化形式设置此转换的参数。

可优化参数的序列化是一个由4个元素组成的数组,排序如下: p[0] = 比例, p[1] = 角度, p[2] = 平移的 x 分量, p[3] = 平移的 y 分量。

固定参数的序列化是一个由 2 个元素组成的数组,排序如下: p[0] = 中心的 x 坐标, p[1] = 中心的 y 坐标。

中心、平移和底层矩阵偏移向量的访问方法记录在超类 MatrixOffsetTransformBase 中。

角度的访问方法记录在超类 itkRigid2DTransform 中。

  • SetScale():设置/获取变换的缩放比例因数
  • SetVarScale():设置比例而不更新基础变量
  • Set/GetParameters():设置/获取变换参数, 有4个参数, p[0] = 比例, p[1] = 角度, p[2] = 平移的 x 分量, p[3] = 平移的 y 分量, 旋转中心固定

其余函数继承自itkRigid2DTransform

typedef itk::Similarity2DTransform<double> TransformType;
typename TransformType::Pointer transform = TransformType::New();
typename TransformType::InputPointType rotationCenter;
rotationCenter[0] = 5.0;
rotationCenter[1] = 3.0;
typename TransformType::OutputVectorType translation;
translation[0] = 13.0;
translation[1] = 17.0;transform->SetAngle(angle);     //旋转角度,弧度单位
transform->SetScale(scale);     //缩放因子
transform->SetCenter(rotationCenter);     //旋转中心
transform->SetTranslation(translation);   //平移参数

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

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

相关文章

如何使用 Matplotlib 绘制 3D 圣诞树

系列文章目录 前言 转自&#xff1a;How to draw a 3D Christmas Tree with Matplotlib | by Timur Bakibayev, Ph.D. | Analytics Vidhya | Mediumhttps://medium.com/analytics-vidhya/how-to-draw-a-3d-christmas-tree-with-matplotlib-aabb9bc27864 因为我们把圣诞树安装…

Linux操作系统——进程(四)进程切换与命令行参数

进程切换 概念引入 下面我们先了解几个概念&#xff1a; 竞争性: 系统进程数目众多&#xff0c;而CPU资源只有少量&#xff0c;甚至1个&#xff0c;所以进程之间是具有竞争属性的。为了高效完成任务&#xff0c;更合理竞争相关资源&#xff0c;便具有了优先级 独立性: 多进程…

阶段七-GitEE

Git&#xff1a;版本控制软件 Git的优点 1.1 协同修改 多人并行不悖的修改服务器端的同一个文件。 1.2 数据备份 不仅保存目录和文件的当前状态&#xff0c;还能够保存每一个提交过的历史状态。 1.3 版本管理 在保存每一个版本的文件信息的时候要做到不保存重复数据&…

【开源】基于JAVA的学校热点新闻推送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 新闻类型模块2.2 新闻档案模块2.3 新闻留言模块2.4 新闻评论模块2.5 新闻收藏模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 新闻类型表3.2.2 新闻表3.2.3 新闻留言表3.2.4 新闻评论表3.2.5 新闻收藏表 四、系统展…

W5500-EVB-Pico评估版介绍

文章目录 1 概述2 板载资源2.1 硬件规格2.2 硬件规格2.3 工作条件 3 参考资料3.2 原理图3.3 尺寸图 (单位 : mm)3.4 参考例程 4 硬件协议栈优势 1 概述 W5500-EVB-Pico是基于树莓派RP2040和完全硬连线TCP/IP控制器W5500的微控制器开发板-基本上与树莓派Pico板相同&#xff0c;但…

深度学习(七):bert理解之输入形式

传统的预训练方法存在一些问题&#xff0c;如单向语言模型的局限性和无法处理双向上下文的限制。为了解决这些问题&#xff0c;一种新的预训练方法随即被提出&#xff0c;即BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;。通过在大规模…

Qt Creator可视化交互界面exe快速入门2

上一期介绍的通过代码的方式实现一个简单界面&#xff0c;需要敲小几十行代码&#xff0c;显然是效率低的&#xff0c;这期就介绍下Qt Creator的作用。 Qt Creator的使用&#xff1a; 首先打开我们的Qt Creator 然后点击创建项目&#xff0c;在项目Application里面选择Qt Wid…

嵌入式奇妙之旅:Python与树莓派编程深度探索

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在这个数字化的时代&#xff0c;嵌入式系统的应…

Lua的垃圾回收机制详解

Lua 是一种轻量级的编程语言&#xff0c;广泛用于嵌入到其他应用程序中&#xff0c;尤其是在游戏开发领域。Lua 的内存管理机制采用了自动垃圾收集&#xff08;Garbage Collection&#xff09;的方法。以下是Lua内存管理的一些关键方面&#xff1a; 垃圾收集原理概述 Lua 使用…

matlab设置colorbar标题的两种方式

%% 第一种 figure; A rand(3,4,3); A1 A(:,:,1); A2 A(:,:,2); A3 A(:,:,3); contourf(A1,A2,A3,30); colormap(jet);colorbar; my_handlecolorbar; my_handle.Label.String depth/km; my_handle.Label.FontSize 15;%% 第二种 figure; A rand(3,4,3); A1 A(:,:,1); A2 …

c# OpenCvSharp透视矫正六步实现透视矫正(八)

透视矫正,引用文档拍照扫描&#xff0c;相片矫正这块。 读取图像Cv2.ImRead();预处理&#xff08;灰度化&#xff0c;高斯滤波、边缘检测&#xff09;轮廓检测&#xff08;获取到最大轮廓&#xff09;获取最大面积轮廓的四个顶点标识最小矩形坐标透视矫正显示 完整代码 // 1、…

【中小型企业网络实战案例 二】配置网络互连互通

​【中小型企业网络实战案例 一】规划、需求和基本配置-CSDN博客 热门IT技术视频教程&#xff1a;https://xmws-it.blog.csdn.net/article/details/134398330?spm1001.2014.3001.5502 配置接入层交换机 1.以接入交换机ACC1为例&#xff0c;创建ACC1的业务VLAN 10和20。 <…

异常和智能指针

智能指针的认识 智能指针是一种C语言中用于管理动态内存的工具&#xff0c;它们可以自动管理内存的分配和释放&#xff0c;从而避免内存泄漏和悬空指针等问题。智能指针可以跟踪指向的对象的引用次数&#xff0c;并在需要时自动释放被引用的内存&#xff0c;这极大地提高了内存…

如何查看NX UI对话框内的控件(使用UIFW侦查)

一、概述 在NX二次开发中有很多命令从界面上看起开相似&#xff0c;但实质确不同&#xff0c;个人人为一是出于对软件产权的保护&#xff0c;增加二次开发的难度&#xff0c;二是由于NX在不断地发展和版本交替中为了保留老用户的操作习惯&#xff0c;故意用新控件做成老控件的…

【我与java的成长记】之面向对象的初步认识

系列文章目录 能看懂文字就能明白系列 C语言笔记传送门 &#x1f31f; 个人主页&#xff1a;古德猫宁- &#x1f308; 信念如阳光&#xff0c;照亮前行的每一步 文章目录 系列文章目录&#x1f308; *信念如阳光&#xff0c;照亮前行的每一步* 前言一、什么是面向对象面向过程…

与供应商合作:成功供应商管理的六种最佳实践

许多企业低估了他们对外部供应商的依赖程度&#xff0c;也小看了这些供应商关系所涉及的风险。本文将探索企业与外部供应商合作的六种最佳实践&#xff0c;利用它们创建有效的供应商管理流程&#xff0c;从而降低成本和风险&#xff0c;并提高盈利能力。 供应商管理为何重要&a…

【UML】第13篇 序列图(2/2)——建模的方法

目录 三、序列图建模 3.1 概述 3.2 建模的步骤 3.3 举例说明步骤 1.确定主要场景和流程 2.确定参与的对象 3.绘制序列图 4.注意事项 3.4 特殊的情况 序列图是我个人认为&#xff0c;UML中最重要的图之一。 而且序列图&#xff0c;对于业务建模&#xff0c;也有非常好…

SpringBoot + vue3 + TypeScript + activiti7 + 动态表单 的工作流引擎

工作流 SpringBoot vue3 TypeScript activiti7 动态表单 可动态绑定数据库表 的工作流引擎 介绍 兴趣使然&#xff0c;想开发一套自己认为的工作流 项目使用 vue3 elementui-plus ts Activit7 SpringBoot &#xff0c;项目从零搭建 可移植性高&#xff0c;无依赖多余…

C语言学习day10:if语句

程序流程结构&#xff1a; C 语言支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构。 顺序结构:程序按顺序执行&#xff0c;不发生跳转。选择结构:依据是否满足条件&#xff0c;有选择的执行相应功能。循环结构:依据条件是否满足&#xff0c;循环多次执行某段代码…

Ubuntu20.04-查看GPU的使用情况及输出详解

1. 查看GPU的使用情况 1.1 nvidia-smi # 直接在终端得到显卡的使用情况 # 不会自动刷新 nvidia-smi# 重定向到文件中 nvidia-smi > nvidia_smi_output.txt# 如果输出的内容部分是以省略号表示的&#xff0c;可以-q nvidia-smi -q 1.2 nvidia-smi -l # 会自动刷新&#x…