微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Paraview 上可视化 SimpleITK 坐标

如何解决在 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,体素可以是任何值,只要它不是背景值即可。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。