1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
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
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.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ===========================================================================**/
18 #ifndef clitkRegionGrowingGenericFilter_txx
19 #define clitkRegionGrowingGenericFilter_txx
20 #include <itkBinaryBallStructuringElement.h>
21 #include <itkConstShapedNeighborhoodIterator.h>
26 //-------------------------------------------------------------------
27 // Update with the number of dimensions
28 //-------------------------------------------------------------------
29 template<unsigned int Dimension>
31 RegionGrowingGenericFilter::UpdateWithDim(std::string PixelType)
33 if (m_Verbose) std::cout << "Image was detected to be "<<Dimension<<"D and "<< PixelType<<"..."<<std::endl;
35 if(PixelType == "short"){
36 if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and signed short..." << std::endl;
37 UpdateWithDimAndPixelType<Dimension, signed short>();
39 // else if(PixelType == "unsigned_short"){
40 // if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and unsigned_short..." << std::endl;
41 // UpdateWithDimAndPixelType<Dimension, unsigned short>();
44 else if (PixelType == "unsigned_char"){
45 if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and unsigned_char..." << std::endl;
46 UpdateWithDimAndPixelType<Dimension, unsigned char>();
49 // else if (PixelType == "char"){
50 // if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and signed_char..." << std::endl;
51 // UpdateWithDimAndPixelType<Dimension, signed char>();
54 if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and float..." << std::endl;
55 UpdateWithDimAndPixelType<Dimension, float>();
60 //-------------------------------------------------------------------
61 // Update with the number of dimensions and the pixeltype
62 //-------------------------------------------------------------------
63 template <unsigned int Dimension, class PixelType>
65 RegionGrowingGenericFilter::UpdateWithDimAndPixelType()
69 typedef itk::Image<PixelType, Dimension> InputImageType;
70 typedef itk::Image<PixelType, Dimension> OutputImageType;
73 typedef itk::ImageFileReader<InputImageType> InputReaderType;
74 typename InputReaderType::Pointer reader = InputReaderType::New();
75 reader->SetFileName( m_InputFileName);
77 typename InputImageType::Pointer input= reader->GetOutput();
80 typedef typename std::vector<typename InputImageType::IndexType> SeedsType;
82 if(m_ArgsInfo.seed_given==Dimension)
83 for (unsigned int i=0; i<Dimension;i++)
84 seeds[0][i]=m_ArgsInfo.seed_arg[i];
86 else if ( m_ArgsInfo.seed_given==1)
87 seeds[0].Fill(m_ArgsInfo.seed_arg[0]);
89 else seeds[0].Fill(m_ArgsInfo.seed_arg[0]);
90 if(m_Verbose)std::cout<<"Setting seed seeds to "<<seeds[0]<<"..."<<std::endl;
92 if (m_ArgsInfo.seedRadius_given)
94 typedef itk::BinaryBallStructuringElement<PixelType, Dimension> BallType;
95 typename BallType::RadiusType r;
97 if (m_ArgsInfo.seedRadius_given == Dimension)
98 for (unsigned i = 0; i < Dimension; i++)
99 r[i] = m_ArgsInfo.seedRadius_arg[i];
101 r.Fill(m_ArgsInfo.seedRadius_arg[0]);
105 ball.CreateStructuringElement();
107 typedef itk::ConstShapedNeighborhoodIterator<InputImageType> IteratorType;
108 IteratorType it(ball.GetRadius(),
110 input->GetLargestPossibleRegion());
111 #if ITK_VERSION_MAJOR < 4
112 typename BallType::ConstIterator nit;
114 for (nit = ball.Begin(); nit != ball.End(); ++nit, ++idx)
118 it.ActivateOffset(it.GetOffset(idx));
122 it.DeactivateOffset(it.GetOffset(idx));
126 it.CreateActiveListFromNeighborhood(ball);
127 it.NeedToUseBoundaryConditionOff();
130 it.SetLocation(seeds[0]);
131 for (typename IteratorType::ConstIterator i = it.Begin(); !i.IsAtEnd(); ++i)
133 typename InputImageType::IndexType id = seeds[0] + i.GetNeighborhoodOffset();
134 if (id != seeds[0] && input->GetLargestPossibleRegion().IsInside(id))
140 typedef itk::ImageToImageFilter<InputImageType, OutputImageType> ImageToImageFilterType;
141 typename ImageToImageFilterType::Pointer filter;
143 switch (m_ArgsInfo.type_arg)
147 typedef itk::ConnectedThresholdImageFilter<InputImageType, OutputImageType> ImageFilterType;
148 typename ImageFilterType::Pointer f= ImageFilterType::New();
150 f->SetLower(m_ArgsInfo.lower_arg);
151 f->SetUpper(m_ArgsInfo.upper_arg);
152 f->SetReplaceValue(static_cast<PixelType>(m_ArgsInfo.pad_arg));
153 for (typename SeedsType::const_iterator it = seeds.begin(); it != seeds.end(); ++it)
156 if(m_Verbose)std::cout<<"Using the connected threshold image filter..."<<std::endl;
163 typedef itk::NeighborhoodConnectedImageFilter<InputImageType, OutputImageType> ImageFilterType;
164 typename ImageFilterType::Pointer f= ImageFilterType::New();
167 typename InputImageType::SizeType size;
168 if(m_ArgsInfo.radius_given==Dimension)
169 for (unsigned int i=0; i<Dimension;i++)
170 size[i]=m_ArgsInfo.radius_arg[i];
172 else if ( m_ArgsInfo.radius_given==1)
173 size.Fill(m_ArgsInfo.radius_arg[0]);
175 else size.Fill(m_ArgsInfo.radius_arg[0]);
176 if(m_Verbose)std::cout<<"Setting neighborhood radius to "<<size<<"..."<<std::endl;
178 f->SetLower(m_ArgsInfo.lower_arg);
179 f->SetUpper(m_ArgsInfo.upper_arg);
180 f->SetReplaceValue(static_cast<PixelType>(m_ArgsInfo.pad_arg));
181 for (typename SeedsType::const_iterator it = seeds.begin(); it != seeds.end(); ++it)
185 if(m_Verbose)std::cout<<"Using the neighborhood threshold connected image filter..."<<std::endl;
192 typedef itk::ConfidenceConnectedImageFilter<InputImageType, OutputImageType> ImageFilterType;
193 typename ImageFilterType::Pointer f= ImageFilterType::New();
196 typename InputImageType::SizeType size;
197 if(m_ArgsInfo.radius_given==Dimension)
198 for (unsigned int i=0; i<Dimension;i++)
199 size[i]=m_ArgsInfo.radius_arg[i];
201 else if ( m_ArgsInfo.radius_given==1)
202 size.Fill(m_ArgsInfo.radius_arg[0]);
204 else size.Fill(m_ArgsInfo.radius_arg[0]);
205 if(m_Verbose)std::cout<<"Setting neighborhood radius to "<<size<<"..."<<std::endl;
207 f->SetMultiplier( m_ArgsInfo.multiplier_arg );
208 f->SetNumberOfIterations( m_ArgsInfo.multiplier_arg );
209 for (typename SeedsType::const_iterator it = seeds.begin(); it != seeds.end(); ++it)
211 f->SetNumberOfIterations( m_ArgsInfo.iter_arg);
212 f->SetReplaceValue(static_cast<PixelType>(m_ArgsInfo.pad_arg));
213 f->SetInitialNeighborhoodRadius(size[0]);
215 if(m_Verbose)std::cout<<"Using the confidence threshold connected image filter..."<<std::endl;
222 typedef clitk::LocallyAdaptiveThresholdConnectedImageFilter<InputImageType, OutputImageType> ImageFilterType;
223 typename ImageFilterType::Pointer f= ImageFilterType::New();
226 typename InputImageType::SizeType size;
227 if(m_ArgsInfo.radius_given==Dimension)
228 for (unsigned int i=0; i<Dimension;i++)
229 size[i]=m_ArgsInfo.radius_arg[i];
230 else size.Fill(m_ArgsInfo.radius_arg[0]);
231 if(m_Verbose)std::cout<<"Setting neighborhood radius to "<<size<<"..."<<std::endl;
234 f->SetLower(m_ArgsInfo.lower_arg);
235 f->SetUpper(m_ArgsInfo.upper_arg);
236 f->SetLowerBorderIsGiven(m_ArgsInfo.adaptLower_flag);
237 f->SetLowerBorderIsGiven(m_ArgsInfo.adaptUpper_flag);
238 f->SetReplaceValue(static_cast<PixelType>(m_ArgsInfo.pad_arg));
239 f->SetMultiplier(m_ArgsInfo.multiplier_arg);
240 f->SetMaximumSDIsGiven(m_ArgsInfo.maxSD_given);
241 if (m_ArgsInfo.maxSD_given) f->SetMaximumSD(m_ArgsInfo.maxSD_arg);
242 for (typename SeedsType::const_iterator it = seeds.begin(); it != seeds.end(); ++it)
246 if(m_Verbose)std::cout<<"Using the locally adaptive threshold connected image filter..."<<std::endl;
253 typedef clitk::ExplosionControlledThresholdConnectedImageFilter<InputImageType, OutputImageType> ImageFilterType;
254 typename ImageFilterType::Pointer f= ImageFilterType::New();
257 // typename InputImageType::SizeType size;
258 // if(m_ArgsInfo.radius_given==Dimension)
259 // for (unsigned int i=0; i<Dimension;i++)
260 // size[i]=m_ArgsInfo.radius_arg[i];
261 // else size.Fill(m_ArgsInfo.radius_arg[0]);
262 // if(m_Verbose)std::cout<<"Setting neighborhood radius to "<<size<<"..."<<std::endl;
265 f->SetVerbose(m_ArgsInfo.verbose_flag);
266 f->SetLower(m_ArgsInfo.lower_arg);
267 f->SetUpper(m_ArgsInfo.upper_arg);
268 f->SetMinimumLowerThreshold(m_ArgsInfo.minLower_arg);
269 f->SetMaximumUpperThreshold(m_ArgsInfo.maxUpper_arg);
270 f->SetAdaptLowerBorder(m_ArgsInfo.adaptLower_flag);
271 f->SetAdaptUpperBorder(m_ArgsInfo.adaptUpper_flag);
272 f->SetReplaceValue(static_cast<PixelType>(m_ArgsInfo.pad_arg));
273 f->SetMultiplier(m_ArgsInfo.multiplier_arg);
274 f->SetThresholdStepSize(m_ArgsInfo.step_arg);
275 f->SetMinimumThresholdStepSize(m_ArgsInfo.minStep_arg);
276 f->SetFullyConnected(m_ArgsInfo.full_flag);
277 for (typename SeedsType::const_iterator it = seeds.begin(); it != seeds.end(); ++it)
280 if(m_Verbose)std::cout<<"Using the explosion controlled threshold connected image filter..."<<std::endl;
288 filter->SetInput(input);
290 typename OutputImageType::Pointer output=filter->GetOutput();
293 typedef itk::ImageFileWriter<OutputImageType> WriterType;
294 typename WriterType::Pointer writer = WriterType::New();
295 writer->SetFileName(m_ArgsInfo.output_arg);
296 writer->SetInput(output);
302 #endif //#define clitkRegionGrowingGenericFilter_txx