32#include "DGtal/base/Common.h"
33#include "DGtal/helpers/StdDefs.h"
34#include "DGtal/images/ImageContainerBySTLVector.h"
35#include "DGtal/io/writers/GenericWriter.h"
80int main(
int argc,
char** argv )
82 typedef ImageContainerBySTLVector < Z3i::Domain, unsigned char > Image3D;
87 std::string outputFileName {
"result.vol"};
88 DGtal::int64_t rescaleInputMin {0};
89 DGtal::int64_t rescaleInputMax {255};
91 int foregroundVal {128};
92 int backgroundVal {0};
94 std::vector<int> domainCoords;
96 app.description(
"Convert digital set of points into a volumic file.\n Example:\n sdp2vol volumePoints.sdp volume.vol -d 0 0 0 10 10 10 \n");
97 app.add_option(
"-i,--input,1", inputSDP,
"Sequence of 3d Discrete points (.sdp)." )
99 ->check(CLI::ExistingFile);
100 app.add_option(
"-o,--output,2", outputFileName,
"Vol file (.vol, .longvol, .pgm3d) ");
101 app.add_option(
"-f,--foregroundVal", foregroundVal,
"value which will represent the foreground object in the resulting image (default 128)");
102 app.add_option(
"-b,--backgroundVal", backgroundVal,
"value which will represent the background outside the object in the resulting image (default 0)");
103 app.add_option(
"-d,--domain", domainCoords,
"customizes the domain of the resulting image xmin ymin zmin xmax ymax zmax (computed automatically by default)")
106 app.add_flag(
"--invertY", invertY,
"Invert the Y axis (image flip in the y direction)");
109 app.get_formatter()->column_width(40);
110 CLI11_PARSE(app, argc, argv);
113 vector<unsigned int> vPos;
117 trace.info() <<
"Reading input SDP file: " << inputSDP ;
118 std::vector<Z3i::Point> vectPoints= PointListReader<Z3i::Point>::getPointsFromFile(inputSDP, vPos);
119 trace.info() <<
" [done] " << std::endl ;
126 explicit BBCompPoints(
unsigned int d): myDim(d){};
127 bool operator() (
const Z3i::Point &p1,
const Z3i::Point &p2){
return p1[myDim]<p2[myDim];};
130 if(domainCoords.size() != 6 )
132 unsigned int marge = 1;
133 for(
unsigned int i=0; i< 3; i++)
135 BBCompPoints cmp_points(i);
136 ptUpper[i] = (*(std::max_element(vectPoints.begin(), vectPoints.end(), cmp_points)))[i]+marge;
137 ptLower[i] = (*(std::min_element(vectPoints.begin(), vectPoints.end(), cmp_points)))[i]-marge;
142 ptLower = Z3i::Point(domainCoords[0],domainCoords[1], domainCoords[2]);
143 ptUpper = Z3i::Point(domainCoords[3],domainCoords[4], domainCoords[5]);
146 Image3D::Domain imageDomain(ptLower, ptUpper);
147 trace.info() <<
"domain: "<<imageDomain<<std::endl;
148 Image3D imageResult(imageDomain);
149 for(Image3D::Domain::ConstIterator iter = imageResult.domain().begin();
150 iter!= imageResult.domain().end();
153 imageResult.setValue(*iter, backgroundVal);
156 for(
unsigned int i=0; i<vectPoints.size(); i++)
160 vectPoints[i][1]=ptUpper[1]-vectPoints[i][1];
162 if(imageResult.domain().isInside(vectPoints[i]))
164 imageResult.setValue(vectPoints[i], foregroundVal);
168 trace.warning() <<
"point " << vectPoints[i] <<
" outside the domain (ignored in the resulting volumic image)" << std::endl;
171 trace.info()<<
"Exporting resulting volumic image ... ";
172 GenericWriter<Image3D>::exportFile(outputFileName, imageResult);
173 trace.info() <<
" [done]"<<std::endl;