2016-11-10 13 views
1

3Dグレイスケールの.niiファイルをnibabelで書き出し、NIfTIビューア(Mango、MCIcron)で開くのに問題はありませんでした。しかし、私は各RGBプレーンが異なるボリュームとして解釈されているので、3Dカラーを書き出すことはできませんでした。例えば。これからの出力:NiBabelで3D NIfTIを作成するには?

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ではなく別のボリュームとして解釈しているためです。 the documentationには、「勇気のある人」の生のフィールドへのアクセスが記載されていますが、APIには公式のサポートはありません。ヘッダー値

print(hdr) 

を変更するには、この、すなわち

hdr = ni_img.header 
raw = hdr.structarr 
raw['datatype'] = 128 

作品を行うと、 "データ型: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、おそらく私の生のヘッダーのハッキングは、いくつかの不一致を引き起こしています。

これを行う適切な方法はありますか?

答えて

0

神経画像解析メーリングリストでmatthew.brettのおかげで、私はそうのような3-Dの色NIfTIを書き出すことができるよ:

# 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) 
関連する問題