张春成

V2

2023/04/05阅读:41主题:默认主题

不同源的 MRI 数据点阵匹配

不同源的 MRI 数据点阵匹配

假设我们已经通过技术手段完成了 MRI 数据到标准模板的头动校正,但这并不能保证新数据与标准模板是同源的。为了解决该问题本文介绍快速配准的算法原理,该方法能够对不同源的 MRI 数据点阵进行匹配。


  • 不同源的 MRI 数据点阵配准[1]
    • MRI 数据的点阵与源空间[2]
    • 点阵匹配快速算法[3]
    • 实现代码[4]

MRI 数据的点阵与源空间

MRI 数据是无创的、由面片扫描得到的点阵数据,它总可以表示成三维实矩阵的形式

其中, 分别代表三维空间中的位置标号。另一方面点阵中的点具有各自的物理坐标。物理坐标需要零点,因此我们假定大脑中心有一点,即前联合点,将该点的坐标规定为 ,那么点阵中的每个点的空间标号与空间坐标满足一一对应关系

其中, 代表物理坐标。为了表达方便,我们将物理坐标所在的空间称为源空间。由此可见,为了将 MRI 点阵与其物理位置对应起来,就需要描述出点阵标号与源空间坐标之间的对应关系,在实际操作中,一般使用仿射变换矩阵进行该计算。仿射变换矩阵为 4 维方阵,该方阵满足变换关系

我们将物理坐标和位置标号的增广向量进行简计后可得

该式为点阵匹配的快速算法的原理式。

点阵匹配快速算法

所谓点阵匹配,是对于点阵中的某个点,推出另一个点阵中对应点的匹配方法。

在论述快速算法之前,先啰嗦一下为何不能逐点匹配。简单来说是因为太慢,展开来说是因为实际采集到的 MRI 数据往往千奇百怪。以常用的标准模板为例,它的空间分辨率是 ,而 3T 设备采集的 MRI 数据往往只能达到 的空间分辨率,其中 。并且标准模板的点阵采样方向一般与物理坐标的方向对齐,但实际采集的 MRI 数据的点阵往往是倾斜的。这导致配准过程需要对每个采样点均进行分析,因此其时间复杂度为 ,而这在 规模的大点阵上显然是不可接受的。

MNI MRI Template[5]

因此,我们考虑用快速算法的原理式加速这一过程,首先考虑两个源的 MRI 数据

其中, 分别用于在点阵中检索出对应点的数值。我们将第一个 MRI 数据作为模板数据,第二个数据向它进行匹配。这个过程可以转化为解方程组

解得

其中, 为位置标号构成的增广矩阵

最后,由于求出的 矩阵可能超出其占阵的界限,因此需要进行超界处理即可。上述矩阵计算的方法在 规模的大点阵上,可以在毫秒量级内完成。

实现代码

下述代码可以完成上述工作

def fill_from(self, img):
      '''
      Fill the array_3d like array with the other img.
      The coming img may have different affine coordinates and dimensions.
      '''

      # Prepare the filled array_3d
      filled = self.array_3d.copy() * 0
      xyz11 = self.xyz1
      ijk11 = self.ijk1

      # Read the img
      m2 = img.array_3d.copy()
      m2[0, :, :] = 0
      m2[:, 0, :] = 0
      m2[:, :, 0] = 0

      affine2 = img.affine
      affine2_inv = np.linalg.inv(affine2)

      # Compute the ijk of the img,
      # and remove the unavailable points indexes
      ijk12 = np.matmul(affine2_inv, xyz11).astype(np.int32)

      for j in range(3):
          top = img.shape[j] - 1
          ijk12[j][ijk12[j] < 0] = 0
          ijk12[j][ijk12[j] > top] = 0

      # Fill the filled
      filled[ijk11[0], ijk11[1], ijk11[2]] = m2[ijk12[0], ijk12[1], ijk12[2]]

      self.filled_array_3d = filled
      self.df['filled_value'] = filled.ravel()

      LOGGER.debug('Fill {} -> {}, src img:{}, dst img: {}'.format(
          img.shape,
          filled.shape,
          img.path,
          self.path,
      ))

      return filled

参考资料

[1]

不同源的 MRI 数据点阵配准: #不同源的-mri-数据点阵配准

[2]

MRI 数据的点阵与源空间: #mri-数据的点阵与源空间

[3]

点阵匹配快速算法: #点阵匹配快速算法

[4]

实现代码: #实现代码

[5]

MNI MRI Template: https://neuroconductor.org/help/MNITemplate/

分类:

后端

标签:

后端

作者介绍

张春成
V2