<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr">
<p>Hello Chris,</p>
<p><br>
</p>
<p>I have used these two functions to convert a 4d nifti dataset to N, 3d volumes.</p>
<p>Perhaps this will help you.  You can easily store the first volume and then resample.<br>
</p>
<p>____________________________________________________________</p>
<p></p>
<div>!/usr/bin/env python3<br>
<br>
#<br>
# Use nibabel tools to convert a 4D (space+time) single file nifti<br>
# file to a set of single volume pairs of (.img,.hdr) files<br>
<br>
import os<br>
import sys<br>
import numpy as np<br>
import nibabel as nib<br>
<br>
def nii_4d_to_3d_pair(fname):<br>
    """ convert a nifti1 4D image to N nifti1 3d pair (.img,.hdr) images """<br>
    if not fname.endswith('nii'):<br>
        sys.exit('filename must be a 4D nifti file: {}'.format(fname))<br>
<br>
    img4d = nib.load(fname)<br>
    basename = img4d.get_filename()[:-4]<br>
    affine = img4d.affine     # save affine<br>
    header = img4d.header     # save header<br>
    numvols = img4d.shape[3]  # 4th dimension is time (number of volumes)<br>
    data = img4d.get_data()   # 4d numpy array<br>
<br>
    for i in range(numvols):<br>
        img3d = nib.Nifti1Pair(data[:,:,:,i], affine, header)<br>
        img3d_name = '{0}_{1:02d}.img'.format(basename, i)<br>
        nib.save(img3d, img3d_name)<br>
<br>
def nii_4d_to_3d(fname):<br>
    """ convert a nifti1 4D image to N nifti1 3d single file images """<br>
    if not fname.endswith('nii'):<br>
        sys.exit('filename must be a 4D nifti file: {}'.format(fname))<br>
<br>
    img4d = nib.load(fname)<br>
    basename = img4d.get_filename()[:-4]<br>
    affine = img4d.affine     # save affine<br>
    header = img4d.header     # save header<br>
    numvols = img4d.shape[3]  # 4th dimension is time (number of volumes)<br>
    data = img4d.get_data()   # 4d numpy array<br>
<br>
    for i in range(numvols):<br>
        img3d = nib.Nifti1Image(data[:,:,:,i], affine, header)<br>
        img3d_name = '{0}_{1:02d}.nii'.format(basename, i)<br>
        nib.save(img3d, img3d_name)<br>
<br>
if __name__ == '__main__':<br>
    usage = 'conv_4dto3d.py file.nii'<br>
    if len(sys.argv) < 2:<br>
        sys.exit(usage)<br>
    fname = sys.argv[1]<br>
    nii_4d_to_3d_pair(fname)<br>
<br>
</div>
__________________________________<br>
<p></p>
<p><br>
</p>
<div id="Signature">
<div class="BodyFragment"><font size="2"><span style="font-size:10pt;">
<div class="PlainText">Brad J Zoltick<br>
Computer Engineer<br>
<br>
NIH/NIMH<br>
Building 10, Room 3C-210<br>
Bethesda, MD 20892-1394<br>
<br>
Tel (301)402-3232<br>
Fax (301)480-7795</div>
</span></font></div>
</div>
<br>
<br>
<div style="color: rgb(0, 0, 0);">
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="divRplyFwdMsg" dir="ltr"><font style="font-size:11pt" color="#000000" face="Calibri, sans-serif"><b>From:</b> Christopher Cox <christopher.cox-2@manchester.ac.uk><br>
<b>Sent:</b> Thursday, October 12, 2017 9:15 AM<br>
<b>To:</b> neuroimaging@python.org<br>
<b>Subject:</b> [Neuroimaging] Question about nibabel.processing</font>
<div> </div>
</div>
<div>
<div style="">
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
Hello,</p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
 </p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
My first question should really be: how do you review the archive for this mailing list? I imagine this question has been answered, but I do not know where to look.</p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
 </p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
I am attempting something very simple: I want to resample a volume. The nifti file on disk is 4D, and contains two volumes. Nibabel.processing.resample_to_output() will not work with 4D data. Fortunately for me, I only care about the first volume in this dataset.
 So I should have no problem. </p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
 </p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
But... nothing I can think to try works. I apologize it is difficult to read, but I’ve condensed several of my attempts into an interactive python session, and copied all of my work and the errors I am getting as a post script. I tried to color code, but that
 might not come through.</p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
 </p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
My first attempt is to try and pass the sliced data object (as in, data = img.get_data()), but that is a memory map as lacks the metadata the function requires. I tried passing the image (as in, img = nib.load(…)), but it cannot be sliced like the data can.
 I then tried simply loading only a single volume into memory (as in, vol0 = img.datobj[…,0]), but that doesn’t work either (vol0 is a numpy array, and img is still seen as 4D).  I tried updating the shape metadata in img, but that’s read only.</p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
 </p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="color:black">Thank you very much for helping me figure out the intended way to use this function.</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
 </p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
