DGtalTools 2.0.0
Loading...
Searching...
No Matches
longvol2vol.cpp
1
29#include <iostream>
30#include <DGtal/base/Common.h>
31#include <DGtal/helpers/StdDefs.h>
32#include <DGtal/io/readers/LongvolReader.h>
33#include <DGtal/io/writers/VolWriter.h>
34#include <DGtal/images/Image.h>
35#include <DGtal/images/ImageContainerBySTLVector.h>
36#include <DGtal/base/BasicFunctors.h>
37
38#include "CLI11.hpp"
39
40using namespace DGtal;
41using namespace Z3i;
42
43
80struct CycleFunctor
81{
82 template<typename TInput>
83 inline
84 unsigned char operator()(const TInput& aInput) const
85 {
86 if (aInput == 0)
87 return 0;
88 else
89 return static_cast<unsigned char>(1+NumberTraits<TInput>::castToInt64_t(aInput) % 32);
90 }
91};
92
93
97struct LinearFunctor
98{
99 LinearFunctor(const DGtal::uint64_t vmax, const DGtal::uint64_t vmin):
100 myMin(vmin), myMax(vmax) {}
101
102 inline unsigned char operator()(const DGtal::int64_t& aInput) const
103 {
104 return static_cast<unsigned char>( (NumberTraits<DGtal::uint64_t>::castToDouble(aInput - myMin)*255.0 /
105 (double) (myMax-myMin)));
106 }
107
108 DGtal::uint64_t myMin,myMax;
109};
110
111
112int main(int argc, char**argv)
113{
114
115
116 // parse command line using CLI ----------------------------------------------
117 CLI::App app;
118 std::string inputFileName;
119 std::string outputFileName {"result.vol"};
120 unsigned int mode {0};
121
122 app.description("Converts a longvol (long int) to a vol file (unsigned char). \n Basic example:\n\t longvol2vol --input <LongvolFileName> --o <VolOutputFileName> ");
123 app.add_option("-i,--input,1", inputFileName, "Input longvol filename ( .longvol)" )
124 ->required()
125 ->check(CLI::ExistingFile);
126 app.add_option("-o,--output,2",outputFileName,"Output vol filename." );
127 app.add_option("-m,--mode", mode, "Conversion mode:\n\t 0 = cast (default)\n\t 1 = Linear Scaling\n\t 2 = Grayscale cycle (32 steps, except 0 values).")
128 -> check(CLI::IsMember({0, 1, 2}));
129
130
131 app.get_formatter()->column_width(40);
132 CLI11_PARSE(app, argc, argv);
133 // END parse command line using CLI ----------------------------------------------
134
135
136 //Main program
137 typedef ImageContainerBySTLVector<Z3i::Domain, DGtal::uint64_t> MyImageC;
138 MyImageC imageC = LongvolReader< MyImageC >::importLongvol ( inputFileName );
139 bool res = false;
140
141 if (mode == 0)
142 res = VolWriter< MyImageC, functors::Cast<unsigned char> >::exportVol(outputFileName, imageC);
143 else
144 if (mode == 1)
145 {
146 DGtal::uint64_t vmax, vmin;
147 vmax = *std::max_element(imageC.begin(), imageC.end());
148 vmin = *std::min_element(imageC.begin(), imageC.end());
149 trace.info() << "Max value = "<< vmax<<std::endl;
150 trace.info() << "Min value = "<< vmin<<std::endl;
151 res = VolWriter<MyImageC , LinearFunctor>::exportVol(outputFileName, imageC, true, LinearFunctor(vmax,vmin));
152 }
153 if (mode == 2)
154 res = VolWriter<MyImageC, CycleFunctor>::exportVol(outputFileName, imageC);
155
156 if (res)
157 return EXIT_SUCCESS;
158
159 else
160 {
161 trace.error()<<"Error while exporting the Vol.";
162 trace.info()<<std::endl;
163 return EXIT_FAILURE;
164 }
165}
Definition ATu0v1.h:57