## Quick Tutorial ANTsPy functions and classes are generally faithful to the respective ANTsR versions, with the following consistent changes in naming convention:
* camel case in ANTsR is underscore case in ANTsPy * e.g. resampleImage -> resample_image * anything preceeded by `ants` or `antsr` in ANTsR is removed since ANTsPy uses namespaces already * e.g. antsImageRead -> ants.image_read ### Read an Image ```python import ants img = ants.image_read( ants.get_ants_data('r16') ) print(img) ``` ### Image Properties Image properties are pythonic and easy to get/set: ```python import ants img = ants.image_read( ants.get_ants_data('r16') ) print(img.spacing) img.set_spacing( (2., 2.) ) print(img.origin) img.set_origin( (100,100) ) ``` However, we still try to keep most of the associated ANTsR functions which are stand-alone, e.g: ```python ants.get_spacing(img) # versus the pythonic `img.spacing` ants.set_spacing(img, (2.,2.)) # versus `img.set_spacing` imgclone = ants.image_clone(img) # versus img.clone() ``` ### Converting to Numpy ANTsPy provides seamless conversions to Numpy arrays. Through the use of memory buffers directly in the C++ api, these calls are instantaneous and essentially free. ```python import ants img = ants.image_read( ants.get_ants_data('mni') ) img_array = img.numpy() ``` Do operations directly in numpy if you want, then simply make an ANTsImage right back from the numpy array (again instantaneous and "free"): ```python import ants img = ants.image_read( ants.get_ants_data('mni') ) img_array = img.numpy() img_array += 5 # copies image information and just changes the data new_img1 = img.new_image_like(img_array) # doesnt copy any information new_img2 = ants.from_numpy(img_array) # verbose way to copy information new_img3 = ants.from_numpy(img_array, spacing=img.spacing, origin=img.origin, direction=img.direction) ``` ### Indexing Images can be indexed (getting and setting) exactly as if they were arrays. ```python import ants img = ants.image_read( ants.get_ants_data('mni') ) vals = img[200,:,:] # get a slice img[100,:,:] = 1 # set a slice ``` ### Operator Overloading All common mathematical operators are overloaded to work directly on ANTsImages: ```python import ants import numpy as np img = ants.image_read( ants.get_ants_data('mni') ) img2 = img.clone() img3 = img + img2 print(np.allclose(img.numpy()+img2.numpy(), img3.numpy())) # same as if done in numpy ``` ### Chaining Commands In ANTsR you can use the `%>%` command to chain operations. That's real nice. In ANTsPy, you can do this automatically on ANTsImages. Amazing stuff.. ```python import ants img = ants.image_read(ants.get_ants_data('r16')) img = img.resample_image((64,64), 1, 0).get_mask().atropos(m = '[0.2,1x1]', c = '[2,0]', i = 'kmeans[3]', x = mask ) ```