def test_watershed_hierarchy_by_minima_ordering(self): g = hg.get_4_adjacency_graph((1, 7)) edge_weights = np.asarray((1, 4, 1, 0, 10, 8)) # same as dynamics minima_ranking = np.asarray((2, 2, 0, 3, 3, 1, 1), dtype=np.uint64) minima_altitudes = np.asarray((0, 2, 3, 10), dtype=np.float64) t, altitudes = hg.watershed_hierarchy_by_minima_ordering( g, edge_weights, minima_ranking, minima_altitudes) ref_parents = np.asarray((7, 7, 8, 8, 8, 9, 9, 11, 10, 10, 11, 11)) ref_tree = hg.Tree(ref_parents) ref_altitudes = np.asarray((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3)) self.assertTrue(hg.CptHierarchy.validate(t)) self.assertTrue(hg.test_tree_isomorphism(t, ref_tree)) self.assertTrue(np.allclose(altitudes, ref_altitudes)) # binary watershed hierarchy t, altitudes = hg.watershed_hierarchy_by_minima_ordering( g, edge_weights, minima_ranking, minima_altitudes=None, canonize_tree=False) ref_parents = np.asarray( (8, 8, 9, 7, 7, 10, 10, 9, 12, 11, 11, 12, 12)) ref_tree = hg.Tree(ref_parents) ref_altitudes = np.asarray((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2)) self.assertTrue(hg.CptBinaryHierarchy.validate(t)) self.assertTrue(hg.test_tree_isomorphism(t, ref_tree)) self.assertTrue(np.allclose(altitudes, ref_altitudes))
def test_component_tree_multivariate_tree_of_shapes_image2d_fill_hole(self): im1 = np.asarray((0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0), dtype=np.float32).reshape((6, 7)) im2 = np.asarray((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0), dtype=np.float32).reshape((6, 7)) image = np.dstack((im1, im2)) tree = hg.component_tree_multivariate_tree_of_shapes_image2d(image, padding='none', immersion=False) ref_tree = hg.Tree((44, 44, 44, 44, 44, 44, 44, 44, 43, 43, 43, 43, 43, 44, 44, 43, 43, 43, 43, 43, 44, 44, 43, 43, 42, 43, 43, 44, 44, 43, 43, 43, 43, 43, 44, 44, 43, 43, 43, 43, 43, 44, 43, 44, 44)) self.assertTrue(hg.test_tree_isomorphism(tree, ref_tree))
def test_filter_non_relevant_node_from_tree(self): g = hg.get_4_adjacency_graph((1, 8)) edge_weights = np.asarray((0, 2, 0, 0, 1, 0, 0)) tree, altitudes = hg.bpt_canonical(g, edge_weights) def functor(tree, altitudes): area = hg.attribute_area(tree) area_min_children = hg.accumulate_parallel(tree, area, hg.Accumulators.min) return area_min_children < 3 res_tree, res_altitudes = hg.filter_non_relevant_node_from_tree(tree, altitudes, functor, canonize_tree=False) sm = hg.saliency(res_tree, res_altitudes) sm_ref = np.asarray((0, 0, 0, 0, 1, 0, 0)) self.assertTrue(np.all(sm == sm_ref)) ref_parents = (8, 8, 9, 9, 10, 11, 11, 12, 13, 10, 13, 12, 14, 14, 14) ref_altitudes = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1) self.assertTrue(hg.CptBinaryHierarchy.validate(res_tree)) self.assertTrue(np.all(ref_parents == res_tree.parents())) self.assertTrue(np.all(res_altitudes == ref_altitudes)) res_tree, res_altitudes = hg.filter_non_relevant_node_from_tree(tree, altitudes, functor, canonize_tree=True) sm = hg.saliency(res_tree, res_altitudes) sm_ref = np.asarray((0, 0, 0, 0, 1, 0, 0)) self.assertTrue(np.all(sm == sm_ref)) ref_parents = (8, 8, 8, 8, 8, 9, 9, 9, 10, 10, 10) ref_tree = hg.Tree(ref_parents) ref_altitudes = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1) self.assertFalse(hg.CptBinaryHierarchy.validate(res_tree)) self.assertTrue(hg.test_tree_isomorphism(res_tree, ref_tree)) self.assertTrue(np.all(res_altitudes == ref_altitudes))
def test_component_tree_multivariate_tree_of_shapes_image2d_2(self): im1 = np.asarray((0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 2, 1, 1, 1, 3, 3, 3, 2, 1, 1, 1, 3, 3, 3, 2, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0), dtype=np.float32).reshape((6, 7)) im2 = np.asarray((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 2, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), dtype=np.float32).reshape((6, 7)) image = np.dstack((im1, im2)) tree = hg.component_tree_multivariate_tree_of_shapes_image2d(image, 'zero') ref_tree = hg.Tree((47, 47, 47, 47, 47, 47, 47, 43, 43, 43, 45, 46, 46, 46, 43, 42, 43, 45, 45, 44, 46, 43, 43, 43, 45, 45, 44, 46, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 46, 47, 47, 43, 45, 45, 46, 47, 47)) self.assertTrue(hg.test_tree_isomorphism(tree, ref_tree))
def test_component_tree_multivariate_tree_of_shapes_image2d_1(self): im1 = np.asarray((2, 1, 0, 0, -1, -2), dtype=np.float32).reshape((1, 6)) im2 = np.asarray((1, 2, 0, -2, -1, 0), dtype=np.float32).reshape((1, 6)) image = np.dstack((im1, im2)) tree = hg.component_tree_multivariate_tree_of_shapes_image2d(image, 'zero') ref_tree = hg.Tree((6, 7, 12, 8, 11, 9, 10, 10, 11, 11, 12, 12, 12)) self.assertTrue(hg.test_tree_isomorphism(tree, ref_tree))
def test_tree_of_shapes_self_dual(self): np.random.seed(42) image = np.random.rand(25, 38) neg_image = -1 * image tree1, altitudes1 = hg.component_tree_tree_of_shapes_image2d(image) tree2, altitudes2 = hg.component_tree_tree_of_shapes_image2d(neg_image) self.assertTrue(hg.test_tree_isomorphism(tree1, tree2))
def test_component_tree_multivariate_tree_of_shapes_image2d_sanity(self): image = np.asarray(((1, 1), (1, -2), (1, 7)), dtype=np.float64) tree, _ = hg.component_tree_tree_of_shapes_image2d(image, 'mean') image3d = np.dstack((image, image, image)) tree2 = hg.component_tree_multivariate_tree_of_shapes_image2d(image3d, 'mean') self.assertTrue(hg.test_tree_isomorphism(tree, tree2))
def test_QFZ(self): graph = hg.get_4_adjacency_graph((2, 3)) edge_weights = np.asarray((1, 0, 2, 1, 1, 1, 2)) tree, altitudes = hg.quasi_flat_zone_hierarchy(graph, edge_weights) tref = hg.Tree( np.asarray((6, 7, 8, 6, 7, 8, 7, 9, 9, 9), dtype=np.int64)) self.assertTrue(hg.test_tree_isomorphism(tree, tref)) self.assertTrue(np.allclose(altitudes, (0, 0, 0, 0, 0, 0, 0, 1, 1, 2)))
def test_watershed_hierarchy_by_volume(self): g = hg.get_4_adjacency_graph((1, 7)) edge_weights = np.asarray((1, 4, 1, 0, 10, 8)) tree, altitudes = hg.watershed_hierarchy_by_volume(g, edge_weights) ref_parents = np.asarray((7, 7, 8, 8, 8, 9, 9, 11, 10, 10, 11, 11)) ref_tree = hg.Tree(ref_parents) ref_altitudes = np.asarray((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6)) self.assertTrue(hg.test_tree_isomorphism(tree, ref_tree)) self.assertTrue(np.allclose(altitudes, ref_altitudes))
def test_simplify_tree_with_leaves3(self): t = hg.Tree((7, 7, 8, 8, 8, 9, 9, 11, 10, 10, 11, 11)) criterion = np.zeros(t.num_vertices(), dtype=np.bool) criterion[:9] = True new_tree, node_map = hg.simplify_tree(t, criterion, process_leaves=True) ref_tree = hg.Tree((1, 2, 2)) self.assertTrue(hg.test_tree_isomorphism(new_tree, ref_tree)) self.assertFalse(np.max(criterion[node_map]))
def test_component_tree_multivariate_tree_of_shapes_image2d_no_original_size(self): im1 = np.asarray((2, 1, 2), dtype=np.float32).reshape((1, 3)) im2 = np.asarray((2, 2, 1), dtype=np.float32).reshape((1, 3)) image = np.dstack((im1, im2)) tree = hg.component_tree_multivariate_tree_of_shapes_image2d(image, 'zero', original_size=False) ref_tree = hg.Tree((48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 45, 45, 45, 47, 46, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 47, 47, 48, 48)) self.assertTrue(hg.test_tree_isomorphism(tree, ref_tree))
def test_component_tree_multivariate_tree_of_shapes_image2d_no_padding_no_immersion_original_size(self): im1 = np.asarray((0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0), dtype=np.float32).reshape((3, 5)) im2 = np.asarray((0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0), dtype=np.float32).reshape((3, 5)) image = np.dstack((im1, im2)) tree = hg.component_tree_multivariate_tree_of_shapes_image2d(image, 'none', original_size=True, immersion=False) ref_tree = hg.Tree((18, 18, 18, 18, 18, 18, 15, 17, 16, 18, 18, 18, 18, 18, 18, 17, 17, 18, 18)) self.assertTrue(hg.test_tree_isomorphism(tree, ref_tree))
def test_watershed_hierarchy_by_area(self): g = hg.get_4_adjacency_graph((1, 19)) edge_weights = np.asarray( (0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0)) tree, altitudes = hg.watershed_hierarchy_by_area(g, edge_weights) ref_parents = np.asarray( (19, 19, 20, 20, 20, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 23, 23, 23, 24, 24, 25, 26, 26, 25, 27, 27, 27), dtype=np.int64) ref_tree = hg.Tree(ref_parents) ref_altitudes = np.asarray((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 5)) self.assertTrue(hg.CptHierarchy.validate(tree)) self.assertTrue(hg.test_tree_isomorphism(tree, ref_tree)) self.assertTrue(np.allclose(altitudes, ref_altitudes)) # binary watershed hierarchy tree, altitudes = hg.watershed_hierarchy_by_area(g, edge_weights, canonize_tree=False) ref_parents = np.asarray( (19, 19, 20, 20, 21, 22, 22, 23, 24, 25, 26, 27, 27, 28, 29, 30, 31, 31, 32, 33, 21, 33, 23, 24, 25, 26, 34, 28, 29, 30, 35, 32, 35, 34, 36, 36, 36), dtype=np.int64) ref_tree = hg.Tree(ref_parents) ref_altitudes = np.asarray( (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 5)) self.assertTrue(hg.CptBinaryHierarchy.validate(tree)) self.assertTrue(hg.test_tree_isomorphism(tree, ref_tree)) self.assertTrue(np.allclose(altitudes, ref_altitudes))
def test_watershed_hierarchy_by_number_of_parents(self): graph = hg.get_4_adjacency_graph((3, 3)) edge_weights = np.asarray((0, 0, 1, 3, 0, 4, 2, 4, 1, 3, 4, 0)) tree, altitudes = hg.watershed_hierarchy_by_number_of_parents( graph, edge_weights) ref_parents = np.asarray( (11, 11, 9, 11, 10, 9, 11, 10, 10, 12, 13, 12, 13, 13)) ref_tree = hg.Tree(ref_parents) ref_altitudes = np.asarray( (0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 2.)) self.assertTrue(hg.test_tree_isomorphism(tree, ref_tree)) self.assertTrue(np.allclose(altitudes, ref_altitudes))
def test_simplify_tree_with_leaves(self): t = hg.Tree((7, 7, 8, 8, 8, 9, 9, 11, 10, 10, 11, 11)) criterion = np.asarray((False, False, False, True, True, True, True, False, True, False, True, False), dtype=np.bool) new_tree, node_map = hg.simplify_tree(t, criterion, process_leaves=True) ref_tree = hg.Tree((4, 4, 5, 5, 5, 5)) self.assertTrue(hg.test_tree_isomorphism(new_tree, ref_tree)) self.assertFalse(np.max(criterion[node_map]))
def test_watershed_hierarchy_by_area(self): g = hg.get_4_adjacency_graph((1, 19)) edge_weights = np.asarray( (0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0)) tree, altitudes = hg.watershed_hierarchy_by_area(g, edge_weights) ref_parents = np.asarray( (19, 19, 20, 20, 20, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 23, 23, 23, 24, 24, 25, 26, 26, 25, 27, 27, 27), dtype=np.int64) ref_tree = hg.Tree(ref_parents) ref_altitudes = np.asarray((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 5)) self.assertTrue(hg.test_tree_isomorphism(tree, ref_tree)) self.assertTrue(np.allclose(altitudes, ref_altitudes))
def test_tree_isomorphism(self): t1 = hg.Tree(np.asarray((5, 5, 6, 6, 7, 8, 7, 8, 8))) t2 = hg.Tree(np.asarray((6, 6, 5, 5, 7, 7, 8, 8, 8))) t3 = hg.Tree(np.asarray((7, 7, 5, 5, 6, 6, 8, 8, 8))) self.assertTrue(hg.test_tree_isomorphism(t1, t2)) self.assertTrue(hg.test_tree_isomorphism(t2, t1)) self.assertTrue(hg.test_tree_isomorphism(t1, t3)) self.assertTrue(hg.test_tree_isomorphism(t3, t1)) self.assertTrue(hg.test_tree_isomorphism(t2, t3)) self.assertTrue(hg.test_tree_isomorphism(t3, t2)) t4 = hg.Tree(np.asarray((5, 5, 7, 6, 6, 8, 7, 8, 8))) self.assertTrue(not hg.test_tree_isomorphism(t1, t4)) self.assertTrue(not hg.test_tree_isomorphism(t2, t4)) self.assertTrue(not hg.test_tree_isomorphism(t3, t4)) self.assertTrue(not hg.test_tree_isomorphism(t4, t1)) self.assertTrue(not hg.test_tree_isomorphism(t4, t2)) self.assertTrue(not hg.test_tree_isomorphism(t4, t3))