在 Paraview 上可视化 SimpleITK 坐标

问题描述

我正在尝试制作一个 SimpleITK 图像,其中我希望特定的体素值为 1,其余为 0。我是 SimpleITK 的新手,所以我觉得我错过了一些东西。

无论如何,我已经生成了一些索引,我将体素值指定为 1。但是,我希望能够可视化这些样本在空间中相对于彼此的方向。我已经尝试了多种方法,将所需索引为 1 的充满零的数组转换为 NIFTI 图像,但是我仍然无法将其可视化并查看这些点的外观

下面是我尝试过的基本代码片段

 def WriteSampletodisk():
"""Creates an empty image,assigns generated samples with voxel value 1 and writes it to disk.

returns image written to disk"""

img = sitk.Image(512,512,416,sitk.sitkInt16)
img.Setorigin((0,0))
img.SetSpacing((1,1,1))

#Some code to get indices 
for i in range(len(dimx)): #Same number of elements in every index dimension
    img.SetPixel(dimz[i],dimy[i],dimx[i],1)#Sitk convention takes z axis as the first axis
arr = sitk.GetArrayFromImage(img)
print(np.argwhere(arr == 1)) --> It's giving me the indices where I have Set the voxel value as 1
sitk.WriteImage(img,"image.nii")
return img

但是,即使设置了阈值,当我尝试在 paraview 上查看它时,我仍然一无所获。这可能是什么原因?有没有办法绕过这个问题?

解决方法

您的体素类型是 Int16,其范围为 -32768 到 32767。但是您将体素设置为 1。鉴于强度范围,这与 0 没有什么不同,因此它几乎与 0 相同,视觉上。

尝试将体素设置为 32767。此外,您可能希望在设置体素后扩大图像。单体素点将非常小且难以看到。运行 BinaryDilateFilter 以增大点的大小。

更新:好的,这是我写的一个例子。它创建一个 UInt8 体积并将其中的随机点设置为 255。然后它从点体积中创建一个距离图体积。

import random
import SimpleITK as sitk

random.seed()

img = sitk.Image([512,512,512],sitk.sitkUInt8)

for i in range(1000):
    x = random.randrange(512)
    y = random.randrange(512)
    z = random.randrange(512)
    print(x,y,z)

    img[x,z] = 255

sitk.WriteImage(img,"dots.nrrd")

dist = sitk.SignedMaurerDistanceMap(img)
sitk.WriteImage(dist,"dots.dist.nrrd")

sitk.Show(dist)

对于 SignedMaurierDistanceMap,体素可以是任何值,只要它不是背景值即可。