python - 如何在每个维度上调整体积图像的大小或形状?

标签 python numpy vtk

我有一个存储在 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/

相关文章:

python - 使 SpaCy 基于规则的匹配运算符变得贪婪

python - Numpy 距阵列中心的平均距离

python - 使用 vtk 时导入的 undefined variable

c++ - C++ 中顶点/边的 VTK 自定义 ID

python - 选择带宽和线性空间进行核密度估计。 (为什么我的带宽不起作用?)

python - 将字母序列传递给 CNN - Keras

python - 无法在 Windows 中安装 ionic

python - 使用 python 和 numpy 进行梯度下降

python - 在 Python 中从 .csv 文件排序

c++ - 查找基类/父类(super class)成员的实现