Best,</p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
Chris</p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
 </p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas">Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas">Type "help", "copyright", "credits" or "license" for more information.</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas">>>> import nibabel as nib</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas">>>> nib.__version__</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:#0070C0">'2.1.0'</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas"> </span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas">>>> import nibabel.processing</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas">>>> img = nib.load('Template_6.nii')</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas">>>> img.shape</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:#0070C0">(121, 145, 121, 2)</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas"> </span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas">>>> data = img.get_data()</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas">>>> r = nib.processing.resample_to_output(data[...,0], [3,3,3])</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">Traceback (most recent call last):</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">  File "<stdin>", line 1, in <module></span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">  File "C:\Users\mbmhscc4\AppData\Roaming\Python\Python36\site-packages\nibabel\processing.py", line 242, in resample_to_output</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">    out_vox_map = vox2out_vox((in_img.shape, in_img.affine), voxel_sizes)</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<b><span style="font-family:Consolas; color:red">AttributeError: 'memmap' object has no attribute 'affine'</span></b></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas"> </span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas">>>> r = nib.processing.resample_to_output(img, [3,3,3])</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">Traceback (most recent call last):</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">  File "<stdin>", line 1, in <module></span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">  File "C:\Users\mbmhscc4\AppData\Roaming\Python\Python36\site-packages\nibabel\processing.py", line 242, in resample_to_output</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">    out_vox_map = vox2out_vox((in_img.shape, in_img.affine), voxel_sizes)</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">  File "C:\Users\mbmhscc4\AppData\Roaming\Python\Python36\site-packages\nibabel\spaces.py", line 76, in vox2out_vox</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">    raise ValueError('This function can only deal with 3D images')</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<b><span style="font-family:Consolas; color:red">ValueError: This function can only deal with 3D images</span></b></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas"> </span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas">>>> r = nib.processing.resample_to_output(img[...,0], [3,3,3])</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">Traceback (most recent call last):</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">  File "<stdin>", line 1, in <module></span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<b><span style="font-family:Consolas; color:red">TypeError: __getitem__() takes 1 positional argument but 2 were given</span></b></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas"> </span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas">>>> vol0 = img.dataobj[...,0]</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas">>>> r = nib.processing.resample_to_output(vol0, [3,3,3])</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">Traceback (most recent call last):</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">  File "<stdin>", line 1, in <module></span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">  File "C:\Users\mbmhscc4\AppData\Roaming\Python\Python36\site-packages\nibabel\processing.py", line 242, in resample_to_output</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">    out_vox_map = vox2out_vox((in_img.shape, in_img.affine), voxel_sizes)</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<b><span style="font-family:Consolas; color:red">AttributeError: 'numpy.ndarray' object has no attribute 'affine'</span></b></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas"> </span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas"># This is after the previous attempt, loading only the first volume. img remains 4D</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas">>>> r = nib.processing.resample_to_output(img, [3,3,3])</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">Traceback (most recent call last):</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">  File "<stdin>", line 1, in <module></span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">  File "C:\Users\mbmhscc4\AppData\Roaming\Python\Python36\site-packages\nibabel\processing.py", line 242, in resample_to_output</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">    out_vox_map = vox2out_vox((in_img.shape, in_img.affine), voxel_sizes)</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">  File "C:\Users\mbmhscc4\AppData\Roaming\Python\Python36\site-packages\nibabel\spaces.py", line 76, in vox2out_vox</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">    raise ValueError('This function can only deal with 3D images')</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<b><span style="font-family:Consolas; color:red">ValueError: This function can only deal with 3D images</span></b></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas"> </span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas"> </span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas">>>> img.shape = img.shape[0:3]</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">Traceback (most recent call last):</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="font-family:Consolas; color:red">  File "<stdin>", line 1, in <module></span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<b><span style="font-family:Consolas; color:red">AttributeError: can't set attribute</span></b></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
 </p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="color:black"> </span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="color:black">Christopher R. Cox, PhD</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="color:black">Neuroscience and Aphasia Research Unit (NARU)</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="color:black">University of Manchester, UK</span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
<span style="color:black"><a href="mailto:christopher.cox-2@manchester.ac.uk" target="_blank" style="color: blue; text-decoration: underline;"><span style="color:blue">christopher.cox-2@manchester.ac.uk</span></a></span></p>
<p style="margin: 0cm 0cm 0.0001pt; font-size: 11pt; font-family: "Calibri","sans-serif";">
 </p>
</div>
</div>
</div>
</div>
</body>
</html>