如何将逻辑卷形式 numpy 传递给 itk 以保存到 nrrd 文件?

How to pass a logical volume form numpy to itk for saving to a nrrd file?

我正在尝试使用 itknumpy 卷保存为 NRRD 文件格式,以便稍后与 Matlab 一起使用,我想导出如果可能的话,将文件设为 Booleanlogical 数据类型。

该操作适用于 int16 数据类型(但生成的文件很大):

itkVol = itk.GetImageFromArray(npVol.astype(np.int16))
imageType = itk.Image[itk.SS, 3]

writerType = itk.ImageFileWriter[imageType]
writer = writerType.New()
writer.SetFileName('/home/user/Desktop/test.nrrd')
writer.SetInput(itkVol)
writer.Update()

npVolnumpy 3D数组)的原始类型是float64,我的问题是我不知道如何保存它是logicalbool 节省内存的数据类型(我必须导出很多文件,而且它们是大文件)。

我尝试将类型转换为 bool 类型并将其传递给 itk 中的 ImageFileWriter() 但出现错误:

代码如下:

itkVol = itk.GetImageFromArray(npVol.astype(np.bool))
imageType = itk.Image[itk.B, 3]

这里是错误:

TemplateTypeError: itk.ImageFileWriter is not wrapped for input type `itk.Image[itk.B,3]`.

关于 ImageFileWriter() 不支持这种类型的错误消息非常简单,它给了我支持的输入类型列表(其中没有一个是 logical 或类型 bool):

Supported input types:

itk.Image[itk.UC,2]
itk.Image[itk.UC,3]
itk.Image[itk.RGBPixel[itk.UC],2]
itk.Image[itk.RGBPixel[itk.UC],3]
itk.Image[itk.RGBAPixel[itk.UC],2]
itk.Image[itk.RGBAPixel[itk.UC],3]
itk.Image[itk.Vector[itk.F,2],2]
itk.Image[itk.Vector[itk.F,2],3]
itk.Image[itk.Vector[itk.F,3],2]
itk.Image[itk.Vector[itk.F,3],3]
itk.Image[itk.Vector[itk.F,4],2]
itk.Image[itk.Vector[itk.F,4],3]
itk.Image[itk.CovariantVector[itk.F,2],2]
itk.Image[itk.CovariantVector[itk.F,2],3]
itk.Image[itk.CovariantVector[itk.F,3],2]
itk.Image[itk.CovariantVector[itk.F,3],3]
itk.Image[itk.CovariantVector[itk.F,4],2]
itk.Image[itk.CovariantVector[itk.F,4],3]
itk.Image[itk.SS,2]
itk.Image[itk.SS,3]
itk.Image[itk.US,2]
itk.Image[itk.US,3]
itk.Image[itk.F,2]
itk.Image[itk.F,3]
itk.Image[itk.complex[itk.F],2]
itk.Image[itk.complex[itk.F],3]
itk.VectorImage[itk.SS,2]
itk.VectorImage[itk.UC,2]
itk.VectorImage[itk.US,2]
itk.VectorImage[itk.F,2]
itk.VectorImage[itk.SS,3]
itk.VectorImage[itk.UC,3]
itk.VectorImage[itk.US,3]
itk.VectorImage[itk.F,3]

我该怎么做?

PS: 我是 python 和 itk

的新手

二进制掩码经常需要 bools 的图像,但我看到的所有真实世界的解决方案都使用整数类型。 0=false,非零=true,通常为 8 位 unsigned int。 NumPy 的名称可能是 uint8,而 ITK 的名称是 UC(unsigned char)。解决这个问题很困难。

但是可以轻松实现的是将输出文件压缩 writer.SetUseCompression(True)writer.UseCompressionOn()。如果您的 "true" 值是一致的(例如总是 1 或总是 255),这些文件应该压缩得很好。如果您的图像是二进制标签图,您可以预期压缩到其原始大小的 1%-2% 左右。