lsrmGraphOperations.h 7.28 KiB
#ifndef __LSRM_GRAPH_OPERATIONS_H
#define __LSRM_GRAPH_OPERATIONS_H
#include "lsrmGraph.h"
#include "lsrmNeighborhood.h"
#include <iostream>
#include <cassert>
#include <limits>
#include <map>
#include <utility>
#include <set>
namespace lsrm
	template<class TSegmenter>
	class GraphOperations
	public:
		/* Some convenient typedefs */
		typedef TSegmenter SegmenterType;
		typedef typename SegmenterType::ImageType ImageType;
		typedef typename SegmenterType::GraphType GraphType;
		typedef typename GraphType::NodeType NodeType;
		typedef typename GraphType::EdgeType EdgeType;
		typedef typename GraphType::NodePointerType NodePointerType;
		typedef typename GraphType::NodeListType NodeList;
		typedef typename GraphType::NodeIteratorType NodeIterator;
		typedef typename GraphType::NodeConstIteratorType NodeConstIterator;
		typedef typename GraphType::EdgeListType EdgeList;
		typedef typename GraphType::EdgeIteratorType EdgeIterator;
		typedef typename GraphType::EdgeConstIteratorType EdgeConstIterator;
		using ContourOperator = lp::ContourOperations;
		 * Given the size of the input image and the mask of the
		 * neighborhood, we initialize a new graph of nodes
		 * @params:
		 * GraphType& graph: reference to a graph of nodes
		 * const unsigned int width: width of the input image
		 * const unsigned int height: height of the input image
		 * CONNECTIVITY mask : mask of the neighborhood (4X4 or 8X8)
		static void InitNodes(ImageType * inputImg,
							  SegmenterType& seg,
							  CONNECTIVITY mask);
		 * Given a graph of nodes, we explore all the nodes
		 * and for each node we compute his merging costs
		 * with all its neighboring nodes given a function
		 * to compute the merging cost between two nodes.
		 * @params:
		 * GraphType& graph: reference to the graph of nodes
		 * float(*fptr)(NodeType*, NodeType*): pointer to the function
		 * to compute the merging cost between two adjacent nodes.
		static void UpdateMergingCosts(SegmenterType& seg);
		 * Given a node A, we analyse its best node B.
		 * If the node A is also node B's best node
		 * then it returns a pointer to node B if node A 's id
		 * is smaller or a pointer to node A if node B's id is
		 * smaller
		 * else it returns a null pointer.
		 * (Local Mutual Best Fitting Heuristic)
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
* * @params: * NodeType * a : Pointer to the node A * float t : threshold of the criterion */ static NodePointerType CheckLMBF(NodePointerType, float t); /* * Given a node A, we analyse its best node B. * If the criterion is checked and the node B * is valid then it returns a pointer to the * node A if node's A id is smaller or a pointer * to node B if node B's id is smaller * else it returns a null pointer. * * @params: * NodeType * a : pointer to node A * float t : threshold of the criterion */ static NodePointerType CheckBF(NodePointerType a, float t); /* * Given the current node and the target node, it returns * the edge from the current node targeting to the target * node. * * @params * const NodeType * n : pointer to the current node. * const NodeType * target : pointer to the target node. * @return an iterator pointing to the candidate edge. */ static EdgeIterator FindEdge(NodePointerType n, NodePointerType target); /* * Given a node a and the node b to be merged into node a, * it updates the neighbors of node a with respect to the * neighbors of node b. * * @params * NodeType * a : pointer to node a. * NodeType * b : pointer to node b. */ static void UpdateNeighbors(NodePointerType a, NodePointerType b); /* * Given 2 nodes A and B (node B being merged into node A) * we update the internal attributes of node A with respect * to node B. * * @params: * NodeType * a: pointer to node A. * NodeType * b: pointer to node B. */ static void UpdateInternalAttributes(NodePointerType a, NodePointerType b, const unsigned int width, const unsigned int height); /* * Given a graph, it removes all the expired nodes. * * @params * GraphType& graph : reference to the graph. */ static void RemoveExpiredNodes(GraphType& graph); /* * Given a graph, a region merging algorithm, a threshold * and the dimension of the image, it performs one iteration
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
* of the merging process using the local mutual best fitting * heuristic. * * @params * GraphType& graph : reference to the graph * SegmenterType& seg : reference to the region merging algorithm. * const float threshold : threshold for this iteration. * const unsigned int width : width of the image. * const unsigned int height : height of the image. * * @return a boolean pointing out if there was at least a fusion * of nodes. */ static bool PerfomOneIterationWithLMBF(SegmenterType& seg); /* * Given a graph, a region merging algorithm, a threshold * and the dimension of the image, it performs one iteration * of the merging process using the best fitting * heuristic. * * @params * GraphType& graph : reference to the graph * SegmenterType& seg : reference to the region merging algorithm. * const float threshold : threshold for this iteration. * const unsigned int width : width of the image. * const unsigned int height : height of the image. * * @return a boolean pointing out if there was at least a fusion * of nodes. */ static bool PerfomOneIterationWithBF(SegmenterType& seg); /* * Given a graph, a region merging algorithm, a threshold, * the number of iterations to apply and the dimension of the image, * it performs all the iterations of the merging process using the * local mutual best fitting heuristic. * This method can be used when the threshold is constant during * the region merging process. * * @params * GraphType& graph : reference to the graph * SegmenterType& seg : reference to the region merging algorithm. * const float threshold : threshold for this iteration. * const unsigned int numberOfIterations: number of iteration to perform. * const unsigned int width : width of the image. * const unsigned int height : height of the image. * * @return a boolean pointing out if there was at least a fusion * of nodes. */ static bool PerfomAllIterationsWithLMBFAndConstThreshold(SegmenterType& seg); /* * Given a graph, a region merging algorithm, a threshold, * the number of iterations to apply and the dimension of the image, * it performs all the iterations of the merging process using the * best fitting heuristic. * This method can be used when the threshold is constant during * the region merging process. * * @params * GraphType& graph : reference to the graph * SegmenterType& seg : reference to the region merging algorithm. * const float threshold : threshold for this iteration. * const unsigned int numberOfIterations: number of iteration to perform. * const unsigned int width : width of the image. * const unsigned int height : height of the image. *
211212213214215216217218219220221222223224
* @return a boolean pointing out if there was at least a fusion * of nodes. */ static bool PerfomAllIterationsWithBFAndConstThreshold(SegmenterType& seg); }; } // end of namespace lsrm #include "lsrmGraphOperations.txx" #endif