【MITK】基础概念-几何(Geometry)

1 几何简介

几何(geometry)用于描述数据对象在空间和时间上的几何特性。为了以正确的方式去使用geometry类,必须理解MITK中三种不同的坐标系类型:
在这里插入图片描述

  1. 世界坐标系
  • 世界坐标(world coordinates)描述了全局坐标系下的所有MITK对象的实际空间位置,通常由成像模态(modality)指定。
  • 世界坐标由mitk :: Point3D的对象表示。
  • geometry定义了世界坐标系下的数据对象的偏移(offset),方向(orientation)和比例大小(scale)。
  • 世界坐标总是以毫米(mm)为单位。
  • 通过调用BaseGeometry :: IndexToWorld()可以将索引坐标转换为世界坐标。
    在这里插入图片描述
    在这里插入图片描述
    如果你正在处理图像几何,则图像的原点将指向左下角的体素的中心。
    如果你处理的不是图像几何(没有定义的离散体素),原点指向左下角的角落。
  1. 连续索引坐标
  • 通过像素间距划分世界坐标,同时将偏移量考虑进去,就可以得到数据对象中的连续索引坐标(continuous index coordinates)。所以连续坐标值可能是浮点数。
  • 连续索引坐标由mitk :: Point3D对象表示。
  • 连续索引坐标可以通过调用BaseGeometry::WorldToIndex()获得,其中的&pt_mm是世界坐标系下的一个点。
  1. 索引坐标
  • 索引坐标(index coordinates)是离散值,它们明确地表示了数据对象的体素。
  • 索引坐标由itk::Index<3>对象表示。
  • 索引坐标基本上是由连续索引坐标对半个整数向上取整得到的。

比如:(0,0)指定了2D图像的第一个像素,(0,1)是同一行中下一列的像素。
如果有世界坐标,则可以通过调用BaseGeometry :: WorldToIndex()将其转换为离散的索引坐标。

2 点和矢量的区别

像ITK一样,MITK中点和矢量也是不同的。一个点定义坐标系中的一个位置,而一个矢量是两点之间的距离。因此,如果应用坐标变换,则点和矢量的表现是不同的。坐标变换中的偏移量会影响变换的点,但不会影响矢量。

举个例子:给出了两个坐标系系统,它们的偏移量相差了(1,0,0)。在系统1中的点A(2,2,2)就会对应到第二个系统中的(3,2,2)。但是矢量a ⃗(2,2,2)对应矢量(a^’ ) ⃗(2,2,2)。

3 几何概念

作为所有MITK几何的父类,BaseGeometry包含:

  • 一个空间包围盒(bounding box),在索引坐标系中(通常是离散的像素索引)平行于坐标轴,可通过BaseGeometry::GetBoundingBox()获得。
  • 一个时间相关的包围盒,以毫秒为单位(开始和结束时间)保存了所考虑的数据对象的时效性,可通过BaseGeometry::GetTimeBounds()获得。3D几何体的默认值是负无穷到正无穷,意味着对象始终在MITK中显示,不受显示时间的限制。
  • 关于世界坐标中的欧几里得变换形式的位置信息(例如:线性变换矩阵和偏移量),用来将(离散或连续)索引坐标变换为世界坐标,反之亦然。可以通过BaseGeometry::Get-IndexToWorldTransform()获得。
  • 更多的属性(例如:原点,范围,…)可在BaseGeometry类的文档中找到。
  • 非常重要:isImageGeometry是一个标识符,表明了坐标系的原点是否基于体素的中心。

BaseData的每个数据对象(子)类都有一个TimeGeometry,可通过BaseData::Get TimeGeometry()获得。这个TimeGeometry包括一个或者多个BaseGeometry对象,它们在特定的时间点描述对象,例如:提供世界坐标和索引坐标之间的转换,还包含了覆盖数据放置的区域的包围盒。使用抽象TimeGeometry类的不同实现,可能会在时间步数如何保存和计算的时间方面有所不同。

有两种方式来表示时间:TimePointType或者是TimeStepType。第一个类似于连续索引坐标,定义了以毫秒为单位从时间点零开始的时间点(Time Point),记录了从零时间点到该时间点的时间。第二个类似于索引坐标,这些离散值指定了从0到GetNumberOfTimeSteps()的当前的时间步数(Time Step),表示当前时间点经过了多少个Time Step。

时间点和时间步之间的转换是通过调用方法TimeGeometry::TimeStepToTimePoint()或者TimeGeometry::TimePointToTimeStep()实现的。请注意,时间步长的持续时间可能因对象而异,因此一般来说最好使用时间点计算相应的时间步长。另外,时间步长的距离也不需要随着时间等距离(时间段上的time step也无需相同),这取决于使用的TimeGeometry实现。

