30#include <DGtal/base/Common.h>
31#include <DGtal/io/readers/VolReader.h>
32#include <DGtal/io/writers/VolWriter.h>
33#include <DGtal/helpers/StdDefs.h>
34#include <DGtal/images/Image.h>
35#include <DGtal/images/ImageContainerBySTLVector.h>
114void missingParam ( std::string param )
116 trace.error() <<
" Parameter: "<<param<<
" is required..";
117 trace.info() <<std::endl;
121template<
typename Val,
typename Image,
typename Po
int,
typename Domain>
122Val maxVal(Image
const& image, Point
const& p, Domain
const& domain)
124 typename Image::Domain dom( p*2, p*2 + Point::diagonal(1));
126 for(
typename Image::Domain::ConstIterator it=dom.begin(), itend=dom.end();
129 if ( domain.isInside(*it) && image( *it) > v) v=image(*it);
133template<
typename Val,
typename Image,
typename Po
int,
typename Domain>
134Val minVal(Image
const& image, Point
const& p, Domain
const& domain)
136 typename Image::Domain dom( p*2, p*2 + Point::diagonal(1));
138 for(
typename Image::Domain::ConstIterator it=dom.begin(), itend=dom.end();
141 if ( domain.isInside(*it)&& image( *it) < v) v=image(*it);
145template<
typename Val,
typename Image,
typename Po
int,
typename Domain>
146Val meanVal(Image
const& image, Point
const& p, Domain
const& domain)
148 typename Image::Domain dom( p*2, p*2 + Point::diagonal(1));
151 for(
typename Image::Domain::ConstIterator it=dom.begin(), itend=dom.end();
154 if ( domain.isInside(*it) )
159 return static_cast<unsigned char>( v/nb );
163int main(
int argc,
char**argv)
169 std::string inputFileName;
170 std::string outputFileName {
"result.vol"};
171 std::string function {
"mean"};
173 app.description(
"Brutally sub sample a vol file (division by 2 in each direction).\n Basic usage: \n \tvolSubSample <volFileName> <volOutputFileName> ");
176 app.add_option(
"-i,--input,1", inputFileName,
"Input vol file." )
178 ->check(CLI::ExistingFile);
179 app.add_option(
"-o,--output,2", outputFileName,
"Output filename.");
180 app.add_option(
"-f,--function", function,
"Function used to the down-sampling: {none,max, min, mean}")
181 -> check(CLI::IsMember({
"mean",
"none",
"max",
"min",
"mean"}));
183 app.get_formatter()->column_width(40);
184 CLI11_PARSE(app, argc, argv);
188 trace.beginBlock(
"Loading file");
189 typedef ImageContainerBySTLVector<Z3i::Domain, unsigned char> MyImageC;
191 MyImageC imageC = VolReader< MyImageC >::importVol ( inputFileName );
192 MyImageC outputImage( Z3i::Domain( imageC.domain().lowerBound(),
193 (imageC.domain().upperBound()-imageC.domain().lowerBound())/Vector().
diagonal(2)));
196 Point subvector = Vector().diagonal(2);
199 trace.beginBlock(
"Down-scaling the volume...");
200 trace.info()<<
"Function= "<<function<<std::endl;
201 trace.info() << outputImage.domain() << std::endl;
203 if (function ==
"none")
204 for(MyImageC::Domain::ConstIterator it = outputImage.domain().begin(),
205 itend = outputImage.domain().end(); it != itend; ++it)
208 outputImage.setValue( *it , imageC( p ));
211 if (function ==
"max")
212 for(MyImageC::Domain::ConstIterator it = outputImage.domain().begin(),
213 itend = outputImage.domain().end(); it != itend; ++it)
215 val = maxVal<unsigned char, MyImageC, Point>(imageC, *it, imageC.domain());
216 outputImage.setValue( *it , val );
219 if (function ==
"min")
220 for(MyImageC::Domain::ConstIterator it = outputImage.domain().begin(),
221 itend = outputImage.domain().end(); it != itend; ++it)
223 val = minVal<unsigned char, MyImageC, Point>(imageC, *it, imageC.domain());
224 outputImage.setValue( *it , val);
228 if (function ==
"mean")
229 for(MyImageC::Domain::ConstIterator it = outputImage.domain().begin(),
230 itend = outputImage.domain().end(); it != itend; ++it)
232 val = meanVal<unsigned char, MyImageC, Point>(imageC, *it, imageC.domain());
233 outputImage.setValue( *it , val );
236 trace.error() <<
"Bad function !"<<std::endl;
241 trace.beginBlock(
"Exporting...");
242 bool res = VolWriter< MyImageC>::exportVol(outputFileName, outputImage);
244 if (res)
return 0;
else return 1;
DGtal::LinearOperator< Calculus, dim, duality, dim, duality > diagonal(const DGtal::KForm< Calculus, dim, duality > &kform)