Switch to side-by-side view

--- a
+++ b/ants/segmentation/kelly_kapowski.py
@@ -0,0 +1,91 @@
+"""
+Kelly Kapowski algorithm with computing cortical thickness
+"""
+
+__all__ = ['kelly_kapowski']
+
+import ants
+from ants.internal import get_lib_fn, get_pointer_string, process_arguments
+
+
+def kelly_kapowski(s, g, w, its=45, r=0.025, m=1.5, gm_label=2, wm_label=3, **kwargs):
+    """
+    Compute cortical thickness using the DiReCT algorithm.
+
+    Diffeomorphic registration-based cortical thickness based on probabilistic
+    segmentation of an image.  This is an optimization algorithm.
+
+
+    Arguments
+    ---------
+    s : ANTsimage
+        segmentation image
+
+    g : ANTsImage
+        gray matter probability image
+
+    w : ANTsImage
+        white matter probability image
+
+    its : integer
+        convergence params - controls iterations
+
+    r : scalar
+        gradient descent update parameter
+
+    m : scalar
+        gradient field smoothing parameter
+
+    gm_label : integer
+        label for gray matter in the segmentation image
+
+    wm_label : integer
+        label for white matter in the segmentation image
+
+    kwargs : keyword arguments
+        anything else, see KellyKapowski help in ANTs
+
+    Returns
+    -------
+    ANTsImage
+
+    Example
+    -------
+    >>> import ants
+    >>> 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)
+    """
+    if ants.is_image(s):
+        s = s.clone('unsigned int')
+
+    d = s.dimension
+    outimg = g.clone() * 0.0
+    kellargs = {'d': d,
+                's': "[{},{},{}]".format(get_pointer_string(s),gm_label,wm_label),
+                'g': g,
+                'w': w,
+                'c': "[{}]".format(its),
+                'r': r,
+                'm': m,
+                'o': outimg}
+    for k, v in kwargs.items():
+        kellargs[k] = v
+
+    processed_kellargs = process_arguments(kellargs)
+
+    libfn = get_lib_fn('KellyKapowski')
+    libfn(processed_kellargs)
+
+    # Check thickness is not still all zeros
+    if outimg.sum() == 0.0:
+        raise RuntimeError("KellyKapowski failed to compute thickness")
+
+    return outimg
+
+
+