如何将逻辑卷形式 numpy 传递给 itk 以保存到 nrrd 文件?
How to pass a logical volume form numpy to itk for saving to a nrrd file?
我正在尝试使用 itk
将 numpy
卷保存为 NRRD
文件格式,以便稍后与 Matlab
一起使用,我想导出如果可能的话,将文件设为 Boolean
或 logical
数据类型。
该操作适用于 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()
npVol
(numpy
3D数组)的原始类型是float64
,我的问题是我不知道如何保存它是logical
或bool
节省内存的数据类型(我必须导出很多文件,而且它们是大文件)。
我尝试将类型转换为 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
的新手
二进制掩码经常需要 bool
s 的图像,但我看到的所有真实世界的解决方案都使用整数类型。 0=false,非零=true,通常为 8 位 unsigned int。 NumPy 的名称可能是 uint8,而 ITK 的名称是 UC(unsigned char)。解决这个问题很困难。
但是可以轻松实现的是将输出文件压缩 writer.SetUseCompression(True)
或 writer.UseCompressionOn()
。如果您的 "true" 值是一致的(例如总是 1 或总是 255),这些文件应该压缩得很好。如果您的图像是二进制标签图,您可以预期压缩到其原始大小的 1%-2% 左右。
我正在尝试使用 itk
将 numpy
卷保存为 NRRD
文件格式,以便稍后与 Matlab
一起使用,我想导出如果可能的话,将文件设为 Boolean
或 logical
数据类型。
该操作适用于 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()
npVol
(numpy
3D数组)的原始类型是float64
,我的问题是我不知道如何保存它是logical
或bool
节省内存的数据类型(我必须导出很多文件,而且它们是大文件)。
我尝试将类型转换为 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
的新手二进制掩码经常需要 bool
s 的图像,但我看到的所有真实世界的解决方案都使用整数类型。 0=false,非零=true,通常为 8 位 unsigned int。 NumPy 的名称可能是 uint8,而 ITK 的名称是 UC(unsigned char)。解决这个问题很困难。
但是可以轻松实现的是将输出文件压缩 writer.SetUseCompression(True)
或 writer.UseCompressionOn()
。如果您的 "true" 值是一致的(例如总是 1 或总是 255),这些文件应该压缩得很好。如果您的图像是二进制标签图,您可以预期压缩到其原始大小的 1%-2% 左右。