如何使用Python中的SimpleElastix执行3d图像注册?

时间:2018-05-16 11:57:29

标签: python image-registration elastix-itk

我试图注册两个3d卷。尝试此操作可以找到here。代码首先生成两个不同的卷,两个卷都只包含一个半径为4的球体。然后尝试使用默认的转换参数映射来对齐它们。但是,从最后一行(以及本地运行的图表)可以看出,结果卷根本不与固定卷对齐。尝试相同的步骤时,在这次的2d中,生成的图像看起来与固定图像正确对齐,如here所示。我是否错误地使用SimpleElastix API?我浏览了SimpleElastix的Github回购,但我找不到任何3d图像注册的例子(至少不使用Python生成的卷然后将它们转换为ITK图像)。

来自3d示例的代码:

vol1 = np.zeros((50, 50, 50))
for x in range(vol.shape[0]):
    for y in range(vol.shape[1]):
        for z in range(vol.shape[2]):
            vol1[x, y, z] = np.linalg.norm(np.subtract([x, y, z], [5, 3, 2])) < 4

vol2 = np.zeros((50, 50, 50))
for x in range(vol.shape[0]):
    for y in range(vol.shape[1]):
        for z in range(vol.shape[2]):
            vol1[x, y, z] = np.linalg.norm(np.subtract([x, y, z], [20, 30, 10])) < 4

img_a = sitk.GetImageFromArray(vol1)
img_b = sitk.GetImageFromArray(vol2)

parameterMap = sitk.GetDefaultParameterMap('translation')

itk_filter = sitk.ElastixImageFilter()
itk_filter.LogToConsoleOn()
itk_filter.SetFixedImage(img_a)
itk_filter.SetMovingImage(img_b)
itk_filter.SetParameterMap(parameterMap)
itk_filter.Execute()

result_vol = sitk.GetArrayFromImage(itk_filter.GetResultImage())

np.max(np.abs(vol1 - result_vol))

第二个例子的代码:

vol1 = np.zeros((50, 50))
for x in range(vol1.shape[0]):
    for y in range(vol1.shape[1]):
        vol1[x, y] = np.linalg.norm(np.subtract([x, y], [20, 20])) < 4

vol2 = np.zeros((50, 50))
for x in range(vol2.shape[0]):
    for y in range(vol2.shape[1]):
        vol2[x, y] = np.linalg.norm(np.subtract([x, y], [4, 5])) < 4

img_a = sitk.GetImageFromArray(vol1)
img_b = sitk.GetImageFromArray(vol2)

parameterMap = sitk.GetDefaultParameterMap('translation')

itk_filter = sitk.ElastixImageFilter()
itk_filter.LogToConsoleOn()
itk_filter.SetFixedImage(img_a)
itk_filter.SetMovingImage(img_b)
itk_filter.SetParameterMap(parameterMap)
itk_filter.Execute()

result_vol = sitk.GetArrayFromImage(itk_filter.GetResultImage())

np.max(np.abs(vol1 - result_vol))

1 个答案:

答案 0 :(得分:0)

注册可能失败,因为球体不重叠。您可以尝试使用例如sitk.DiscreteGaussian()。但是,在此人工示例中,很可能仅将球体彼此靠近即可实现良好的配准。

请注意,由于此类图像中几乎没有梯度信息,因此很难注册二值图像:梯度仅在边界处为非零,而在其他位置则为零,因为区域在强度方向上是平坦的。