首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用NiBabel写一个彩色3D NIfTI?

如何用NiBabel写一个彩色3D NIfTI?
EN

Stack Overflow用户
提问于 2016-11-11 02:10:37
回答 2查看 2.3K关注 0票数 4

我用nibabel写出3D灰度.nii文件并在NIfTI查看器(芒果,MCIcron)中打开它们都没有问题。然而,我还无法写出3D颜色,因为每个RGB平面都被解释为不同的体积。例如,下面的输出:

代码语言:javascript
复制
import nibabel as nib
import numpy as np
nifti_path = "/my/local/path"
test_stack = (255.0 * np.random.rand(20, 201, 202, 3)).astype(np.uint8)
ni_img = nib.Nifti1Image(test_stack, np.eye(4))
nib.save(ni_img, nifti_path)

被视为3个独立的20x201x202卷。我也试着将颜色平面放在第一个轴上(即np.random.rand(3,20,201,202)),但得到了相同的问题。环顾四周,对于24位RGB平面图像,似乎有一个“数据集”字段需要设置为128。关于nibabel的一件好事是它如何根据提供给它的numpy数组自动设置头部。然而,这是一个模棱两可的情况,如果我打印标题信息,我可以看到它将数据类型设置为2 (uint8),这可能是为什么观众将其解释为单独的卷,而不是RGB24。我在API中看不到对设置数据类型的任何官方支持,但是the documentation确实提到了那些有“巨大勇气”的人可以访问原始字段。这样做,即

代码语言:javascript
复制
hdr = ni_img.header
raw = hdr.structarr
raw['datatype'] = 128

适用于更改标头值

代码语言:javascript
复制
print(hdr)

给出"datatype : RGB“,但在写入时

代码语言:javascript
复制
nib.save(ni_img, nifti_path)

我得到一个错误:

代码语言:javascript
复制
File "<python path>\lib\site-packages\nibabel\arraywriters.py", line 126, in scaling_needed
raise WriterError('Cannot cast to or from non-numeric types')
nibabel.arraywriters.WriterError: Cannot cast to or from non-numeric types

如果某个arr_dtype != out_dtype,则会引发异常,因此我对raw标头的修改可能导致了一些不一致。

那么,有没有合适的方法来做到这一点呢?

EN

回答 2

Stack Overflow用户

发布于 2017-08-02 07:04:21

多亏了神经成像分析邮件列表中的matthew.brett,我可以这样写出3-d彩色NIfTI:

代码语言:javascript
复制
# ras_pos is a 4-d numpy array, with the last dim holding RGB
shape_3d = ras_pos.shape[0:3]
rgb_dtype = np.dtype([('R', 'u1'), ('G', 'u1'), ('B', 'u1')])
ras_pos = ras_pos.copy().view(dtype=rgb_dtype).reshape(shape_3d)  # copy used to force fresh internal structure
ni_img = nib.Nifti1Image(ras_pos, np.eye(4))
nib.save(ni_img, output_path)
票数 4
EN

Stack Overflow用户

发布于 2019-05-12 23:44:34

使用所建议的方法工作,用例如ITK-SNAP查看RGB卷是没有问题的,

代码语言:javascript
复制
# ras_pos is a 4-d numpy array, with the last dim holding RGB
shape_3d = ras_pos.shape[0:3]
rgb_dtype = np.dtype([('R', 'u1'), ('G', 'u1'), ('B', 'u1')])
ras_pos = ras_pos.copy().view(dtype=rgb_dtype).reshape(shape_3d)  # copy used 
#to force fresh internal structure
ni_img = nib.Nifti1Image(ras_pos, np.eye(4))
nib.save(ni_img, output_path)

但是,重新加载图像只适用于get_data()

代码语言:javascript
复制
ni_img = nib.load(output_path)

# this will result in error
data = img.get_fdata()

# this will work fine, but get_data() is going to be removed.
data = img.get_data()

这一点很关键,因为get_data()将在将来的版本中删除。建议仅使用get_fdata()。当前在get_fdata()方法中有一个错误,它不能将RGB数据转换为有效的数值数组。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40534333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档