Switch to side-by-side view

--- a
+++ b/ants/label/label_geometry_measures.py
@@ -0,0 +1,58 @@
+
+__all__ = ['label_geometry_measures']
+
+from tempfile import mktemp
+import pandas as pd
+import numpy as np
+
+from ants.internal import get_lib_fn, process_arguments
+from ants.decorators import image_method
+
+@image_method
+def label_geometry_measures(label_image, intensity_image=None):
+    """
+    Wrapper for the ANTs funtion LabelGeometryMeasures
+
+    ANTsR function: `labelGeometryMeasures`
+
+    Arguments
+    ---------
+    label_image : ANTsImage
+        image on which to compute geometry. Labels must be representable as uint32.
+    intensity_image : ANTsImage (optional)
+        image with intensity values
+
+    Returns
+    -------
+    pandas.DataFrame
+
+    Example
+    -------
+    >>> import ants
+    >>> fi = ants.image_read( ants.get_ants_data('r16') )
+    >>> seg = ants.kmeans_segmentation( fi, 3 )['segmentation']
+    >>> geom = ants.label_geometry_measures(seg,fi)
+    """
+    if intensity_image is None:
+        intensity_image = label_image.clone()
+
+    outcsv = mktemp(suffix='.csv')
+    # Library function requires unsigned int labels
+    if label_image.pixeltype != 'unsigned int':
+        label_image_int = label_image.clone('unsigned int')
+        if not np.all(label_image.numpy() == label_image_int.numpy()):
+            raise ValueError('Input label values must be representable as uint32.')
+        label_image = label_image.clone('unsigned int')
+    veccer = [label_image.dimension, label_image_int, intensity_image, outcsv]
+    veccer_processed = process_arguments(veccer)
+    libfn = get_lib_fn('LabelGeometryMeasures')
+    pp = libfn(veccer_processed)
+    pp = pd.read_csv(outcsv)
+    if 'VolumeInVoxels' in pp.columns and not 'VolumeInMillimeters' in pp.columns:
+        spc = np.prod(label_image.spacing)
+        pp['VolumeInMillimeters'] = pp['VolumeInVoxels'] * spc
+    # Ensure that the label column is of integer type - if there is any NaN, it will be float
+    # Something has gone seriously wrong if the labels are not interpreted as integers
+    if not np.issubdtype(pp['Label'].dtype, np.integer):
+        raise ValueError('Label column not integer type, label values may be invalid')
+    return pp