__all__ = ['kmeans_segmentation']
import ants
def kmeans_segmentation(image, k, kmask=None, mrf=0.1):
"""
K-means image segmentation that is a wrapper around `ants.atropos`
ANTsR function: `kmeansSegmentation`
Arguments
---------
image : ANTsImage
input image
k : integer
integer number of classes
kmask : ANTsImage (optional)
segment inside this mask
mrf : scalar
smoothness, higher is smoother
Returns
-------
ANTsImage
Example
-------
>>> import ants
>>> fi = ants.image_read(ants.get_ants_data('r16'), 'float')
>>> fi = ants.n3_bias_field_correction(fi, 2)
>>> seg = ants.kmeans_segmentation(fi, 3)
"""
dim = image.dimension
kmimage = ants.iMath(image, 'Normalize')
if kmask is None:
kmask = ants.get_mask(kmimage, 0.01, 1, cleanup=2)
kmask = ants.iMath(kmask, 'FillHoles').threshold_image(1,2)
nhood = 'x'.join(['1']*dim)
mrf = '[%s,%s]' % (str(mrf), nhood)
kmimage = ants.atropos(a = kmimage, m = mrf, c = '[5,0]', i = 'kmeans[%s]'%(str(k)), x = kmask)
kmimage['segmentation'] = kmimage['segmentation'].clone(image.pixeltype)
return kmimage