--- a +++ b/ants/ops/reorient_image.py @@ -0,0 +1,115 @@ + + + +__all__ = ['get_orientation', + 'reorient_image2', + 'get_possible_orientations', + 'get_center_of_mass'] + +import numpy as np +from tempfile import mktemp + +import ants +from ants.decorators import image_method +from ants.internal import get_lib_fn + + + +_possible_orientations = ['RIP','LIP', 'RSP', 'LSP', 'RIA', 'LIA', +'RSA', 'LSA', 'IRP', 'ILP', 'SRP', 'SLP', 'IRA', 'ILA', 'SRA', +'SLA', 'RPI', 'LPI', 'RAI', 'LAI', 'RPS', 'LPS', 'RAS', 'LAS', +'PRI', 'PLI', 'ARI', 'ALI', 'PRS', 'PLS', 'ARS', 'ALS', 'IPR', +'SPR', 'IAR', 'SAR', 'IPL', 'SPL', 'IAL', 'SAL', 'PIR', 'PSR', +'AIR', 'ASR', 'PIL', 'PSL', 'AIL', 'ASL'] + + +def get_possible_orientations(): + return _possible_orientations + +@image_method +def get_orientation(image): + direction = image.direction + + orientation = [] + for i in range(3): + row = direction[:,i] + idx = np.where(np.abs(row)==np.max(np.abs(row)))[0][0] + + if idx == 0: + if row[idx] < 0: + orientation.append('L') + else: + orientation.append('R') + elif idx == 1: + if row[idx] < 0: + orientation.append('P') + else: + orientation.append('A') + elif idx == 2: + if row[idx] < 0: + orientation.append('S') + else: + orientation.append('I') + return ''.join(orientation) + +@image_method +def reorient_image2(image, orientation='RAS'): + """ + Reorient an image. + Example + ------- + >>> import ants + >>> mni = ants.image_read(ants.get_data('mni')) + >>> mni2 = mni.reorient_image2() + """ + if image.has_components: + return ants.merge_channels([img.reorient_image2(orientation) for img in ants.split_channels(image)], + channels_first=image.channels_first) + + if image.dimension != 3: + raise ValueError('image must have 3 dimensions') + + inpixeltype = image.pixeltype + ndim = image.dimension + if image.pixeltype != 'float': + image = image.clone('float') + + libfn = get_lib_fn('reorientImage2') + itkimage = libfn(image.pointer, orientation) + + new_img = ants.from_pointer(itkimage) + if inpixeltype != 'float': + new_img = new_img.clone(inpixeltype) + return new_img + +@image_method +def get_center_of_mass(image): + """ + Compute an image center of mass in physical space which is defined + as the mean of the intensity weighted voxel coordinate system. + + ANTsR function: `getCenterOfMass` + + Arguments + --------- + image : ANTsImage + image from which center of mass will be computed + + Returns + ------- + scalar + + Example + ------- + >>> fi = ants.image_read( ants.get_ants_data("r16")) + >>> com1 = ants.get_center_of_mass( fi ) + >>> fi = ants.image_read( ants.get_ants_data("r64")) + >>> com2 = ants.get_center_of_mass( fi ) + """ + if image.pixeltype != 'float': + image = image.clone('float') + + libfn = get_lib_fn('centerOfMass') + com = libfn(image.pointer) + + return tuple(com)