如何在每个维度上调整或重塑体积图像?

2024-10-04 15:27:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个vtkImageData对象中存储了一个体积图像,我想更改其尺寸(例如从[100100100]更改为[120120120])。我想在每个正方向和负方向上分别添加零值,这样在“负X”中添加5个切片,“正X”中添加15个切片仍然会使X分辨率总共增加20个。在

有没有一个vtk过滤器或者一个numpy整形功能可以让我这样做?在

我为什么要这么做?我用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函数,它允许在矩阵的任何维度方向上添加空的“padding”区域,这正是我正在寻找的。在


Tags: 图像numpynp体积res方向arraydimensions
1条回答
网友
1楼 · 发布于 2024-10-04 15:27:54

因为我没有足够的代表来写这个作为评论,我将不得不写这作为一个答案。 虽然您已经了解了如何使用numpy进行整形,但是vtk中有一些过滤器可以执行该任务(可能这有帮助,因为您不必将图像复制到numpy数组中)。目前有三个过滤器,它们都是抽象的vtkImagePadFiter的子类。见vtkImagePadFilter Documentation VTK 5.10。在

首先是vtkImageConstantPad,它用常量填充附加值。我想这就是你想要的。见vtkImageConstantPad Documentation VTK 5.10。在

第二个是vtkImageMirroPad,它通过用原始图像的镜像填充额外的像素,使图像变大。在

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

p.S我的低代表不允许我添加到其他两个过滤器的文档链接,但他们无论如何都很容易找到。在

相关问题 更多 >

    热门问题