Source code for higra.image.hierarchy_mean_pb

############################################################################
# Copyright ESIEE Paris (2018)                                             #
#                                                                          #
# Contributor(s) : Benjamin Perret                                         #
#                                                                          #
# Distributed under the terms of the CECILL-B License.                     #
#                                                                          #
# The full license is in the file LICENSE, distributed with this software. #
############################################################################

import higra as hg
import numpy as np


[docs]@hg.argument_helper(hg.CptGridGraph) def oriented_watershed(graph, edge_weights, shape, edge_orientations=None): """ Creates a region adjacency graph (rag) with the oriented watershed transform. The method is described in: P. Arbelaez, M. Maire, C. Fowlkes and J. Malik, "Contour Detection and Hierarchical Image Segmentation," in IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 33, no. 5, pp. 898-916, May 2011. doi: 10.1109/TPAMI.2010.161 If no edge orientations are provided, then the weight of a rag edge between region i and j is the mean weight of the edges linking a vertex of i to a vertex of j. This does not include gradient estimation. :param graph: must be a 4 adjacency graph (Concept :class:`~higra.CptGridGraph`) :param edge_weights: gradient value on edges :param shape: shape of the graph, i.e. a pair (height, width) (deduced from :class:`~higra.CptGridGraph`) :param edge_orientations: estimated orientation of the gradient on edges (optional) :return: a pair (rag, rag_edge_weights): the region adjacency graph (Concept :class:`~higra.CptRegionAdjacencyGraph`) and its estimated edge_weights """ shape = hg.normalize_shape(shape) if edge_orientations is not None: edge_weights, edge_orientations = hg.cast_to_common_type(edge_weights, edge_orientations) rag, vertex_map, edge_map, rag_edge_weights = hg.cpp._oriented_watershed(graph, shape, edge_weights, edge_orientations) hg.CptRegionAdjacencyGraph.link(rag, graph, vertex_map, edge_map) return rag, rag_edge_weights
[docs]@hg.argument_helper(hg.CptGridGraph) def mean_pb_hierarchy(graph, edge_weights, shape, edge_orientations=None): """ Mean probability boundary hierarchy. The method is described in: P. Arbelaez, M. Maire, C. Fowlkes and J. Malik, "Contour Detection and Hierarchical Image Segmentation," in IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 33, no. 5, pp. 898-916, May 2011. doi: 10.1109/TPAMI.2010.161 This does not include gradient estimation. The returned hierarchy is defined on the gradient watershed super-pixels. The final sigmoid scaling of the hierarchy altitude is not performed. :param graph: must be a 4 adjacency graph (Concept :class:`~higra.CptGridGraph`) :param edge_weights: gradient value on edges :param shape: shape of the graph, i.e. a pair (height, width) (deduced from :class:`~higra.CptGridGraph`) :param edge_orientations: estimated orientation of the gradient on edges (optional) :return: a tree (Concept :class:`~higra.CptHierarchy`) and its node altitudes """ shape = hg.normalize_shape(shape) if edge_orientations is not None: edge_weights, edge_orientations = hg.cast_to_common_type(edge_weights, edge_orientations) rag, vertex_map, edge_map, tree, altitudes = hg.cpp._mean_pb_hierarchy(graph, shape, edge_weights, edge_orientations) hg.CptRegionAdjacencyGraph.link(rag, graph, vertex_map, edge_map) hg.CptHierarchy.link(tree, rag) return tree, altitudes
[docs]@hg.argument_helper(hg.CptGridGraph) def multiscale_mean_pb_hierarchy(graph, fine_edge_weights, others_edge_weights, shape, edge_orientations=None): """ Multiscale mean probability boundary hierarchy. The method is described in: J. Pont-Tuset, P. Arbeláez, J. Barron, F. Marques, and J. Malik Multiscale Combinatorial Grouping for Image Segmentation and Object Proposal Generation IEEE Transactions on Pattern Analysis and Machine Intelligence (TPAMI), vol. 39, no. 1, pp. 128 - 140, 2017. and in: K.K. Maninis, J. Pont-Tuset, P. Arbeláez and L. Van Gool Convolutional Oriented Boundaries: From Image Segmentation to High-Level Tasks IEEE Transactions on Pattern Analysis and Machine Intelligence (TPAMI), vol. 40, no. 4, pp. 819 - 833, 2018. This does not include gradient estimation. The returned hierarchy is defined on the gradient watershed super-pixels. The final sigmoid scaling of the hierarchy altitude is not performed. :param graph: must be a 4 adjacency graph (Concept :class:`~higra.CptGridGraph`) :param fine_edge_weights: edge weights of the finest gradient :param others_edge_weights: tuple of gradient value on edges :param shape: shape of the graph, i.e. a pair (height, width) (deduced from :class:`~higra.CptGridGraph`) :param edge_orientations: estimated orientation of the gradient on edges (optional) :return: a tree (Concept :class:`~higra.CptHierarchy`) and its node altitudes """ shape = hg.normalize_shape(shape) tree_fine, altitudes_fine = hg.mean_pb_hierarchy(graph, fine_edge_weights, shape=shape, edge_orientations=edge_orientations) saliency_fine = hg.saliency(tree_fine, altitudes_fine) super_vertex_fine = hg.labelisation_hierarchy_supervertices(tree_fine, altitudes_fine) other_hierarchies = [] for edge_weights in others_edge_weights: tree_coarse, altitudes_coarse = hg.mean_pb_hierarchy(graph, edge_weights, shape=shape, edge_orientations=edge_orientations) other_hierarchies.append((tree_coarse, altitudes_coarse)) aligned_saliencies = hg.align_hierarchies(graph, super_vertex_fine, other_hierarchies) for saliency in aligned_saliencies: saliency_fine += saliency saliency_fine *= (1.0 / (1 + len(others_edge_weights))) return hg.mean_pb_hierarchy(graph, saliency_fine, shape=shape)