void fillImage3D( Image3D & img, typename Image3D::Point low, typename Image3D::Point up, typename Image3D::Value value ) { typedef typename Image3D::Point Point; typedef typename Image3D::Integer Integer; for ( Integer z = low[ 2 ]; z <= up[ 2 ]; ++z ) for ( Integer y = low[ 1 ]; y <= up[ 1 ]; ++y ) for ( Integer x = low[ 0 ]; x <= up[ 0 ]; ++x ) img.setValue( Point( x, y, z ), value ); }
int main( int argc, char** argv ) { typedef ImageContainerBySTLVector < Z3i::Domain, unsigned char > Image3D; typedef ImageContainerBySTLVector < Z2i::Domain, unsigned char > Image2D; // parse command line ---------------------------------------------- po::options_description general_opt("Allowed options are: "); general_opt.add_options() ("help,h", "display this message") ("sliceOrientation,s", po::value<unsigned int>()->default_value(2), "specify the slice orientation for which the slice are considered (by default =2 (Z direction))" ) ("input,i", po::value<std::vector <std::string> >()->multitoken(), "input 2D files (.pgm) " ) ("output,o", po::value<std::string>(), "volumetric file (.vol, .longvol .pgm3d) " ); bool parseOK=true; po::variables_map vm; try{ po::store(po::parse_command_line(argc, argv, general_opt), vm); }catch(const std::exception& ex){ parseOK=false; trace.info()<< "Error checking program options: "<< ex.what()<< endl; } po::notify(vm); if( !parseOK || vm.count("help")) { std::cout << "Usage: " << argv[0] << " [input-files] [output]\n" << "Convert set of 2D images into volumetric file (pgm3d, vol, longvol) " << general_opt << "\n"; std::cout << "Example:\n" << "slice2vol -i slice1.pgm slice2.pgm slice3.pgm -o vol.p3d \n" << "see vol2slice"<<endl; return 0; } if(! vm.count("input-files")||! vm.count("output")) { trace.error() << " Input and output filename are needed to be defined" << endl; return 0; } std::string outputFileName = vm["output"].as<std::string>(); std::vector<string> vectImage2DNames = vm["input"].as<std::vector<std::string> >(); unsigned int sliceOrientation = vm["sliceOrientation"].as<unsigned int>(); std::vector<Image2D> vectImages2D; // Reading all images for(unsigned int i=0; i< vectImage2DNames.size(); i++){ trace.info() << "Reading image " << i ; Image2D image = GenericReader<Image2D>::import(vectImage2DNames.at(i)); vectImages2D.push_back(image); trace.info() << " [done]" << std::endl; } Image2D::Domain domImage2D = vectImages2D.at(0).domain(); DGtal::functors::Projector<DGtal::Z3i::Space> projIn3Dlower(0); DGtal::functors::Projector<DGtal::Z3i::Space> projIn3Dupper(vectImages2D.size()-1); projIn3Dlower.initAddOneDim(sliceOrientation); projIn3Dupper.initAddOneDim(sliceOrientation); Image3D::Domain domImage3D (projIn3Dlower(vectImages2D.at(0).domain().lowerBound()), projIn3Dupper(vectImages2D.at(0).domain().upperBound())); Image3D imageResult (domImage3D); for( unsigned int i=0; i<vectImages2D.size(); i++){ Image2D sliceImage = vectImages2D.at(i); DGtal::functors::Projector<DGtal::Z3i::Space> projIn3D(i); projIn3D.initAddOneDim(sliceOrientation); for(Image2D::Domain::ConstIterator it = sliceImage.domain().begin(); it!= sliceImage.domain().end(); it++){ Z3i::Point pt =projIn3D(*it); imageResult.setValue(pt, sliceImage(*it)); } } trace.info() << "Exporting 3d image ... " << std::endl ; GenericWriter<Image3D>::exportFile(outputFileName, imageResult); trace.info() << "[done]"; return 0; }