Nipyを利用して、機能画像から値が0でないvoxelに一律に1を与えて二値的なbinary maskを作る方法です。
#この方法だとcoord_dtypeがfloat64のままなので、int16に変更するにはどうしたらよいか考え中です。read-onlyのAffineTransformなので(この辺はSPMの方が分かりやすいか)。
いずれにせよポイントはget_data()したイメージ本体に対し、0でない要素の番号を以下の方法で抽出することです。
num=np.transpose(np.where(image_data>0))
そしてこの番号を持つ要素の値を全部1に置き直します。
for i in range(len(num)):
image_data[num[i][0],num[i][1],num[i][2]]=1.0
この方法でROI maskを作れます。SPMでも利用できるよう、nii.gzファイルに加え、解凍したnii(NIFTI)が同時に生成するようにしておきました。
以下、ファイルをダウンロードして、適当に関数化してください。
import numpy as np
from nipy import load_image, save_image #Needs nipy
from nipy.core.api import Image
import os
image='sequential_pFgA_z_FDR_0.01.nii.gz'
fname='bin_' + image
loaded_images= load_image(image)
image_data=loaded_images.get_data()
num=np.transpose(np.where(image_data>0))
for i in range(len(num)):
image_data[num[i][0],num[i][1],num[i][2]]=1.0
save_image(Image(image_data,loaded_images.coordmap), fname)
os.system('gzip -cd '+ fname + ' > ' + '' + fname[:-3])