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;
    98 namespace po = boost::program_options;
   101 int main( 
int argc, 
char** argv )
   103   typedef ImageContainerBySTLVector < Z3i::Domain, unsigned char > Image3D;
   104   typedef DGtal::functors::BasicDomainSubSampler< HyperRectDomain<SpaceND<3, int> >,  
   105                                                   DGtal::int32_t, 
double >   ReSampler; 
   106   typedef DGtal::ConstImageAdapter<Image3D, Image3D::Domain, ReSampler,
   107                                    Image3D::Value,  DGtal::functors::Identity >  SamplerImageAdapter;
   111   po::options_description general_opt(
"Allowed options are: ");
   112   general_opt.add_options()
   113     (
"help,h", 
"display this message")
   114     (
"input,i", po::value<std::string >(), 
"input volumetric file (.vol, .longvol, .pgm3d) " )
   115     (
"output,o", po::value<std::string>(), 
"the new volumetric file (.vol, .longvol, .pgm3d) " )
   116     (
"gridSize,g", po::value<std::vector<double> >()->multitoken(), 
"size_x size_y size_z : the grid size of the re sampling ");
   120   po::variables_map vm;
   122     po::store(po::parse_command_line(argc, argv, general_opt), vm);
   123   }
catch(
const std::exception& ex){
   125     trace.info()<< 
"Error checking program options: "<< ex.what()<< endl;
   131   if( !parseOK || vm.count(
"help") || !vm.count(
"gridSize") || ! vm.count(
"input")||! vm.count(
"output") )
   133       std::cout << 
"Usage: " << argv[0] << 
" [input-files] [output-file]\n"   134                 << 
"Re sample a 3D volumetric image (.vol, .longvol, .pgm3d)  with a given grid size. \n"   135                 << general_opt << 
"\n";
   136       std::cout << 
"Example:\n to re sample an image with scale x,y,z  = 0.98, 0.98, 5.0,  you can do: \n"   137                 << 
"volResSample -i image3d.vol -g 1 1 2  -o imageReSampled.vol \n" << endl;
   145   std::vector<  double > aGridSizeReSample = vm[
"gridSize"].as<std::vector<double > >();
   146   if(aGridSizeReSample.size()!=3){
   147     trace.error() << 
"The grid size should contains 3 elements" << std::endl;
   151   std::string inputFileName = vm[
"input"].as<std::string>();
   152   std::string outputFileName = vm[
"output"].as<std::string>();
   155   trace.info()<< 
"Importing volume file :  " << inputFileName<< 
" ... " ;
   156   Image3D input3dImage = GenericReader<Image3D>::import(inputFileName);
   157   trace.info()<< 
"[done]" << endl;
   160   PointVector<3,int> shiftVector3D(0 ,0, 0);      
   161   DGtal::functors::BasicDomainSubSampler< HyperRectDomain<SpaceND<3, int> >,  
   162                                           DGtal::int32_t, 
double > reSampler(input3dImage.domain(),
   163                                                                              aGridSizeReSample,  shiftVector3D);  
   165   const functors::Identity aFunctor{};
   166   SamplerImageAdapter sampledImage ( input3dImage, reSampler.getSubSampledDomain(), reSampler, aFunctor );
   167   GenericWriter<SamplerImageAdapter>::exportFile(outputFileName, sampledImage);