We rely on ants.registration to do motion correction which provides the user with full access to parameters and outputs. The key steps, then, are to:
In [2]:
import ants
import numpy as np
We illustrate the steps below by building a 3D "functional" image and then "motion correcting" just as we would do with functional MRI or any other dynamic modality.
In [6]:
image = ants.image_read(ants.get_ants_data('r16'))
image2 = ants.image_read(ants.get_ants_data('r64'))
ants.set_spacing( image, (2,2) )
ants.set_spacing( image2, (2,2) )
imageTar = ants.make_image( ( *image2.shape, 2 ) )
ants.set_spacing( imageTar, (2,2,2) )
fmri = ants.list_to_ndimage( imageTar, [image,image2] )
Now we motion correct this image just using the first slice as target.
In [13]:
ants.set_direction( fmri, np.eye( 3 ) * 2 )
images_unmerged = ants.ndimage_to_list( fmri )
motion_corrected = list()
for i in range( len( images_unmerged ) ):
areg = ants.registration( images_unmerged[0], images_unmerged[i], "SyN" )
motion_corrected.append( areg[ 'warpedmovout' ] )
Merge the resuling list back to a 3D image.
In [27]:
motCorr = ants.list_to_ndimage( fmri, motion_corrected )
# ants.image_write( motCorr, '/tmp/temp.nii.gz' )
Done!