31 #include "DGtal/base/Common.h" 32 #include "DGtal/helpers/StdDefs.h" 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" 39 #include <boost/program_options/options_description.hpp> 40 #include <boost/program_options/parsers.hpp> 41 #include <boost/program_options/variables_map.hpp> 46 using namespace DGtal;
50 namespace po = boost::program_options;
92 int main(
int argc,
char** argv )
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;
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))" );
112 po::variables_map vm;
114 po::store(po::parse_command_line(argc, argv, general_opt), vm);
115 }
catch(
const std::exception& ex){
117 trace.info()<<
"Error checking program options: "<< ex.what()<< endl;
122 if( !parseOK || ! vm.count(
"input")||! vm.count(
"output") || vm.count(
"help"))
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;
133 if(! vm.count(
"input")||! vm.count(
"output"))
135 trace.error() <<
" Input and output filename are needed to be defined" << endl;
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>();
149 trace.info()<<
"Importing volume file base name: " << outputBasename <<
" extension: " << outputExt <<
" ..." ;
150 Image3D input3dImage = GenericReader<Image3D>::import(inputFileName);
151 trace.info()<<
"[done]" << endl;
153 unsigned int startSlice=0;
154 unsigned int endSlice=input3dImage.domain().upperBound()[sliceOrientation];
156 if(vm.count(
"setFirstSlice")){
157 startSlice = vm[
"setFirstSlice"].as<
unsigned int>();
159 if(vm.count(
"setLastSlice")){
160 endSlice = vm[
"setLastSlice"].as<
unsigned int>();
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;