37 #ifndef VIGRA_REGION_SHRINK_HXX
38 #define VIGRA_REGION_SHRINK_HXX
40 #include "multi_array.hxx"
41 #include "multi_gridgraph.hxx"
45 template<
unsigned int DIM,
class LABEL_TYPE,
class LABEL_TYPE_OUT>
47 MultiArrayView<DIM,LABEL_TYPE> labels,
48 const size_t shrinkNpixels,
49 MultiArrayView<DIM,LABEL_TYPE_OUT> shrinkedLabels
51 shrinkedLabels = labels;
53 typedef GridGraph<DIM, undirected_tag> Graph;
54 typedef typename Graph::Node Node;
56 typedef typename Graph::NodeIt graph_scanner;
57 typedef typename Graph::OutArcIt neighbor_iterator;
59 const Graph g(labels.shape());
62 for (graph_scanner n(g); n != lemon::INVALID; ++n){
64 for (neighbor_iterator arc(g, node); arc != lemon::INVALID; ++arc){
65 const Node otherNode = g.target(arc);
67 if(labels[node]!=labels[otherNode]){
68 shrinkedLabels[node]=0;
69 shrinkedLabels[otherNode]=0;
74 MultiArray<DIM,bool> visited(labels.shape());
75 for(
size_t r=0;r<shrinkNpixels-1;++r){
76 std::fill(visited.begin(),visited.end(),
false);
77 for (graph_scanner n(g); n != lemon::INVALID; ++n){
79 if(!visited[n] && shrinkedLabels[node]==0){
80 for (neighbor_iterator arc(g, node); arc != lemon::INVALID; ++arc){
81 const Node otherNode = g.target(arc);
82 shrinkedLabels[otherNode]=0;
83 visited[otherNode]=
true;
93 #endif // VIGRA_REGION_SHRINK_HXX