DGtalTools 2.1.0
Loading...
Searching...
No Matches
sdp2vol.cpp
1
30#include <iostream>
31#include <fstream>
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"
36
37#include "CLI11.hpp"
38
39using namespace std;
40using namespace DGtal;
41
80int main( int argc, char** argv )
81{
82 typedef ImageContainerBySTLVector < Z3i::Domain, unsigned char > Image3D;
83
84// parse command line using CLI ----------------------------------------------
85 CLI::App app;
86 std::string inputSDP;
87 std::string outputFileName {"result.vol"};
88 DGtal::int64_t rescaleInputMin {0};
89 DGtal::int64_t rescaleInputMax {255};
90
91 int foregroundVal {128};
92 int backgroundVal {0};
93 bool invertY {false};
94 std::vector<int> domainCoords;
95
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)." )
98 ->required()
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)")
104 ->expected(6);
105
106 app.add_flag("--invertY", invertY, "Invert the Y axis (image flip in the y direction)");
107
108
109 app.get_formatter()->column_width(40);
110 CLI11_PARSE(app, argc, argv);
111 // END parse command line using CLI ----------------------------------------------
112
113 vector<unsigned int> vPos;
114 vPos.push_back(0);
115 vPos.push_back(1);
116 vPos.push_back(2);
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 ;
120
121 Z3i::Point ptLower;
122 Z3i::Point ptUpper;
123
124 struct BBCompPoints
125 {
126 explicit BBCompPoints(unsigned int d): myDim(d){};
127 bool operator() (const Z3i::Point &p1, const Z3i::Point &p2){return p1[myDim]<p2[myDim];};
128 unsigned int myDim;
129 };
130 if(domainCoords.size() != 6 )
131 {
132 unsigned int marge = 1;
133 for(unsigned int i=0; i< 3; i++)
134 {
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;
138 }
139 }
140 else
141 {
142 ptLower = Z3i::Point(domainCoords[0],domainCoords[1], domainCoords[2]);
143 ptUpper = Z3i::Point(domainCoords[3],domainCoords[4], domainCoords[5]);
144 }
145
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();
151 iter++)
152 {
153 imageResult.setValue(*iter, backgroundVal);
154 }
155
156 for(unsigned int i=0; i<vectPoints.size(); i++)
157 {
158 if(invertY)
159 {
160 vectPoints[i][1]=ptUpper[1]-vectPoints[i][1];
161 }
162 if(imageResult.domain().isInside(vectPoints[i]))
163 {
164 imageResult.setValue(vectPoints[i], foregroundVal);
165 }
166 else
167 {
168 trace.warning() << "point " << vectPoints[i] << " outside the domain (ignored in the resulting volumic image)" << std::endl;
169 }
170 }
171 trace.info()<< "Exporting resulting volumic image ... ";
172 GenericWriter<Image3D>::exportFile(outputFileName, imageResult);
173 trace.info() << " [done]"<<std::endl;
174 return EXIT_SUCCESS;
175}
Definition ATu0v1.h:57