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>
113void missingParam ( std::string param )
115 trace.error() <<
" Parameter: "<<param<<
" is required..";
116 trace.info() <<std::endl;
120template<
typename Val,
typename Image,
typename Po
int,
typename Domain>
121Val maxVal(Image
const& image, Point
const& p, Domain
const& domain)
123 typename Image::Domain dom( p*2, p*2 + Point::diagonal(1));
125 for(
typename Image::Domain::ConstIterator it=dom.begin(), itend=dom.end();
128 if ( domain.isInside(*it) && image( *it) > v) v=image(*it);
132template<
typename Val,
typename Image,
typename Po
int,
typename Domain>
133Val minVal(Image
const& image, Point
const& p, Domain
const& domain)
135 typename Image::Domain dom( p*2, p*2 + Point::diagonal(1));
137 for(
typename Image::Domain::ConstIterator it=dom.begin(), itend=dom.end();
140 if ( domain.isInside(*it)&& image( *it) < v) v=image(*it);
144template<
typename Val,
typename Image,
typename Po
int,
typename Domain>
145Val meanVal(Image
const& image, Point
const& p, Domain
const& domain)
147 typename Image::Domain dom( p*2, p*2 + Point::diagonal(1));
150 for(
typename Image::Domain::ConstIterator it=dom.begin(), itend=dom.end();
153 if ( domain.isInside(*it) )
158 return static_cast<unsigned char>( v/nb );
162int main(
int argc,
char**argv)
168 std::string inputFileName;
169 std::string outputFileName {
"result.vol"};
170 std::string function {
"mean"};
172 app.description(
"Brutally sub sample a vol file (division by 2 in each direction).\n Basic usage: \n \tvolSubSample <volFileName> <volOutputFileName> ");
175 app.add_option(
"-i,--input,1", inputFileName,
"Input vol file." )
177 ->check(CLI::ExistingFile);
178 app.add_option(
"-o,--output,2", outputFileName,
"Output filename.");
179 app.add_option(
"-f,--function", function,
"Function used to the down-sampling: {none,max, min, mean}")
180 -> check(CLI::IsMember({
"mean",
"none",
"max",
"min",
"mean"}));
182 app.get_formatter()->column_width(40);
183 CLI11_PARSE(app, argc, argv);
187 trace.beginBlock(
"Loading file");
188 typedef ImageContainerBySTLVector<Z3i::Domain, unsigned char> MyImageC;
190 MyImageC imageC = VolReader< MyImageC >::importVol ( inputFileName );
191 MyImageC outputImage( Z3i::Domain( imageC.domain().lowerBound(),
192 (imageC.domain().upperBound()-imageC.domain().lowerBound())/Vector().
diagonal(2)));
195 Point subvector = Vector().diagonal(2);
198 trace.beginBlock(
"Down-scaling the volume...");
199 trace.info()<<
"Function= "<<function<<std::endl;
200 trace.info() << outputImage.domain() << std::endl;
202 if (function ==
"none")
203 for(MyImageC::Domain::ConstIterator it = outputImage.domain().begin(),
204 itend = outputImage.domain().end(); it != itend; ++it)
207 outputImage.setValue( *it , imageC( p ));
210 if (function ==
"max")
211 for(MyImageC::Domain::ConstIterator it = outputImage.domain().begin(),
212 itend = outputImage.domain().end(); it != itend; ++it)
214 val = maxVal<unsigned char, MyImageC, Point>(imageC, *it, imageC.domain());
215 outputImage.setValue( *it , val );
218 if (function ==
"min")
219 for(MyImageC::Domain::ConstIterator it = outputImage.domain().begin(),
220 itend = outputImage.domain().end(); it != itend; ++it)
222 val = minVal<unsigned char, MyImageC, Point>(imageC, *it, imageC.domain());
223 outputImage.setValue( *it , val);
227 if (function ==
"mean")
228 for(MyImageC::Domain::ConstIterator it = outputImage.domain().begin(),
229 itend = outputImage.domain().end(); it != itend; ++it)
231 val = meanVal<unsigned char, MyImageC, Point>(imageC, *it, imageC.domain());
232 outputImage.setValue( *it , val );
235 trace.error() <<
"Bad function !"<<std::endl;
240 trace.beginBlock(
"Exporting...");
241 bool res = VolWriter< MyImageC>::exportVol(outputFileName, outputImage);
243 if (res)
return 0;
else return 1;
DGtal::LinearOperator< Calculus, dim, duality, dim, duality > diagonal(const DGtal::KForm< Calculus, dim, duality > &kform)