如何在每个维度中调整或重塑卷图像?

时间:2014-07-17 13:10:04

标签: python numpy vtk

我有一个体积图像存储在vtkImageData对象中,我想要更改尺寸(例如从[100,100,100]到[120,120,120])。我想分别在每个正方向和负方向上添加零值,这样在"负X和#34;中添加5个切片。在"正X"仍然将X分辨率提高了20倍。

是否有vtk过滤器或者numpy reshape功能允许我这样做?

为什么我这样做?我正在使用python来处理体积图像。 VTK(5.10)中有一个形态学运算符,允许我扩张和侵蚀这个图像(称为vtkImageDilateErode3D)。不幸的是,当我扩大/侵蚀靠近图像边界的体素时,它会导致假象。因此,我希望"挤出"应用此运算符之前的音量。

这是一些可以在某种程度上重塑图像的python代码,但数据只是遍布整个图像。也许我可以以某种方式将以前的图像以更智能的方式复制到新阵列中? (出于性能原因,我想避免手工复制每个体素)

def change_vol_resolution(volume, res_adjust=[0,0, 0,0, 0,0]):
    changed_volume = vtk.vtkImageData()
    original_dimensions = volume.GetDimensions()

    changed_dimensions = [original_dimensions[0] + res_adjust[0] + res_adjust[1], original_dimensions[1] + res_adjust[2] + res_adjust[3], original_dimensions[2] + res_adjust[4] + res_adjust[5]]
    changed_volume.SetDimensions(changed_dimensions)

    changed_volume.SetScalarTypeToShort()
    changed_volume.SetNumberOfScalarComponents(volume.GetNumberOfScalarComponents())
    changed_volume.AllocateScalars()

    np_array = numpy_support.vtk_to_numpy(volume.GetPointData().GetScalars())
    np_array_copy = np.copy(np_array)
    np_array_copy.resize(changed_dimensions[0]*changed_dimensions[1]*changed_dimensions[2])

    changed_volume.GetPointData().SetScalars(numpy_support.numpy_to_vtk(np_array_copy,deep=1))

    return changed_volume

更新:我发现了一个名为numpy.pad()的numpy函数,它允许添加空的"填充"在矩阵的任何维度方向上的区域,这正是我正在寻找的。

1 个答案:

答案 0 :(得分:2)

由于我没有足够的代表将此作为评论写,我将不得不写这个作为答案。 虽然你弄清楚如何重塑numpy,但vtk中有一些过滤器可以执行该任务(也许它有帮助,因为你不必将图像复制到numpy数组中)。目前,他们是三个过滤器,它们都是摘要vtkImagePadFiter的子类。请参阅vtkImagePadFilter Documentation VTK 5.10

首先是vtkImageConstantPad,它用常量填充其他值。我想这就是你想要的。请参阅vtkImageConstantPad Documentation VTK 5.10

其次是vtkImageMirroPad,它通过用原始图像的镜像填充额外像素来使图像更大。

第三个是vtkImageWrapPad,它通过模数包装现有图像以填充新的像素/体素。

P.S我的低代表不允许我添加其他两个过滤器的文档链接,但它们很容易找到。