]> Creatis software - STMS.git/blob - Lib/PrePostProcessing/itkSTMS_TemporalSetToImageSequence.txx
2d5131821dafa43f4ff2b394f9b137b0ed8f0e49
[STMS.git] / Lib / PrePostProcessing / itkSTMS_TemporalSetToImageSequence.txx
1 /*
2  #
3  #  File        : itkSTMS_TemporalSetToImageSequence.txx
4  #                ( C++ header file - STMS )
5  #
6  #  Description : STMS lib that implements the STMS filter and clustering.
7  #                This file is a part of the STMS Library project.
8  #                ( https://www.creatis.insa-lyon.fr/site7/fr/realisations )
9  #
10  #  [1] S. Mure, Grenier, T., Meier, S., Guttmann, R. G., et Benoit-Cattin, H.,
11  #       « Unsupervised spatio-temporal filtering of image sequences. A mean-shift specification »,
12  #       Pattern Recognition Letters, vol. 68, Part 1, p. 48 - 55, 2015.
13  #
14  #  Copyright   : Thomas GRENIER - Simon MURE
15  #                ( https://www.creatis.insa-lyon.fr/~grenier/ )
16  #
17  #  License     : CeCILL C
18  #                ( http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.txt )
19  #
20  #  This software is governed by the CeCILL  license under French law and
21  #  abiding by the rules of distribution of free software.  You can  use,
22  #  modify and/ or redistribute the software under the terms of the CeCILL
23  #  license as circulated by CEA, CNRS and INRIA at the following URL
24  #  "http://www.cecill.info".
25  #
26  #  As a counterpart to the access to the source code and  rights to copy,
27  #  modify and redistribute granted by the license, users are provided only
28  #  with a limited warranty  and the software's author,  the holder of the
29  #  economic rights,  and the successive licensors  have only  limited
30  #  liability.
31  #
32  #  In this respect, the user's attention is drawn to the risks associated
33  #  with loading,  using,  modifying and/or developing or reproducing the
34  #  software by the user in light of its specific status of free software,
35  #  that may mean  that it is complicated to manipulate,  and  that  also
36  #  therefore means  that it is reserved for developers  and  experienced
37  #  professionals having in-depth computer knowledge. Users are therefore
38  #  encouraged to load and test the software's suitability as regards their
39  #  requirements in conditions enabling the security of their systems and/or
40  #  data to be ensured and,  more generally, to use and operate it in the
41  #  same conditions as regards security.
42  #
43  #  The fact that you are presently reading this means that you have had
44  #  knowledge of the CeCILL license and that you accept its terms.
45  #
46 */
47 /* Please don't forget to cite our work :
48   @article {MURE-15a,
49     title = {Unsupervised spatio-temporal filtering of image sequences. A mean-shift specification},
50     journal = {Pattern Recognition Letters},
51     volume = {68, Part 1},
52     year = {2015},
53     pages = {48 - 55},
54     issn = {0167-8655},
55     doi = {http://dx.doi.org/10.1016/j.patrec.2015.07.021},
56     url = {http://www.sciencedirect.com/science/article/pii/S0167865515002305},
57     author = {S. Mure and T Grenier and Meier, S. and Guttmann, R.G. and H. Benoit-Cattin}
58 }
59 */
60 #ifndef itkSTMS_TemporalSetToImageSequence_txx
61 #define itkSTMS_TemporalSetToImageSequence_txx
62
63 #include "itkSTMS_TemporalSetToImageSequence.h"
64 #include "itkSTMS_XMLFileParser.h"
65 #include "itkSTMS_ArgumentsAnalysis.h"
66
67 namespace itkSTMS
68 {
69
70 template < class ImageType, class ClassImageType >
71 itkSTMS_TemporalSetToImageSequence < ImageType, ClassImageType >
72 ::itkSTMS_TemporalSetToImageSequence( IndexSampleSetType* cl, SpatialSampleSetType* sp, RangeSampleSetType* ra,
73                                       itkSTMS::ParamsAnalysisOutputType* params, itkSTMS::ParserOutputType* desc )
74 {
75     this->stmsParameters = params;
76     this->expDescription = desc;
77
78     this->classSet   = cl;
79     this->spatialSet = sp;
80     this->rangeSet   = ra;
81 }
82
83
84 template < class ImageType, class ClassImageType >
85 void
86 itkSTMS_TemporalSetToImageSequence< ImageType, ClassImageType >
87 ::GenerateImageSequence()
88 {
89     bool first = true;
90
91     // Output images allocation
92     ImagePointer image
93             = ImageType::New();
94     ReaderPointer reader
95             = ReaderType::New();
96
97     std::string imagePath = expDescription->experimentPath+expDescription->inputFolder+expDescription->inputCommonRoot+STMS_NUMBERING_FORM_ONE+expDescription->imageExtension;
98
99     reader->SetFileName( imagePath );
100     reader->Update();
101     image = reader->GetOutput();
102
103     SpatialIndexType start, outIndex, classIndex;
104     start.Fill(0);
105
106     RegionType region;
107     region.SetSize( image->GetBufferedRegion().GetSize());
108     region.SetIndex(start);
109
110     ClassRegionType classRegion;
111     classRegion.SetSize( image->GetBufferedRegion().GetSize());
112     classRegion.SetIndex( start );
113
114
115     std::string outputPath, classPath;
116
117     ClassImagePointer classImage
118             = ClassImageType::New();
119
120     classImage->SetRegions( classRegion );
121     classImage->Allocate();
122     classImage->FillBuffer( 15.0 );
123
124
125     classPath = expDescription->experimentPath+expDescription->outputFolder+
126             expDescription->outputCommonRoot+
127             "_Class_X-"+std::to_string((unsigned int)stmsParameters->spScales[0])+
128             "_Y-"+std::to_string((unsigned int)stmsParameters->spScales[1])+
129             "_Z-"+std::to_string((unsigned int)stmsParameters->spScales[2])+
130             "_R-"+std::to_string(stmsParameters->rScale)+
131             expDescription->outputImageExtension;
132
133     ClassWriterPointer classWriter
134             = ClassWriterType::New();
135     classWriter->SetFileName( classPath );
136
137     // Filetered image sequence and class image saving
138     for( unsigned int i=1 ; i<=stmsParameters->numTimePoints - stmsParameters->startTimePoint + 1; ++i )
139     {
140         char buffer[6];
141         int n;
142
143         if( sizeof(STMS_NUMBERING_FORM_ONE) == 6 ) n=sprintf (buffer, "%05d", i + stmsParameters->startTimePoint - 1);
144         if( sizeof(STMS_NUMBERING_FORM_ONE) == 5 ) n=sprintf (buffer, "%04d", i + stmsParameters->startTimePoint - 1);
145         if( sizeof(STMS_NUMBERING_FORM_ONE) == 4 ) n=sprintf (buffer, "%03d", i + stmsParameters->startTimePoint - 1);
146         if( sizeof(STMS_NUMBERING_FORM_ONE) == 3 ) n=sprintf (buffer, "%02d", i + stmsParameters->startTimePoint - 1);
147         if( sizeof(STMS_NUMBERING_FORM_ONE) == 2 ) n=sprintf (buffer, "%01d", i + stmsParameters->startTimePoint - 1);
148
149         outputPath = expDescription->experimentPath+expDescription->outputFolder+
150                 expDescription->outputCommonRoot+
151                 "_X-"+std::to_string((unsigned int)stmsParameters->spScales[0])+
152                 "_Y-"+std::to_string((unsigned int)stmsParameters->spScales[1])+
153                 "_Z-"+std::to_string((unsigned int)stmsParameters->spScales[2])+
154                 "_R-"+std::to_string(stmsParameters->rScale)+"_"+
155                 buffer+expDescription->outputImageExtension;
156
157         ImagePointer outImage
158                 = ImageType::New();
159
160         outImage->SetRegions( region );
161         outImage->Allocate();
162         outImage->FillBuffer( 15.0 );
163
164         WriterPointer writer
165                 = WriterType::New();
166         writer->SetFileName( outputPath );
167
168         //#pragma omp parrallel for ...
169         for(unsigned int j=0 ; j<classSet->size() ; ++j)
170         {
171             for( unsigned int k=0 ; k<stmsParameters->dim ; ++k)
172             {
173                 outIndex[k]   = (IndexType)( round(spatialSet->at(j)[k]*stmsParameters->spScales[k]) );
174
175                 if( first )
176                     classIndex[k] = outIndex[k];
177             }
178
179             outImage->SetPixel( outIndex, rangeSet->at( classSet->at(j)-1 )[i-1]*stmsParameters->rScale );
180
181             if( first )
182                 classImage->SetPixel(classIndex, classSet->at(j));
183         }
184
185         writer->SetInput( outImage );
186         writer->Update();
187
188         if( first )
189         {
190             classWriter->SetInput( classImage );
191             classWriter->Update();
192             first = false;
193         }
194     }
195 }
196
197
198 template < class ImageType, class ClassImageType>
199 void
200 itkSTMS_TemporalSetToImageSequence< ImageType, ClassImageType >
201 ::GenerateCSVFile(const std::string &delimiter)
202 {
203     std::string CSVFilename = expDescription->experimentPath+expDescription->outputFolder+
204             expDescription->outputCommonRoot+
205             "_X-"+std::to_string((unsigned int)stmsParameters->spScales[0])+
206             "_Y-"+std::to_string((unsigned int)stmsParameters->spScales[1])+
207             "_Z-"+std::to_string((unsigned int)stmsParameters->spScales[2])+
208             "_R-"+std::to_string(stmsParameters->rScale)+".csv";
209
210     std::cout << "Writing CSV File (classID, nb of pixels, values of time serie), : " << CSVFilename << std::endl;
211     std::ofstream ofs;
212     ofs.open (CSVFilename.c_str(), std::ofstream::out | std::ofstream::trunc);
213
214     for(unsigned int j=0 ; j<rangeSet->size() ; ++j)
215     {
216         ofs << j+1 << delimiter << std::count (classSet->begin(), classSet->end(), j+1);
217         for( unsigned int i=1 ; i<=stmsParameters->numTimePoints - stmsParameters->startTimePoint + 1; ++i )
218            ofs << delimiter << rangeSet->at(j)[i-1]*stmsParameters->rScale ;
219         ofs << std::endl;
220     }
221
222     ofs.close();
223
224 }
225
226
227 } // end of namespace itkSTMS
228
229 #endif