def segment_morphsnakes(img, centers, init_center=True, smoothing=5, lambdas=(3, 3), bb_dist=INIT_MASK_BORDER): """ segmentation using morphological snakes with some parameters :param ndarray img: input image / segmentation :param [[int, int]] centers: position of centres / seeds :param bool init_center: :param int smoothing: :param [int, int] lambdas: :param float bb_dist: :return (ndarray, [[int, int]]): resulting segmentation, updated centres """ logging.debug('segment: morph-snakes...') if img.ndim == 3: img = img[:, :, 0] if init_center: _, mask, _ = create_circle_center(img.shape[:2], centers, radius=15) else: mask = np.zeros_like(img, dtype=int) mask[bb_dist:-bb_dist, bb_dist:-bb_dist] = 1 # Morphological ACWE. Initialization of the level-set. params = dict(smoothing=smoothing, lambda1=lambdas[0], lambda2=lambdas[1]) ms = multi_snakes.MultiMorphSnakes(img, mask, morphsnakes.MorphACWE, params) diag = np.sqrt(img.shape[0]**2 + img.shape[1]**2) ms.run(int(diag / 2.)) segm = ms.levelset return segm, centers, None
def test_multi_lakes(): logging.info('running: test_multi_lakes...') # Load the image. imgcolor = plt.imread(PATH_IMG_LAKES) / 255. img = rgb2gray(imgcolor) # MorphACWE does not need g(I) # Morphological ACWE. Initialization of the level-set. mask = np.zeros(img.shape, dtype=int) mask[circle_levelset(img.shape, (50, 100), 25) == 1] = 1 mask[circle_levelset(img.shape, (150, 150), 25) == 1] = 2 mask[circle_levelset(img.shape, (120, 220), 15) == 1] = 3 mask[circle_levelset(img.shape, (80, 250), 15) == 1] = 4 ms = multi_ms.MultiMorphSnakes(img, mask, MorphACWE, dict(smoothing=3, lambda1=1, lambda2=1)) # Visual evolution. fig = plt.figure() evolve_visual(ms, fig, num_iters=200, background=imgcolor) assert os.path.exists(PATH_OUTPUT) fig.savefig(os.path.join(PATH_OUTPUT, 'cmorphsnakes_multi_lakes.png')) plt.close(fig)