DGtalTools 2.0.0
Loading...
Searching...
No Matches
volSubSample.cpp
1
29#include <iostream>
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>
36
37#include "CLI11.hpp"
38
39
40using namespace std;
41using namespace DGtal;
42using namespace Z3i;
43
44
113void missingParam ( std::string param )
114{
115 trace.error() <<" Parameter: "<<param<<" is required..";
116 trace.info() <<std::endl;
117 exit ( 1 );
118}
119
120template<typename Val, typename Image, typename Point, typename Domain>
121Val maxVal(Image const& image, Point const& p, Domain const& domain)
122{
123 typename Image::Domain dom( p*2, p*2 + Point::diagonal(1));
124 Val v=image(p*2);
125 for(typename Image::Domain::ConstIterator it=dom.begin(), itend=dom.end();
126 it != itend;
127 ++it)
128 if ( domain.isInside(*it) && image( *it) > v) v=image(*it);
129
130 return v;
131}
132template<typename Val, typename Image, typename Point, typename Domain>
133Val minVal(Image const& image, Point const& p, Domain const& domain)
134{
135 typename Image::Domain dom( p*2, p*2 + Point::diagonal(1));
136 Val v=image(p*2);
137 for(typename Image::Domain::ConstIterator it=dom.begin(), itend=dom.end();
138 it != itend;
139 ++it)
140 if ( domain.isInside(*it)&& image( *it) < v) v=image(*it);
141
142 return v;
143}
144template<typename Val, typename Image, typename Point, typename Domain>
145Val meanVal(Image const& image, Point const& p, Domain const& domain)
146{
147 typename Image::Domain dom( p*2, p*2 + Point::diagonal(1));
148 int v=0;
149 int nb=0;
150 for(typename Image::Domain::ConstIterator it=dom.begin(), itend=dom.end();
151 it != itend;
152 ++it)
153 if ( domain.isInside(*it) )
154 {
155 nb++;
156 v+=image(*it);
157 }
158 return static_cast<unsigned char>( v/nb );
159}
160
161
162int main(int argc, char**argv)
163{
164
165 // parse command line ----------------------------------------------
166 // parse command line using CLI ----------------------------------------------
167 CLI::App app;
168 std::string inputFileName;
169 std::string outputFileName {"result.vol"};
170 std::string function {"mean"};
171
172 app.description("Brutally sub sample a vol file (division by 2 in each direction).\n Basic usage: \n \tvolSubSample <volFileName> <volOutputFileName> ");
173
174
175 app.add_option("-i,--input,1", inputFileName, "Input vol file." )
176 ->required()
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"}));
181
182 app.get_formatter()->column_width(40);
183 CLI11_PARSE(app, argc, argv);
184 // END parse command line using CLI ----------------------------------------------
185
186
187 trace.beginBlock("Loading file");
188 typedef ImageContainerBySTLVector<Z3i::Domain, unsigned char> MyImageC;
189
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)));
193
194 trace.endBlock();
195 Point subvector = Vector().diagonal(2);
196 Point p;
197 unsigned char val;
198 trace.beginBlock("Down-scaling the volume...");
199 trace.info()<<"Function= "<<function<<std::endl;
200 trace.info() << outputImage.domain() << std::endl;
201 //Fast Copy
202 if (function == "none")
203 for(MyImageC::Domain::ConstIterator it = outputImage.domain().begin(),
204 itend = outputImage.domain().end(); it != itend; ++it)
205 {
206 p = (*it) * 2;
207 outputImage.setValue( *it , imageC( p ));
208 }
209 else
210 if (function == "max")
211 for(MyImageC::Domain::ConstIterator it = outputImage.domain().begin(),
212 itend = outputImage.domain().end(); it != itend; ++it)
213 {
214 val = maxVal<unsigned char, MyImageC, Point>(imageC, *it, imageC.domain());
215 outputImage.setValue( *it , val );
216 }
217 else
218 if (function == "min")
219 for(MyImageC::Domain::ConstIterator it = outputImage.domain().begin(),
220 itend = outputImage.domain().end(); it != itend; ++it)
221 {
222 val = minVal<unsigned char, MyImageC, Point>(imageC, *it, imageC.domain());
223 outputImage.setValue( *it , val);
224 }
225 else
226
227 if (function == "mean")
228 for(MyImageC::Domain::ConstIterator it = outputImage.domain().begin(),
229 itend = outputImage.domain().end(); it != itend; ++it)
230 {
231 val = meanVal<unsigned char, MyImageC, Point>(imageC, *it, imageC.domain());
232 outputImage.setValue( *it , val );
233 }
234 else
235 trace.error() << "Bad function !"<<std::endl;
236
237
238 trace.endBlock();
239
240 trace.beginBlock("Exporting...");
241 bool res = VolWriter< MyImageC>::exportVol(outputFileName, outputImage);
242 trace.endBlock();
243 if (res) return 0; else return 1;
244}
DGtal::LinearOperator< Calculus, dim, duality, dim, duality > diagonal(const DGtal::KForm< Calculus, dim, duality > &kform)
Definition ATu0v1.h:57