Search code examples
pythonnumpyniftinibabel

How to convert 3D numpy array to nifti image in nibabel?


From this question How to convert Nifti file to Numpy array?, I created a 3D numpy array of a nifti image. I made some modifications to this array (changed depth of the array by adding padding of zeroes).

How can I convert this array back to nifti image?

I tried:

imga = Image.fromarray(img, 'RGB')
imga.save("modified/volume-20.nii")

but it doesn't identify nii extension. I also tried:

nib.save(img,'modified/volume-20.nii')

this is also not working, because img must be nibabel.nifti1.Nifti1Image if I want to use nib.save feature. In both of the examples above img is a 3D numpy array.


Solution

  • Assuming that you a numpy array and you want to use nib.save function, you need to first get the affine transformation.

    Example:

    # define the path to the data
    func_filename = os.path.join(data_path, 'task-rest_bold.nii.gz')
    
    # load the data
    func = nib.load(func_filename)
    
    # do computations that lead to a 3D numpy array called "output"
    # bla bla bla
    # output = np.array(....)
    
    # to save this 3D (ndarry) numpy use this
    ni_img = nib.Nifti1Image(output, func.affine)
    
    nib.save(ni_img, 'output.nii.gz')
    

    Now you will be able to overlay the output.nii.gz onto the task-rest_bold.nii.gz