我有一个存储在 vtkImageData
对象中的体积图像,我想更改其尺寸(例如从 [100,100,100] 到 [120,120,120])。我想在每个正向和负向分别添加零值,这样在“负 X”中添加 5 个切片,在“正 X”中添加 15 个切片仍然会将 X 分辨率总共增加 20。
是否有 vtk 过滤器或者 numpy reshape 函数可以让我做到这一点?
我为什么要这么做?我正在使用 python 来处理体积图像。 VTK (5.10) 中有一个形态运算符,允许我膨胀和腐 eclipse 该图像(称为 vtkImageDilateErode3D)。不幸的是,当我膨胀/腐 eclipse 靠近图像边界的体素时,它会导致伪影。因此,我想在应用此运算符之前“挤出”体积。
这里有一些 python 代码,可以在一定程度上 reshape 图像,但数据只是散布在整个图像上。也许我可以以某种更智能的方式将前一个图像复制到新数组中? (出于性能原因,我想避免手动复制每个体素)
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 函数,它允许在矩阵的任何维度方向添加空的“填充”区域,这正是我正在寻找的。
最佳答案
由于我没有足够的代表将其写为评论,因此我必须将其写为答案。
尽管您知道如何使用 numpy reshape 形状,但 vtk 中的过滤器可以执行该任务(也许它有帮助,因为您不必将图像复制到 numpy 数组中)。目前存在三个过滤器,它们都是抽象 vtkImagePadFiter
的子类。请参阅vtkImagePadFilter Documentation VTK 5.10 .
首先是vtkImageConstantPad
,它用常量填充附加值。我想这就是你想要的。请参阅vtkImageConstantPad Documentation VTK 5.10 .
其次是vtkImageMirroPad
,它通过用原始图像的镜像填充额外的像素来放大图像。
第三个是vtkImageWrapPad
,它通过模数包装现有图像以填充新的像素/体素。
P.S 我的低代表不允许我添加其他两个过滤器文档的链接,但无论如何它们都很容易找到。
关于python - 如何在每个维度上调整体积图像的大小或形状?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24804527/