예제 #1
0
    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))
예제 #2
0
    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))
예제 #3
0
파일: test_tree.py 프로젝트: higra/Higra
    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))
예제 #4
0
    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))
예제 #5
0
    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))
예제 #6
0
    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))
예제 #7
0
    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))
예제 #8
0
    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)))
예제 #9
0
    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))
예제 #10
0
    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]))
예제 #11
0
    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))
예제 #12
0
    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))
예제 #13
0
    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))
예제 #14
0
    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))
예제 #15
0
    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]))
예제 #16
0
    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))
예제 #17
0
    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))