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