itk registration 10

参考:https://itk.org/ITKSoftwareGuide/html/Book2/ITKSoftwareGuide-Book2ch3.html#x26-1740003.18

3.10 Interpolators

图3.40:在某种空间变换下,moving图像被映射到fixed图像空间中。迭代器遍历fixed图像,并将其坐标映射到moving图像上。

在配准过程中,通常将fixed图像中的强度值与变换后的moving图像中的相应值进行比较。当一个点通过转换从一个空间映射到另一个空间时,它通常会映射到一个非网格位置。因此,需要插值来评估图像在映射位置的强度。

图3.40(左)演示了fixed图像空间到moving图像空间的映射。转换将点从fixed图像坐标系统映射到moving图像坐标系统。图中突出了两幅图像映射后的重叠区域。右边说明了如何使用迭代器遍历固定图像的区域。迭代器的每个位置都由变换映射到moving的图像空间上,以便找到相应的像素。

图3.41fixed图像的网格位置映射到moving图像的非网格位置

图3.41给出了从fixed图像到moving图像映射的详细视图。一般来说,fixed图像的网格位置不会映射到moving图像的网格位置。在这些非网格位置上估计moving图像的强度需要插值。该服务在ITK中由插入器类提供,可以插入到配准方法中。

可以使用以下插补器:

在配准的情况下,插值方法影响了优化搜索空间的光滑性和整体计算时间。另一方面,插值在一个优化周期中被执行数千次。因此,用户在选择插值方案时必须平衡计算的简单性和优化的光滑性。

tk :: InterpolateImageFunction的基本输入是要插值的图像。使用SetInputImage()定义图像后,用户可以在使用Evaluate()的点或使用EvaluateAtContinuousIndex()的索引处进行插值。

插值器interpolators提供了IsInsideBuffer()方法,用于测试特定的图像索引或物理点是否落在存在图像像素的空间域之内。

3.10.1 Nearest Neighbor Interpolation

itk::NearestNeighborInterpolateImageFunction只是使用最近网格位置的强度。即假设图像强度为分段常数,并在网格位置中间有跳跃。这种插值方案很简单,因为它不需要任何浮点计算。

3.10.2 Linear Interpolation

itk::LinearInterpolateImageFunction 假设强度在网格位置之间线性变化。与最近邻插值不同,插值的强度在空间上是连续的。然而,强度梯度将在网格位置不连续。

3.10.3 B-Spline Interpolation

图3.42:左侧展示了b样条网格和已知的节点形变。右边说明了当b样条是三次阶时,插值是可能的区域。小箭头表示变形值,这些形变值是从图左侧所示的网格变形中插入的。

itk::BSplineInterpolateImageFunction表示图像强度使用b样条基函数。当一个输入图像第一次连接到插值器,b样条系数计算使用递归滤波(假设镜像边界条件)。非网格位置的强度是通过在请求位置的小支持区域内将b样条系数与移位的b样条核相乘来计算的。图3.42显示了如何使用b样条网格节点上的变形值来计算剩余空间内的插值变形。例如,当使用三次b样条时,网格必须在图像的一侧有一个额外的节点,在图像的另一侧有两个额外的节点,每个维度都是如此。

目前,这个插值器支持0到5阶的样条。使用0阶样条几乎等同于最近邻插值;1阶样条和线性插值是完全一样的。对于大于1阶的样条,插值值及其导数在空间上是连续的。

重要的是要注意,使用此方案时,插值可能会超出输入图像强度的范围。在处理无符号数据时,这尤其重要,因为插值值可能为负。

3.10.4 Windowed Sinc Interpolation

该itk:: windowsincinterpolateimagefunction是最好的可能的插值数据已数字化在一个离散网格。这个插值器是基于傅里叶分析的考虑而开发的。在信号处理中,使用周期离散网格对空间函数采样的过程会导致该信号在频域的频谱复制,这是众所周知的。

从离散采样中恢复连续信号的过程相当于在频域中去除复制谱。这可以通过将频谱与一个box函数相乘来实现,该box函数将把原始信号中最高频率以上的所有频率设为零。用box函数乘以频谱等价于用sinc函数对空间离散信号进行卷积

sinc函数是无限的,当然在实践中实际上是无法实现的。因此,sinc通常通过与Window函数相乘而被截断。windowed Sinc插值器就是这种操作的结果。

这个插值器在它的使用中给出了一系列的权衡。可能最重要的是window越大,得到的插值就越精确。然而,大的窗口也会导致长计算时间。由于用户可以在这个插值器中选择Windows大小,它是由用户决定在她/他的应用程序中需要多少插值质量和多少计算时间可以被证明是合理的。

用于计算插值器的图像区域由窗口半径确定。例如,在我们要在位置(x,y)处插值的2D图像中,将执行以下计算。

其中m是窗口的半径。通常,3或4这样的值对于窗口半径是合理的。函数kernel K(t)是由sinc函数和上面列出的一个窗口组成的。

可以使用这个插值器的一些窗口是:

余弦窗Cosinus window:

汉明窗Hamming window:

韦尔奇窗Welch window:

Lancos窗口Lancos window:

布莱克曼窗口Blackman window:

上面列出的窗口函数可以在itk::Function名称空间中使用。参考文献的结论建议在m = 4,5时使用Welch、cosine、Kaiser和Lancos窗口。这些都是基于误差旋转医学图像相对于线性插值方法。在某些情况下,结果可以达到20倍的精度提高。

可以按与使用任何ImageInterpolationFunction相同的方式使用此滤镜。例如,您可以将其插入ResampleImageFilter类。为了实例化过滤器,您必须选择几个模板参数。

using InterpolatorType = WindowedSincInterpolateImageFunction<TInputImage, VRadius, TWindowFunction,TBoundaryCondition, TCoordRep >;

TInputImage是图像类型。

VRadius是内核的半径,即上式中的m。

TWindowFunction是窗口函数对象,您可以从此头文件中定义的大约五个不同的函数中进行选择。默认值为Hamming窗口,根据引用的论文,该窗口是常用的,但不是最佳的。

TBoundaryCondition是边界条件类,用于确定超出图像边界的像素值。此类在这里与itk :: NeighborhoodIterator类具有相同的含义。

TCoordRep还是插值函数的标准配置,应为float或double。

WindowedSincInterpolateImageFunction可能不是你想使用执行配准的插值。它的计算负担使其对于这个目的过于昂贵。这个插值器的最佳用途是用于图像的最终重采样,一旦在配准过程中使用另一个更优的插值器找到变换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值