32#include "DGtal/base/Common.h"
33#include "DGtal/io/readers/VolReader.h"
34#include "DGtal/io/Color.h"
35#include "DGtal/images/ImageSelector.h"
36#include "DGtal/helpers/StdDefs.h"
38#include <boost/pending/disjoint_sets.hpp>
92template <
typename Rank,
typename Parent,
typename Image>
93void CCCounter(Rank& r, Parent& p,
const Image& elements,
const unsigned int connectivity)
96 boost::disjoint_sets<Rank,Parent> dsets(r, p);
97 trace.beginBlock(
"Initial disjoint sets construction");
98 for(
typename Image::Domain::ConstIterator e = elements.domain().begin();
99 e != elements.domain().end(); ++e)
103 trace.beginBlock(
"Merging neighboring sets");
104 typename Image::Point decx(1,0,0);
105 typename Image::Point decy(0,1,0);
106 typename Image::Point decz(0,0,1);
109 for (
typename Image::Domain::ConstIterator e = elements.domain().begin();
110 e != elements.domain().end(); ++e )
112 if ( elements.domain().isInside( *e + decx ) &&
113 ( elements( *e ) == elements( *e + decx ) ) )
114 dsets.union_set( *e, *e + decx );
116 if ( elements.domain().isInside( *e + decy ) &&
117 ( elements( *e ) == elements( *e + decy ) ) )
118 dsets.union_set( *e, *e + decy );
120 if ( elements.domain().isInside( *e + decz ) &&
121 ( elements( *e ) == elements( *e + decz ) ) )
122 dsets.union_set( *e, *e + decz );
124 if ( connectivity > 6 )
126 if ( elements.domain().isInside( *e + decx + decy ) &&
127 ( elements( *e ) == elements( *e + decx + decy ) ) )
128 dsets.union_set( *e, *e + decx + decy );
130 if ( elements.domain().isInside( *e + decx + decz ) &&
131 ( elements( *e ) == elements( *e + decx + decz ) ) )
132 dsets.union_set( *e, *e + decx + decz );
134 if ( elements.domain().isInside( *e + decy + decz ) &&
135 ( elements( *e ) == elements( *e + decy + decz ) ) )
136 dsets.union_set( *e, *e + decy + decz );
138 if ( connectivity == 26 )
139 if ( elements.domain().isInside( *e + decy + decz + decx ) &&
140 ( elements( *e ) == elements( *e + decy + decz + decx ) ) )
141 dsets.union_set( *e, *e + decy + decz + decx );
145 std::cout <<
"Number of disjoint "<<connectivity<<
"-components = "
146 <<dsets.count_sets(elements.domain().begin(),
147 elements.domain().end())
152int main(
int argc,
char** argv )
157 std::string inputFileName;
158 unsigned int connectivity {6};
160 app.description(
"Count the number of connected component (same values) in a volume (Vol) file image\n\n Example : \n \t volCComponentCounter $DGtal/examples/samples/Al.100.vol\n");
161 app.add_option(
"-i,--input,1", inputFileName,
"volume file (.vol)." )
163 ->check(CLI::ExistingFile);
164 app.add_option(
"--connectivity,-c",connectivity,
"object connectivity (6,18,26) (default: 6 ).")
165 -> check(CLI::IsMember({6, 18, 26}));
167 app.get_formatter()->column_width(40);
168 CLI11_PARSE(app, argc, argv);
172 typedef ImageSelector<Domain, unsigned char>::Type Image;
173 Image image = VolReader<Image>::importVol( inputFileName );
175 trace.info() <<
"Image loaded: "<<image<< std::endl;
177 typedef std::map<Point,std::size_t> rank_t;
178 typedef std::map<Point,Point> parent_t;
182 boost::associative_property_map<rank_t> rank_pmap(rank_map);
183 boost::associative_property_map<parent_t> parent_pmap(parent_map);
185 CCCounter(rank_pmap, parent_pmap, image, connectivity);