我用 nibabel 写出 3D 灰度 .nii 文件并在 NIfTI 查看器(Mango、MCIcron)中打开它们没有问题。但是我无法写出 3D 颜色,因为每个 RGB 平面都被解释为不同的体积。例如,由此产生的输出:
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中没有看到任何官方支持设置数据类型,但 文档确实提到了对具有“很大勇气”的人的原始字段的访问权限。这样做,即
hdr = ni_img.header
raw = hdr.structarr
raw['datatype'] = 128
用于更改标题值
print(hdr)
给出“数据类型:RGB”但在写入时
nib.save(ni_img, nifti_path)
我收到一个错误:
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 会引发异常,所以大概我对原始标头的黑客攻击导致了一些不一致。
那么,有没有合适的方法来做到这一点?