2015-11-16 40 views
0

我已收到單個fMRI會話的多個Nifti-Images,其中每個卷掃描已保存到單個3D-Nifti文件中。這些地方命名爲'foobar_001.nii',...,'foobar_187.nii'。我想合併這些,並寫下如下for-loop來這樣做。使用nibabel合併多個MRI圖像時的複製標題

import numpy as np 
import nibabel as ni 

def merge_nii_files (sfile, ns): 
    # This will load the first image for header information 
    img = ni.load(sfile % (3, ns[0])) 
    dshape = list(img.shape) 
    dshape.append(len(ns)) 
    data = np.empty(dshape, dtype=img.get_data_dtype()) 

    header = img.header 
    equal_header_test = True 

    # Now load all the rest of the images 
    for n, i in enumerate(ns): 
     img = ni.load(sfile % (3,i)) 
     equal_header_test = equal_header_test and img.header == header 
     data[...,n] = np.array(img.dataobj) 

    imgs = ni.Nifti1Image(data, img.affine, header=header) 
    if not equal_header_test: 
     print("WARNING: Not all headers were equal!") 
    return(imgs) 

nii_files = "example_%0*d.nii" 
images = merge_nii_files(nii_files, range(1,187)) 

正如你所看到的,我想確保頭部信息也被複制。我的問題:這個'header = header'真的夠嗎?我在問,因爲imgs具有4元組形狀,但我使用的標題來自3元組形狀。我對nibabel內核或Nifti文件格式不太瞭解。我錯過了什麼,即是否需要複製其他內容?

回答

0

不,我沒有錯過任何東西。以上作品。

+0

我不確定在所有情況下的上述工作...我從nifti對3D文件轉換,並且我沒有結束正確的TR和(我認爲)縮放從一個時間點關閉到下一個。 –

+0

爲了完整性,nibabel有一個函數'nib.concat_images(fnames)',它可以將3D卷合併爲時間序列。 –

+0

如果在單個圖像中給出了header ['pixdim'] [4]',則這將被設置爲等於合併圖​​像中的TR。所以,我使用'ni.concat_images()'合併了我的文件,並將其與我的舊文件進行了比較,並且如上面的代碼所做的那樣,也獲得了相同的結果。不過,謝謝你指點我這個功能。 –