3 # File : itkSTMS_ImageSequenceToTemporalSet.txx
4 # ( C++ header file - STMS )
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 )
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.
14 # Copyright : Thomas GRENIER - Simon MURE
15 # ( https://www.creatis.insa-lyon.fr/~grenier/ )
18 # ( http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.txt )
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".
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
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.
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.
47 /* Please don't forget to cite our work :
49 title = {Unsupervised spatio-temporal filtering of image sequences. A mean-shift specification},
50 journal = {Pattern Recognition Letters},
51 volume = {68, Part 1},
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}
60 #ifndef itkSTMS_ImageSequenceToTemporalSet_txx
61 #define itkSTMS_ImageSequenceToTemporalSet_txx
64 #include "itkSTMS_ImageSequenceToTemporalSet.h"
65 #include "itkSTMS_XMLFileParser.h"
66 #include "itkSTMS_ArgumentsAnalysis.h"
67 #include "itkFancyString.h"
73 template < class ImageType, class MaskImageType >
74 itkSTMS_ImageSequenceToTemporalSet < ImageType, MaskImageType >
75 ::itkSTMS_ImageSequenceToTemporalSet( ParamsAnalysisOutputType* stmsParameters )
77 // Get experiments parameters given by the user
78 this->stmsParameters = stmsParameters;
81 xmlParser = new itkSTMS::itkSTMS_XMLFileParser();
82 xmlParser->SetFileName( this->stmsParameters->expDescription );
85 expDescription = xmlParser->GetXMLParams();
87 // If a mask image is specified ==> instanciation of a mask iterator (region with the highest value in the mask)
88 if( expDescription->maskImage != "null" )
90 mask = MaskImageType::New();
91 mReader = MaskReaderType::New();
92 MinMaxCalculator = MinMaxCalculatorType::New();
94 maskPath = expDescription->maskImage; //expDescription->experimentPath+expDescription->inputFolder+expDescription->maskImage+expDescription->imageExtension;
95 mReader->SetFileName( maskPath );
97 mask = mReader->GetOutput();
99 MinMaxCalculator->SetImage( mask );
100 MinMaxCalculator->ComputeMaximum();
101 maskValue = (MaskPixelType)MinMaxCalculator->GetMaximum();
103 mIt = MaskIteratorType( mask, mask->GetLargestPossibleRegion() ); //->GetBufferedRegion() );
108 template < class ImageType, class MaskImageType >
110 itkSTMS_ImageSequenceToTemporalSet< ImageType, MaskImageType >
117 // Preprocessing of the whole image sequence // stmsParameters->startTimePoint
118 for( unsigned int i=1 ; i<=stmsParameters->numTimePoints - stmsParameters->startTimePoint + 1 ; ++i )
125 if( sizeof(STMS_NUMBERING_FORM_ONE) == 6 ) n=sprintf (buffer, "%05d", i + stmsParameters->startTimePoint - 1);
126 if( sizeof(STMS_NUMBERING_FORM_ONE) == 5 ) n=sprintf (buffer, "%04d", i + stmsParameters->startTimePoint - 1);
127 if( sizeof(STMS_NUMBERING_FORM_ONE) == 4 ) n=sprintf (buffer, "%03d", i + stmsParameters->startTimePoint - 1);
128 if( sizeof(STMS_NUMBERING_FORM_ONE) == 3 ) n=sprintf (buffer, "%02d", i + stmsParameters->startTimePoint - 1);
129 if( sizeof(STMS_NUMBERING_FORM_ONE) == 2 ) n=sprintf (buffer, "%01d", i + stmsParameters->startTimePoint - 1);
131 std::string imagePath = expDescription->experimentPath+expDescription->inputFolder+expDescription->inputCommonRoot+buffer+expDescription->imageExtension;
136 = itk::ImageFileReader< ImageType >::New();
138 reader->SetFileName( imagePath );
140 image = reader->GetOutput();
142 IteratorType it( image, image->GetLargestPossibleRegion() );
143 SizeType Size = image->GetLargestPossibleRegion().GetSize();
145 // If there is no mask image specified, all the pixels are extracted
146 if( expDescription->maskImage == "null" )
148 // Only the range values have to be extracted at each time-point. The others need to be extracted just one time.
151 // Containers initialisation
152 unsigned int numSamples = (unsigned int)Size[0];
154 for( unsigned int j=1 ; j<stmsParameters->dim ; ++j )
155 numSamples *= (unsigned int)Size[j];
157 indexSet = IndexSampleSetType( numSamples, 0 );
158 classSet = IndexSampleSetType( numSamples, 0 );
159 mergingSet = IndexSampleSetType( numSamples, 0 );
160 weightsSet = IndexSampleSetType( numSamples, 1 );
161 spatialSet = SpatialSampleSetType( numSamples, SpatialVectorType(stmsParameters->dim, 0));
162 rangeSet = RangeSampleSetType ( numSamples, RangeVectorType(stmsParameters->numTimePoints - stmsParameters->startTimePoint + 1, 0) );
165 // Samples extraction
167 while( !it.IsAtEnd() ){
170 classSet[idx] = idx+1;
172 for( unsigned int j=0 ; j<stmsParameters->dim ; ++j )
173 spatialSet[idx][j] = (SpatialType)( it.GetIndex()[j]/stmsParameters->spScales[j] );
176 rangeSet[idx++][i-1] = (PixelType)(it.Get()/stmsParameters->rScale);
183 // If a mask is specified, just the characteristics of the pixels equal to maskValue in the mask image are extracted
186 // In this case the number of samples is not known in advance
189 indexSet = IndexSampleSetType();
190 classSet = IndexSampleSetType();
191 mergingSet = IndexSampleSetType();
192 weightsSet = IndexSampleSetType();
193 spatialSet = SpatialSampleSetType();
194 rangeSet = RangeSampleSetType();
196 indexSet.reserve ( Size[0]*Size[1] );
197 classSet.reserve ( Size[0]*Size[1] );
198 mergingSet.reserve( Size[0]*Size[1] );
199 weightsSet.reserve( Size[0]*Size[1] );
200 spatialSet.reserve( Size[0]*Size[1] );
201 rangeSet.reserve ( Size[0]*Size[1] );
204 // Samples extraction
207 while( !mIt.IsAtEnd() )
209 if(mIt.Get() == maskValue)
213 SpatialVectorType spComp = SpatialVectorType(stmsParameters->dim, 0);
214 for( unsigned int j=0 ; j<stmsParameters->dim ; ++j )
215 spComp[j] = (SpatialType)( it.GetIndex()[j]/stmsParameters->spScales[j] );
217 indexSet.push_back ( idx );
218 classSet.push_back ( ++idx );
219 mergingSet.push_back( 0 );
220 weightsSet.push_back( 1 );
221 spatialSet.push_back( spComp );
222 rangeSet.push_back( RangeVectorType(stmsParameters->numTimePoints - stmsParameters->startTimePoint + 1, (PixelType)(it.Get()/stmsParameters->rScale)) );
225 rangeSet[idx++][i-1] = (PixelType)(it.Get()/stmsParameters->rScale);
238 } // end of namespace itkSTMS