nibabel を使用して 3D グレースケール .nii ファイルを書き出し、NIfTI ビューアー (Mango、MCIcron) で開くことに問題はありませんでした。ただし、各 RGB プレーンが異なるボリュームとして解釈されているため、3D カラーを書き出すことができませんでした。たとえば、これからの出力:
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 の優れた点の 1 つは、供給された numpy 配列に基づいてヘッダーを自動的に設定する方法です。ただし、これはあいまいなケースであり、ヘッダー情報を出力すると、データ型が 2 (uint8) に設定されていることがわかります。これがおそらく、視聴者が RGB24 ではなく別のボリュームとして解釈しているためです。APIでデータ型を設定するため の正式なサポートは見当たりませんが、ドキュメンテーションには、「大きな勇気」を持つ人のための raw フィールドへのアクセスについて言及されています。これを行う、つまり
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 の場合に例外が発生するため、生のヘッダーをハッキングすると、後で不整合が発生する可能性があります。
それで、これを行う適切な方法はありますか?