DGtalTools  0.9.2
vol2slice.cpp
1 
29 #include <iostream>
31 #include "DGtal/base/Common.h"
32 #include "DGtal/helpers/StdDefs.h"
33 
34 #include "DGtal/io/readers/GenericReader.h"
35 #include "DGtal/io/writers/GenericWriter.h"
36 #include "DGtal/images/ConstImageAdapter.h"
37 #include "DGtal/kernel/BasicPointFunctors.h"
38 
39 #include <boost/program_options/options_description.hpp>
40 #include <boost/program_options/parsers.hpp>
41 #include <boost/program_options/variables_map.hpp>
42 
43 
44 
45 using namespace std;
46 using namespace DGtal;
47 
48 
50 namespace po = boost::program_options;
51 
92 int main( int argc, char** argv )
93 {
94  typedef ImageContainerBySTLVector < Z3i::Domain, unsigned char > Image3D;
95  typedef ImageContainerBySTLVector < Z2i::Domain, unsigned char > Image2D;
96  typedef DGtal::ConstImageAdapter<Image3D, Image2D::Domain, DGtal::functors::Projector< DGtal::Z3i::Space>,
97  Image3D::Value, DGtal::functors::Identity > SliceImageAdapter;
98 
99 
100  // parse command line ----------------------------------------------
101  po::options_description general_opt("Allowed options are: ");
102  general_opt.add_options()
103  ("help,h", "display this message")
104  ("input,i", po::value<std::string >(), "input volumetric file (.vol, .longvol, .pgm3d) " )
105  ("output,o", po::value<std::string>(), "base_name.extension: extracted 2D slice volumetric files (will result n files base_name_xxx.extension) " )
106  ("setFirstSlice,f", po::value<unsigned int>()->default_value(0), "Set the first slice index to be extracted.")
107  ("setLastSlice,l", po::value<unsigned int>(), "Set the last slice index to be extracted (by default set to maximal value according to the given volume).")
108  ("sliceOrientation,s", po::value<unsigned int>()->default_value(2), "specify the slice orientation for which the slice are defined (by default =2 (Z direction))" );
109 
110 
111  bool parseOK=true;
112  po::variables_map vm;
113  try{
114  po::store(po::parse_command_line(argc, argv, general_opt), vm);
115  }catch(const std::exception& ex){
116  parseOK=false;
117  trace.info()<< "Error checking program options: "<< ex.what()<< endl;
118  }
119  po::notify(vm);
120 
121 
122  if( !parseOK || ! vm.count("input")||! vm.count("output") || vm.count("help"))
123  {
124  std::cout << "Usage: " << argv[0] << " [inputs] [output]\n"
125  << "Convert a volumetric file (.vol, .longvol, .pgm3d) into a set of 2D slice images."
126  << general_opt << "\n";
127  std::cout << "Example: to extract all slices defined in Y plane (y=cst): \n"
128  << "vol2slice -i image3d.vol -s 1 -o slice.pgm \n"
129  << "see slice2vol"<< endl;
130  return 0;
131  }
132 
133  if(! vm.count("input")||! vm.count("output"))
134  {
135  trace.error() << " Input and output filename are needed to be defined" << endl;
136  return 0;
137  }
138 
139 
140 
141 
142  std::string inputFileName = vm["input"].as<std::string>();
143  std::string outputFileName = vm["output"].as<std::string>();
144  std::string outputExt = outputFileName.substr(outputFileName.find_last_of(".")+1);
145  std::string outputBasename = outputFileName.substr(0, outputFileName.find_last_of("."));
146  unsigned int sliceOrientation = vm["sliceOrientation"].as<unsigned int>();
147 
148 
149  trace.info()<< "Importing volume file base name: " << outputBasename << " extension: " << outputExt << " ..." ;
150  Image3D input3dImage = GenericReader<Image3D>::import(inputFileName);
151  trace.info()<< "[done]" << endl;
152 
153  unsigned int startSlice=0;
154  unsigned int endSlice=input3dImage.domain().upperBound()[sliceOrientation];
155 
156  if(vm.count("setFirstSlice")){
157  startSlice = vm["setFirstSlice"].as<unsigned int>();
158  }
159  if(vm.count("setLastSlice")){
160  endSlice = vm["setLastSlice"].as<unsigned int>();
161  }
162 
163  //Processing each slice
164 #pragma omp parallel for schedule(dynamic)
165  for( unsigned int i=startSlice; i <= endSlice; i++){
166  trace.info() << "Exporting slice image "<< i ;
167  DGtal::functors::Projector<DGtal::Z2i::Space> invFunctor; invFunctor.initRemoveOneDim(sliceOrientation);
168  DGtal::Z2i::Domain domain2D(invFunctor(input3dImage.domain().lowerBound()),
169  invFunctor(input3dImage.domain().upperBound()));
170  DGtal::functors::Projector<DGtal::Z3i::Space> aSliceFunctor(i); aSliceFunctor.initAddOneDim(sliceOrientation);
171  const DGtal::functors::Identity identityFunctor{};
172  SliceImageAdapter sliceImage( input3dImage, domain2D, aSliceFunctor, identityFunctor );
173  stringstream outName; outName << outputBasename << "_" << boost::format("%|05|")% i <<"."<< outputExt ;
174  trace.info() << ": "<< outName.str() ;
175  GenericWriter<SliceImageAdapter>::exportFile(outName.str(), sliceImage);
176  trace.info() << " [done]"<< endl;
177  }
178 
179 
180  return 0;
181 }
STL namespace.