每个TimeGeometry都有一个包围盒,覆盖相应对象在所有时间步中所处的整个区域。这个包围盒可以通过调用TimeGeometry::GetBoundingBoxInWorld()获得,并且始终在世界坐标系中。包围盒是从所有时间步计算的,调用TimeGeometry::Update()手动启动这个计算过程。如果调用getter,包围盒不会更新。
TimeGeometry不提供世界坐标到图像坐标的转换,因为每一个time step可能有不同的变换。如果需要图像坐标和世界坐标之间的转换,则必须通过TimeGeometry::GetGeometryForTimeStep()或TimeGeometry::GetGeometryForTimePoint()获取特定time step或time point的BaseGeometry,然后使用此geometry计算变换。

TimeGeometry是一个抽象类,因此不可能去实例化它。必须使用派生类。目前唯一可以选择的类是ProportionalTimeGeometry(),它假定时间步长是等距排列的。为了用给定的几何初始化一个对象,结合现有的BaseGeometry和time steps的数目,调用Proportional-TimeGeometry::Initialize()。给定的几何将被复制,而不是引用!

此外,BaseGeometry也是一个抽象类,必须使用派生类。最简单的实现,即BaseGeometry类的一对一实现是Geometry3D类。

SlicedGeometry3D是BaseGemetry的一个子类,它描述了由切片组成的数据对象,例如Image类型的对象(或者SlicedData,它是Image的父类)。因此,Image::GetTimeGeometry()将包含一个SlicedGeometry3D实例列表。有一个特殊的方法SlicedData::GetSlicedGeometry(t)直接返回一个SlicedGeometry3D以避免需要类型转换。

SlicedGeometry3D类包含了描述图像中切片的PlaneGeometry对象的列表。这里我们有从0到GetSlices()的空间steps。

SlicedGeometry3D::InitializeEvenlySpaced(PlaneGeometry *planeGeometry, unsigned int slices)初始化一堆厚度相同的切片,下一个开始的位置是上一个的结束位置。

PlaneGeometry提供了在3D空间处理2D流型(manifold,简单来讲,就是可以用二维坐标系描述的对象)的方法。例如,它允许使用PlaneGeometry::Map()映射2D流型上的3D点。

最后,有一个AbstractTransformGeometry,它是由vtkAbstractTransform定义的,它描述了3D空间中的2D流形。它是任意用户定义的几何的抽象父类。

一个例子就是ThinPlateSplineCurvedGeometry。
在这里插入图片描述

重要内容

如果你使用图像,请仔细阅读本节内容!

图像角点(corner)位置的定义与其他数据对象不同:如前一节所述,数据对象(例如:曲面)的世界坐标通常指定对象的左下角。相比之下,图像几何是基于中心的,这意味着属于图像的体素的世界坐标指向该体素的中心。

如果一个表面的原点位于世界坐标(15,10,0)处,那么图像的原点世界坐标在内部计算如下:

(15-0.5*X-Spacing, 10-0.5*Y-Spacing, 0-0.5*Z-Spacing)

如果图像的间距(x,y,z)=(1,1,3),那么边角(corner)的坐标是(14.5,9.5,-1.5)。
在这里插入图片描述
如果你的几何描述一幅图像,则必须将成员变量isImageGeometry更改为true。这个变量表明你的几何体是否是基于中心的。这个改变可以用两种方法完成:

  1. 你确定你的原点已经是基于中心的,无论是因为你进行了手动调整还是从其他图像复制过来的。
  • 在这种情况下,可以调用函数setImageGeometry(true)或imageGeometryOn()将bool变量设置为true。
  1. 你创建了一个新的几何,没有将原点手动调整为基于中心,isImageGeometry为false(默认值)。
  • 在这种情况下,调用函数ChangeImageGeometryConsideringOriginOffset(true), 它会自动调整你的原点,并将bool标志设置为true。

如果你获得了发生位移的轮廓、图形或其它事物,则表示你灭有考虑上述的原点偏移。

一幅图像具有一个TimeGeometry,其中包含一个或多个SlicedGeometry实例(每个time step一个),所有这些实例都包含PlaneGeometry(子类)的一个或多个实例。

提醒
图像的BaseGeometry实例需要稍微不同的角点定义,请参阅SetImageGeometry。这通常是由Image自动调用的。

4 MITK、ITK和VTK几何之间的联系

  • VTK转换用于渲染
  • ITK转换用于计算
  • 当一个被改变时,两者都自动更新。

注意:当更改硬编码(hardcode)时,不自动更新。例如:

geometry->GetVtkMatrix()->Rotate(....)

在这里插入图片描述

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值