Source code for skgtimage.utils.meanshift

import numpy as np
import sklearn
import skimage
from skgtimage.utils.color import rgb2chsv
from sklearn.cluster import MeanShift
import time

[docs]def meanshift(image, bandwidth, roi=None, mc=False, sigma=None, rgb_convert=False,verbose=False): """ Apply meanshif to input image (within region of interest) :param image: input image :param bandwidth: bandwidth parameter considered in scikit-learn MeanShift :param roi: region of interest :param mc: whether image is multi-component or not (color in our case) :param verbose: :param sigma: preliminary gaussian filtering (parameter of scikit-image filters.gaussian) :param rgb_convert: if True and mc True, RGB image is converted HSV space :return: labelled image (numpy array), where each label corresponds to a specific value """ #Image preparation if mc: #color if sigma is not None: tmp=skimage.filters.gaussian(image, sigma=sigma, multichannel=True) return meanshift(tmp, bandwidth=bandwidth, roi=roi, mc=mc, sigma=None, rgb_convert=rgb_convert,verbose=verbose) #Conversion if rgb_convert: tmp=rgb2chsv(image) return meanshift(tmp, bandwidth=bandwidth, roi=roi, mc=mc, sigma=sigma, rgb_convert=False, verbose=verbose) nb_components,spatial_dim=1,len(image.shape) if mc: nb_components=image.shape[-1] spatial_dim-=1 if roi is not None: roi_mask=np.dstack(tuple([roi for i in range(0,nb_components)])) roied_image=np.ma.masked_array(image,mask=np.logical_not(roi_mask)) return meanshift(roied_image, bandwidth, None, mc, verbose=verbose) else: if type(image) != np.ma.masked_array : roi=np.ones(image.shape[0:spatial_dim]) roi_mask=np.dstack(tuple([roi for i in range(0,nb_components)])) roied_image=np.ma.masked_array(image,mask=np.logical_not(roi_mask)) return meanshift(roied_image, bandwidth, None, mc, verbose=verbose) if type(image) == np.ma.masked_array : reshaped_data=image.compressed().reshape(-1,nb_components) else: reshaped_data=image.reshape(-1,nb_components) t0=time.clock() ms = MeanShift(bandwidth=bandwidth, bin_seeding=True) ms.fit(reshaped_data) t1=time.clock() if verbose==True: print("Cpu time (sec): " , t1-t0) print("nb clusters : " , len(np.unique(ms.labels_))) labels = ms.labels_ result = np.zeros(image.shape[0:spatial_dim],dtype=np.uint8) #ne marche pas avec color -> vu comme 3D roi=np.logical_not(image.mask) if nb_components > 1: roi=roi[:,:,0] else: roi=roi result[roi] = labels result=np.ma.masked_array(result, mask=np.logical_not(roi)) return result