我正在尝试使用Nibabel将numpy数组转换为Nifti文件格式。我的一些Numpy数组有dtype('<i8'),当Nibabel调用数据类型时,它应该是dtype('uint8')。
arr.get_data_dtype()有人知道如何转换和保存Numpy数组的数据类型吗?
发布于 2017-08-09 11:29:57
标题问题与案文中的问题略有不同。所以..。
如果要将numpy数组arr的数据类型更改为np.int8,则需要查找arr.astype(np.int8)。
请注意,由于数据转换,您可能会丢失精度(请参阅错误类型文档)
为了以后保存它,您可能希望看到?np.save和?np.savetxt (或者检查库pickle,以保存比numpy数组更多的普通对象)。
如果要更改保存在my_image.nii.gz中的nifti映像的数据类型,则必须选择:
import nibabel as nib
import numpy as np
image = nib.load('my_image.nii.gz')
# to be extra sure of not overwriting data:
new_data = np.copy(image.get_data())
hd = image.header
# in case you want to remove nan:
new_data = np.nan_to_num(new_data)
# update data type:
new_dtype = np.int8 # for example to cast to int8.
new_data = new_data.astype(new_dtype)
image.set_data_dtype(new_dtype)
# if nifty1
if hd['sizeof_hdr'] == 348:
new_image = nib.Nifti1Image(new_data, image.affine, header=hd)
# if nifty2
elif hd['sizeof_hdr'] == 540:
new_image = nib.Nifti2Image(new_data, image.affine, header=hd)
else:
raise IOError('Input image header problem')
nib.save(new_image, 'my_image_new_datatype.nii.gz')最后,如果您有一个numpy数组my_arr,并且希望将它保存到具有给定数据类型np.my_dtype的nifti映像中,那么您可以这样做:
import nibabel as nib
import numpy as np
new_image = nib.Nifti1Image(my_arr, np.eye(4))
new_image.set_data_dtype(np.my_dtype)
nib.save(new_image, 'my_arr.nii.gz')希望能帮上忙!
注意:如果您正在使用ITKsnap,您可能希望使用np.float32、np.float64、np.uint16、np.uint8、np.int16、np.int8。其他选择可能无法生成可以使用此软件打开的图像。
发布于 2018-04-18 15:12:34
似乎你也可以
import nibabel
img = nibabel.load(filename)
img.set_data_dtype(dtype)
img.to_filename(new_filename)发布于 2021-04-26 01:14:27
你可以用尼尔学来解决问题。下面是一个示例,如果您想将nifti图像的数据类型更改为int16:
from nilearn import image
import numpy as np
vol = image.load_img(input_file)
vol = image.new_img_like(vol, np.int16(vol.get_fdata()))
vol.to_filename(output_file)https://stackoverflow.com/questions/44397617
复制相似问题