]> Creatis software - clitk.git/blob - segmentation/clitkRegionGrowingGenericFilter.txx
Debug RTStruct conversion with empty struc
[clitk.git] / segmentation / clitkRegionGrowingGenericFilter.txx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to: 
5   - University of LYON              http://www.universite-lyon.fr/
6   - Léon Bérard cancer center       http://www.centreleonberard.fr
7   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
8
9   This software is distributed WITHOUT ANY WARRANTY; without even
10   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11   PURPOSE.  See the copyright notices for more information.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17   ===========================================================================**/
18
19 #ifndef CLITKREGIONGROWINGGENERICFILTER_TXX
20 #define CLITKREGIONGROWINGGENERICFILTER_TXX
21
22 #include <itkBinaryBallStructuringElement.h>
23 #include <itkConstShapedNeighborhoodIterator.h>
24
25
26 //--------------------------------------------------------------------
27 template<class ArgsInfoType>
28 clitk::RegionGrowingGenericFilter<ArgsInfoType>::RegionGrowingGenericFilter():
29   ImageToImageGenericFilter<Self>("RegionGrowing") 
30 {
31   InitializeImageType<2>();
32   InitializeImageType<3>();
33   //InitializeImageType<4>();
34 }
35 //--------------------------------------------------------------------
36
37
38 //--------------------------------------------------------------------
39 template<class ArgsInfoType>
40 template<unsigned int Dim>
41 void clitk::RegionGrowingGenericFilter<ArgsInfoType>::InitializeImageType() 
42 {  
43   ADD_IMAGE_TYPE(Dim, uchar);
44   ADD_IMAGE_TYPE(Dim, short);
45   // ADD_IMAGE_TYPE(Dim, int);
46   ADD_IMAGE_TYPE(Dim, float);
47 }
48 //--------------------------------------------------------------------
49   
50
51 //--------------------------------------------------------------------
52 template<class ArgsInfoType>
53 void clitk::RegionGrowingGenericFilter<ArgsInfoType>::SetArgsInfo(const ArgsInfoType & a) 
54 {
55   mArgsInfo=a;
56   this->SetIOVerbose(mArgsInfo.verbose_flag);
57   if (mArgsInfo.input_given)   this->AddInputFilename(mArgsInfo.input_arg);
58   if (mArgsInfo.output_given)  this->SetOutputFilename(mArgsInfo.output_arg);
59 }
60 //--------------------------------------------------------------------
61
62
63 //--------------------------------------------------------------------
64 // Update with the number of dimensions and the pixeltype
65 //--------------------------------------------------------------------
66 template<class ArgsInfoType>
67 template<class ImageType>
68 void clitk::RegionGrowingGenericFilter<ArgsInfoType>::UpdateWithInputImageType() 
69
70   DD("UpdateWithInputImageType");
71   const int Dimension = ImageType::ImageDimension;
72
73   // ImageTypes
74   typedef ImageType InputImageType;
75   typedef ImageType OutputImageType;
76   typedef typename ImageType::PixelType PixelType;
77     
78   // Reading input
79   typename ImageType::Pointer input = this->template GetInput<ImageType>(0);
80
81   // Seed
82   typedef typename  std::vector<typename InputImageType::IndexType> SeedsType;
83   SeedsType seeds(1);
84   if (mArgsInfo.seed_given==Dimension)
85     for (unsigned int i=0; i<Dimension;i++)
86       seeds[0][i]=mArgsInfo.seed_arg[i];
87     
88   else if ( mArgsInfo.seed_given==1)
89     seeds[0].Fill(mArgsInfo.seed_arg[0]);
90     
91   else seeds[0].Fill(mArgsInfo.seed_arg[0]);
92   if (mArgsInfo.verbose_flag) std::cout<<"Setting seed seeds to "<<seeds[0]<<"..."<<std::endl;
93
94   if (mArgsInfo.seedRadius_given)
95     {
96       typedef itk::BinaryBallStructuringElement<PixelType, Dimension> BallType;
97       typename BallType::RadiusType r;
98
99       if (mArgsInfo.seedRadius_given == Dimension)
100         for (unsigned i = 0; i < Dimension; i++)
101           r[i] = mArgsInfo.seedRadius_arg[i];
102       else
103         r.Fill(mArgsInfo.seedRadius_arg[0]);
104
105       BallType ball;
106       ball.SetRadius(r);
107       ball.CreateStructuringElement();
108
109       typedef itk::ConstShapedNeighborhoodIterator<InputImageType> IteratorType;
110       IteratorType it(ball.GetRadius(),
111                       input,
112                       input->GetLargestPossibleRegion());
113       it.CreateActiveListFromNeighborhood(ball);
114       it.NeedToUseBoundaryConditionOff();
115
116       it.SetLocation(seeds[0]);
117       for (typename IteratorType::ConstIterator i = it.Begin(); !i.IsAtEnd(); ++i)
118         {
119           typename InputImageType::IndexType id = seeds[0] + i.GetNeighborhoodOffset();
120           if (id != seeds[0] && input->GetLargestPossibleRegion().IsInside(id))
121             seeds.push_back(id);
122         }
123     }
124
125   // Filter
126   typedef itk::ImageToImageFilter<InputImageType, OutputImageType> ImageToImageFilterType;
127   typename ImageToImageFilterType::Pointer filter;
128
129   switch (mArgsInfo.type_arg)
130     {
131     case 0: {
132                 
133       typedef itk::ConnectedThresholdImageFilter<InputImageType, OutputImageType> ImageFilterType;
134       typename ImageFilterType::Pointer f= ImageFilterType::New();
135         
136       f->SetLower(mArgsInfo.lower_arg);
137       f->SetUpper(mArgsInfo.upper_arg);
138       f->SetReplaceValue(static_cast<PixelType>(mArgsInfo.pad_arg));
139       for (typename SeedsType::const_iterator it = seeds.begin(); it != seeds.end(); ++it)
140         f->AddSeed(*it);
141       filter=f;
142       if (mArgsInfo.verbose_flag) std::cout<<"Using the connected threshold image filter..."<<std::endl;
143
144       break;
145     }
146
147     case 1: {
148                 
149       typedef itk::NeighborhoodConnectedImageFilter<InputImageType, OutputImageType> ImageFilterType;
150       typename ImageFilterType::Pointer f= ImageFilterType::New();
151         
152       // Radius
153       typename  InputImageType::SizeType size;
154       if (mArgsInfo.radius_given==Dimension)
155         for (unsigned int i=0; i<Dimension;i++)
156           size[i]=mArgsInfo.radius_arg[i];
157         
158       else if ( mArgsInfo.radius_given==1)
159         size.Fill(mArgsInfo.radius_arg[0]);
160         
161       else size.Fill(mArgsInfo.radius_arg[0]);
162       if (mArgsInfo.verbose_flag) std::cout<<"Setting neighborhood radius to "<<size<<"..."<<std::endl;
163
164       f->SetLower(mArgsInfo.lower_arg);
165       f->SetUpper(mArgsInfo.upper_arg);
166       f->SetReplaceValue(static_cast<PixelType>(mArgsInfo.pad_arg));
167       for (typename SeedsType::const_iterator it = seeds.begin(); it != seeds.end(); ++it)
168         f->AddSeed(*it);
169       f->SetRadius(size);
170       filter=f;
171       if (mArgsInfo.verbose_flag) std::cout<<"Using the neighborhood threshold connected image filter..."<<std::endl;
172
173       break;
174     }
175
176     case 2: {
177         
178       typedef itk::ConfidenceConnectedImageFilter<InputImageType, OutputImageType> ImageFilterType;
179       typename ImageFilterType::Pointer f= ImageFilterType::New();
180         
181       // Radius
182       typename  InputImageType::SizeType size;
183       if (mArgsInfo.radius_given==Dimension)
184         for (unsigned int i=0; i<Dimension;i++)
185           size[i]=mArgsInfo.radius_arg[i];
186         
187       else if ( mArgsInfo.radius_given==1)
188         size.Fill(mArgsInfo.radius_arg[0]);
189         
190       else size.Fill(mArgsInfo.radius_arg[0]);
191       if (mArgsInfo.verbose_flag) std::cout<<"Setting neighborhood radius to "<<size<<"..."<<std::endl;
192
193       f->SetMultiplier( mArgsInfo.multiplier_arg );
194       f->SetNumberOfIterations( mArgsInfo.multiplier_arg );
195       for (typename SeedsType::const_iterator it = seeds.begin(); it != seeds.end(); ++it)
196         f->AddSeed(*it);
197       f->SetNumberOfIterations( mArgsInfo.iter_arg);
198       f->SetReplaceValue(static_cast<PixelType>(mArgsInfo.pad_arg));
199       f->SetInitialNeighborhoodRadius(size[0]);
200       filter=f;
201       if (mArgsInfo.verbose_flag) std::cout<<"Using the confidence threshold connected image filter..."<<std::endl;
202         
203       break;
204     }
205
206     case 3: {
207                 
208       typedef clitk::LocallyAdaptiveThresholdConnectedImageFilter<InputImageType, OutputImageType> ImageFilterType;
209       typename ImageFilterType::Pointer f= ImageFilterType::New();
210         
211       // Radius
212       typename  InputImageType::SizeType size;
213       if (mArgsInfo.radius_given==Dimension)
214         for (unsigned int i=0; i<Dimension;i++)
215           size[i]=mArgsInfo.radius_arg[i];
216       else size.Fill(mArgsInfo.radius_arg[0]);
217       if (mArgsInfo.verbose_flag) std::cout<<"Setting neighborhood radius to "<<size<<"..."<<std::endl;
218
219       // params
220       f->SetLower(mArgsInfo.lower_arg);
221       f->SetUpper(mArgsInfo.upper_arg);
222       f->SetLowerBorderIsGiven(mArgsInfo.adaptLower_flag);
223       f->SetLowerBorderIsGiven(mArgsInfo.adaptUpper_flag);
224       f->SetReplaceValue(static_cast<PixelType>(mArgsInfo.pad_arg));
225       f->SetMultiplier(mArgsInfo.multiplier_arg);
226       f->SetMaximumSDIsGiven(mArgsInfo.maxSD_given);
227       if (mArgsInfo.maxSD_given) f->SetMaximumSD(mArgsInfo.maxSD_arg);
228       for (typename SeedsType::const_iterator it = seeds.begin(); it != seeds.end(); ++it)
229         f->AddSeed(*it);
230       f->SetRadius(size);
231       filter=f;
232       if (mArgsInfo.verbose_flag) std::cout<<"Using the locally adaptive threshold connected image filter..."<<std::endl;
233
234       break;
235     }
236   
237     case 4: {
238                 
239       typedef clitk::ExplosionControlledThresholdConnectedImageFilter<InputImageType, OutputImageType> ImageFilterType;
240       typename ImageFilterType::Pointer f= ImageFilterType::New();
241         
242       //        // Radius
243       //        typename  InputImageType::SizeType size;
244       //        if (mArgsInfo.radius_given==Dimension)
245       //          for (unsigned int i=0; i<Dimension;i++)
246       //            size[i]=mArgsInfo.radius_arg[i];
247       //        else size.Fill(mArgsInfo.radius_arg[0]);
248       //        if (mArgsInfo.verbose_flag) std::cout<<"Setting neighborhood radius to "<<size<<"..."<<std::endl;
249         
250       // params
251       f->SetVerbose(mArgsInfo.verbose_flag);
252       f->SetLower(mArgsInfo.lower_arg);
253       f->SetUpper(mArgsInfo.upper_arg);
254       f->SetMinimumLowerThreshold(mArgsInfo.minLower_arg);
255       f->SetMaximumUpperThreshold(mArgsInfo.maxUpper_arg);
256       f->SetAdaptLowerBorder(mArgsInfo.adaptLower_flag);
257       f->SetAdaptUpperBorder(mArgsInfo.adaptUpper_flag);
258       f->SetReplaceValue(static_cast<PixelType>(mArgsInfo.pad_arg));
259       f->SetMultiplier(mArgsInfo.multiplier_arg);
260       f->SetThresholdStepSize(mArgsInfo.step_arg);
261       f->SetMinimumThresholdStepSize(mArgsInfo.minStep_arg);
262       f->SetFullyConnected(mArgsInfo.full_flag);
263       for (typename SeedsType::const_iterator it = seeds.begin(); it != seeds.end(); ++it)
264         f->AddSeed(*it);
265       filter=f;
266       if (mArgsInfo.verbose_flag) std::cout<<"Using the explosion controlled threshold connected image filter..."<<std::endl;
267
268       break;
269     }
270   
271     }
272
273
274   filter->SetInput(input);
275   filter->Update();
276   typename OutputImageType::Pointer output=filter->GetOutput();
277
278   // Write/Save results
279   this->template SetNextOutput<OutputImageType>(output); 
280 }
281 //--------------------------------------------------------------------
282
283  
284 #endif //#define CLITKREGIONGROWINGGENERICFILTER_TXX