--- a
+++ b/tests/test_segmentation.py
@@ -0,0 +1,244 @@
+"""
+Test ants.registration module
+
+nptest.assert_allclose
+self.assertEqual
+self.assertTrue
+
+
+class TestModule_geo_seg(unittest.TestCase):
+
+    def setUp(self):
+        pass
+
+    def tearDown(self):
+        pass
+
+    def test_example(self):
+        image = ants.image_read(ants.get_ants_data('simple'))
+        image = ants.n3_bias_field_correction(image, 4)
+        image = ants.n3_bias_field_correction(image, 2)
+        bmk = ants.get_mask(image)
+        segs = ants.kmeans_segmentation(image, 3, bmk)
+        priors = segs['probabilityimages']
+        seg = ants.geo_seg(image, bmk, priors)
+
+
+"""
+
+
+import os
+import unittest
+from common import run_tests
+from tempfile import mktemp
+
+import numpy as np
+import numpy.testing as nptest
+
+import ants
+
+class TestModule_atropos(unittest.TestCase):
+
+    def setUp(self):
+        pass
+
+    def tearDown(self):
+        pass
+
+    def test_example(self):
+        # test ANTsPy/ANTsR example
+        img = ants.image_read(ants.get_ants_data('r16'))
+        img = ants.resample_image(img, (64,64), 1, 0)
+        mask = ants.get_mask(img)
+        ants.atropos( a = img, m = '[0.2,1x1]', c = '[2,0]',  i = 'kmeans[3]', x = mask )
+
+    def test_multiple_inputs(self):
+        img = ants.image_read( ants.get_ants_data("r16"))
+        img =  ants.resample_image( img, (64,64), 1, 0 )
+        mask = ants.get_mask(img)
+        segs1 = ants.atropos( a = img, m = '[0.2,1x1]',
+           c = '[2,0]',  i = 'kmeans[3]', x = mask )
+
+        # Use probabilities from k-means seg as priors
+        segs2 = ants.atropos( a = img, m = '[0.2,1x1]',
+           c = '[2,0]',  i = segs1['probabilityimages'], x = mask )
+
+        # multiple inputs
+        feats = [img, ants.iMath(img,"Laplacian"), ants.iMath(img,"Grad") ]
+        segs3 = ants.atropos( a = feats, m = '[0.2,1x1]',
+           c = '[2,0]',  i = segs1['probabilityimages'], x = mask )
+
+
+class TestModule_joint_label_fusion(unittest.TestCase):
+
+    def setUp(self):
+        pass
+
+    def tearDown(self):
+        pass
+
+    def test_example(self):
+        ref = ants.image_read( ants.get_ants_data('r16'))
+        ref = ants.resample_image(ref, (50,50),1,0)
+        ref = ants.iMath(ref,'Normalize')
+        mi = ants.image_read( ants.get_ants_data('r27'))
+        mi2 = ants.image_read( ants.get_ants_data('r30'))
+        mi3 = ants.image_read( ants.get_ants_data('r62'))
+        mi4 = ants.image_read( ants.get_ants_data('r64'))
+        mi5 = ants.image_read( ants.get_ants_data('r85'))
+        refmask = ants.get_mask(ref)
+        refmask = ants.iMath(refmask,'ME',2) # just to speed things up
+        ilist = [mi,mi2,mi3,mi4,mi5]
+        seglist = [None]*len(ilist)
+        for i in range(len(ilist)):
+            ilist[i] = ants.iMath(ilist[i],'Normalize')
+            mytx = ants.registration(fixed=ref , moving=ilist[i] ,
+                type_of_transform = ('Affine') )
+            mywarpedimage = ants.apply_transforms(fixed=ref,moving=ilist[i],
+                    transformlist=mytx['fwdtransforms'])
+            ilist[i] = mywarpedimage
+            seg = ants.threshold_image(ilist[i],'Otsu', 3)
+            seglist[i] = ( seg ) + ants.threshold_image( seg, 1, 3 ).morphology( operation='dilate', radius=3 )
+
+        r = 2
+        pp = ants.joint_label_fusion(ref, refmask, ilist, r_search=2,
+                    label_list=seglist, rad=[r]*ref.dimension )
+        pp = ants.joint_label_fusion(ref,refmask,ilist, r_search=2, rad=2 )
+
+    def test_max_lab_plus_one(self):
+        ref = ants.image_read( ants.get_ants_data('r16'))
+        ref = ants.resample_image(ref, (50,50),1,0)
+        ref = ants.iMath(ref,'Normalize')
+        mi = ants.image_read( ants.get_ants_data('r27'))
+        mi2 = ants.image_read( ants.get_ants_data('r30'))
+        mi3 = ants.image_read( ants.get_ants_data('r62'))
+        mi4 = ants.image_read( ants.get_ants_data('r64'))
+        mi5 = ants.image_read( ants.get_ants_data('r85'))
+        refmask = ants.get_mask(ref)
+        refmask = ants.iMath(refmask,'ME',2) # just to speed things up
+        ilist = [mi,mi2,mi3,mi4,mi5]
+        seglist = [None]*len(ilist)
+        for i in range(len(ilist)):
+            ilist[i] = ants.iMath(ilist[i],'Normalize')
+            mytx = ants.registration(fixed=ref , moving=ilist[i] ,
+                type_of_transform = ('Affine') )
+            mywarpedimage = ants.apply_transforms(fixed=ref,moving=ilist[i],
+                    transformlist=mytx['fwdtransforms'])
+            ilist[i] = mywarpedimage
+            seg = ants.threshold_image(ilist[i],'Otsu', 3)
+            seglist[i] = ( seg ) + ants.threshold_image( seg, 1, 3 ).morphology( operation='dilate', radius=3 )
+
+        r = 2
+        pp = ants.joint_label_fusion(ref, refmask, ilist, r_search=2,
+                    label_list=seglist, rad=[r]*ref.dimension, max_lab_plus_one=True )
+        pp = ants.joint_label_fusion(ref,refmask,ilist, r_search=2, rad=2,
+                                     max_lab_plus_one=True)
+
+
+
+class TestModule_kelly_kapowski(unittest.TestCase):
+
+    def setUp(self):
+        pass
+
+    def tearDown(self):
+        pass
+
+    def test_example(self):
+        img = ants.image_read( ants.get_ants_data('r16') ,2)
+        img = ants.resample_image(img, (64,64),1,0)
+        mask = ants.get_mask( img )
+        segs = ants.kmeans_segmentation( img, k=3, kmask = mask)
+        thick = ants.kelly_kapowski(s=segs['segmentation'], g=segs['probabilityimages'][1],
+                                    w=segs['probabilityimages'][2], its=45,
+                                    r=0.5, m=1)
+
+
+class TestModule_kmeans(unittest.TestCase):
+
+    def setUp(self):
+        pass
+
+    def tearDown(self):
+        pass
+
+    def test_example(self):
+        fi = ants.image_read(ants.get_ants_data('r16'))
+        fi = ants.n3_bias_field_correction(fi, 2)
+        seg = ants.kmeans_segmentation(fi, 3)
+
+
+class TestModule_label_geometry_measures(unittest.TestCase):
+
+    def setUp(self):
+        pass
+
+    def tearDown(self):
+        pass
+
+    def test_example(self):
+        fi = ants.resample_image(ants.image_read( ants.get_ants_data('r16') ), (140,140),1,0)
+        seg = ants.kmeans_segmentation( fi, 3 )['segmentation']
+        geom = ants.label_geometry_measures(seg,fi)
+        expected_cols = ['Label', 'VolumeInVoxels', 'VolumeInMillimeters',
+       'SurfaceAreaInMillimetersSquared', 'Eccentricity', 'Elongation',
+       'Roundness', 'Flatness', 'Centroid_x', 'Centroid_y', 'AxesLength_x',
+       'AxesLength_y', 'BoundingBoxLower_x', 'BoundingBoxLower_y',
+       'BoundingBoxUpper_x', 'BoundingBoxUpper_y', 'MeanIntensity',
+       'SigmaIntensity', 'MinIntensity', 'MaxIntensity',
+       'IntegratedIntensity']
+        for col in expected_cols:
+            self.assertTrue(col in geom.columns)
+        # Label column should have int type
+        self.assertTrue(np.issubdtype(geom['Label'].dtype, np.integer))
+        # So should VolumeInVoxels
+        self.assertTrue(np.issubdtype(geom['VolumeInVoxels'].dtype, np.integer))
+        # Check math of VolumeInMillimeters
+        self.assertTrue(np.allclose(geom['VolumeInMillimeters'], geom['VolumeInVoxels'] * np.prod(fi.spacing), atol=1e-6))
+        # should be three rows
+        self.assertEqual(geom.shape[0], 3)
+
+
+
+class TestModule_prior_based_segmentation(unittest.TestCase):
+
+    def setUp(self):
+        pass
+
+    def tearDown(self):
+        pass
+
+    def test_example(self):
+        fi = ants.image_read(ants.get_ants_data('r16'))
+        seg = ants.kmeans_segmentation(fi,3)
+        mask = ants.threshold_image(seg['segmentation'], 1, 1e15)
+        priorseg = ants.prior_based_segmentation(fi, seg['probabilityimages'], mask, 0.25, 0.1, 3)
+
+
+class TestModule_random(unittest.TestCase):
+
+    def setUp(self):
+        pass
+    def tearDown(self):
+        pass
+
+    def test_fuzzy_cmeans(self):
+        image = ants.image_read(ants.get_ants_data('r16'))
+        mask = ants.get_mask(image)
+        fuzzy = ants.fuzzy_spatial_cmeans_segmentation(image, mask, number_of_clusters=3)
+
+    def test_functional_lung(self):
+        image = ants.image_read(ants.get_data("mni")).resample_image((4,4,4))
+        mask = image.get_mask()
+        seg = ants.functional_lung_segmentation(image, mask, verbose=True,
+                                                number_of_iterations=1,
+                                                number_of_clusters=2,
+                                                number_of_atropos_iterations=1)
+
+    def test_anti_alias(self):
+        img = ants.image_read(ants.get_data('r16'))
+        mask = ants.get_mask(img)
+        mask_aa = ants.anti_alias(mask)
+
+if __name__ == '__main__':
+    run_tests()