DGtalTools 2.1.0
Loading...
Searching...
No Matches
volCComponentCounter.cpp
1
30#include <iostream>
31
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"
37
38#include <boost/pending/disjoint_sets.hpp>
39
40#include "CLI11.hpp"
41
42using namespace std;
43using namespace DGtal;
44using namespace Z3i;
45
46
92template <typename Rank, typename Parent, typename Image>
93void CCCounter(Rank& r, Parent& p, const Image& elements, const unsigned int connectivity)
94{
95
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)
100 dsets.make_set(*e);
101 trace.endBlock();
102
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);
107
108 //Merging process
109 for ( typename Image::Domain::ConstIterator e = elements.domain().begin();
110 e != elements.domain().end(); ++e )
111 {
112 if ( elements.domain().isInside( *e + decx ) &&
113 ( elements( *e ) == elements( *e + decx ) ) )
114 dsets.union_set( *e, *e + decx );
115
116 if ( elements.domain().isInside( *e + decy ) &&
117 ( elements( *e ) == elements( *e + decy ) ) )
118 dsets.union_set( *e, *e + decy );
119
120 if ( elements.domain().isInside( *e + decz ) &&
121 ( elements( *e ) == elements( *e + decz ) ) )
122 dsets.union_set( *e, *e + decz );
123
124 if ( connectivity > 6 )
125 {
126 if ( elements.domain().isInside( *e + decx + decy ) &&
127 ( elements( *e ) == elements( *e + decx + decy ) ) )
128 dsets.union_set( *e, *e + decx + decy );
129
130 if ( elements.domain().isInside( *e + decx + decz ) &&
131 ( elements( *e ) == elements( *e + decx + decz ) ) )
132 dsets.union_set( *e, *e + decx + decz );
133
134 if ( elements.domain().isInside( *e + decy + decz ) &&
135 ( elements( *e ) == elements( *e + decy + decz ) ) )
136 dsets.union_set( *e, *e + decy + decz );
137
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 );
142 }
143 }
144 trace.endBlock();
145 std::cout << "Number of disjoint "<<connectivity<<"-components = "
146 <<dsets.count_sets(elements.domain().begin(),
147 elements.domain().end())
148 << std::endl;
149}
150
151
152int main( int argc, char** argv )
153{
154
155 // parse command line using CLI ----------------------------------------------
156 CLI::App app;
157 std::string inputFileName;
158 unsigned int connectivity {6};
159
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)." )
162 ->required()
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}));
166
167 app.get_formatter()->column_width(40);
168 CLI11_PARSE(app, argc, argv);
169 // END parse command line using CLI ----------------------------------------------
170
171
172 typedef ImageSelector<Domain, unsigned char>::Type Image;
173 Image image = VolReader<Image>::importVol( inputFileName );
174
175 trace.info() << "Image loaded: "<<image<< std::endl;
176
177 typedef std::map<Point,std::size_t> rank_t; // => order on Element
178 typedef std::map<Point,Point> parent_t;
179 rank_t rank_map;
180 parent_t parent_map;
181
182 boost::associative_property_map<rank_t> rank_pmap(rank_map);
183 boost::associative_property_map<parent_t> parent_pmap(parent_map);
184
185 CCCounter(rank_pmap, parent_pmap, image, connectivity);
186
187 return 0;
188}
Definition ATu0v1.h:57