def watershed_hierarchy_by_dynamics(graph, edge_weights, canonize_tree=True): """ Watershed hierarchy by dynamics. The definition of hierarchical watershed follows the one given in: J. Cousty, L. Najman. `Incremental algorithm for hierarchical minimum spanning forests and saliency of watershed cuts <https://hal-upec-upem.archives-ouvertes.fr/hal-00622505/document>`_. ISMM 2011: 272-283. The algorithm used is described in: Laurent Najman, Jean Cousty, Benjamin Perret. `Playing with Kruskal: Algorithms for Morphological Trees in Edge-Weighted Graphs <https://hal.archives-ouvertes.fr/file/index/docid/798621/filename/ismm2013-algo.pdf>`_. ISMM 2013: 135-146. :param graph: input graph :param edge_weights: input graph edge weights :param canonize_tree: if ``True`` (default), the resulting hierarchy is canonized (see function :func:`~higra.canonize_hierarchy`), otherwise the returned hierarchy is a binary tree :return: a tree (Concept :class:`~higra.CptHierarchy` is ``True`` and :class:`~higra.CptBinaryHierarchy` otherwise) and its node altitudes """ return watershed_hierarchy_by_attribute( graph, edge_weights, lambda tree, altitudes: hg.attribute_dynamics( tree, altitudes, "increasing"), canonize_tree)
def test_attribute_dynamics2(self): t = hg.Tree((11, 11, 9, 9, 8, 8, 13, 13, 10, 10, 12, 12, 14, 14, 14)) altitudes = np.asarray((0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 1, 4, 8, 10.)) ref = np.asarray((3, 3, 0, 0, 10, 10, 2, 2, 10, 0, 10, 3, 10, 2, 10)) res = hg.attribute_dynamics(t, altitudes) self.assertTrue(np.all(res == ref))