]> Creatis software - clitk.git/blob - filters/clitkImageFillRegionGenericFilter.cxx
removed headers
[clitk.git] / filters / clitkImageFillRegionGenericFilter.cxx
1 #ifndef CLITKIMAGEFILLREGIONGENERICFILTER_CXX
2 #define CLITKIMAGEFILLREGIONGENERICFILTER_CXX
3 /**
4  -------------------------------------------------------------------
5  * @file   clitkImageFillRegionGenericFilter.cxx
6  * @author David Sarrut <David.Sarrut@creatis.insa-lyon.fr>
7  * @date   23 Feb 2008
8
9  * @brief  
10  -------------------------------------------------------------------*/
11
12 #include "clitkImageFillRegionGenericFilter.h"
13
14 //--------------------------------------------------------------------
15 clitk::ImageFillRegionGenericFilter::ImageFillRegionGenericFilter():
16   clitk::ImageToImageGenericFilter<Self>("ImageFillRegion") {
17   InitializeImageType<2>();
18   InitializeImageType<3>();   
19   mPixelValue = 0;
20   m_IsCentered=false;
21   mSphericRegion=false;  
22 }
23 //--------------------------------------------------------------------
24
25
26 //--------------------------------------------------------------------
27 template<unsigned int Dim>
28 void clitk::ImageFillRegionGenericFilter::InitializeImageType() {      
29   // ADD_IMAGE_TYPE(Dim, char);
30   ADD_IMAGE_TYPE(Dim, short);
31   // ADD_IMAGE_TYPE(Dim, unsigned short);
32 //   ADD_IMAGE_TYPE(Dim, int);
33   ADD_IMAGE_TYPE(Dim, float);
34   // ADD_IMAGE_TYPE(Dim, double);
35 }
36 //--------------------------------------------------------------------
37
38
39
40 //--------------------------------------------------------------------
41 template<class ImageType>
42 void clitk::ImageFillRegionGenericFilter::UpdateWithInputImageType() {
43
44   // Typedef
45   typedef typename ImageType::PixelType PixelType;
46   static unsigned int Dim = ImageType::ImageDimension;
47
48   // Spheric region
49   if (mSphericRegion) return Update_WithDimAndPixelType_SphericRegion<ImageType::ImageDimension,PixelType>();
50
51   // Read input
52   typename ImageType::Pointer input = GetInput<ImageType>(0);
53
54   // Get pixel value in correct type
55   PixelType value = PixelTypeDownCast<double, PixelType>(mPixelValue); 
56
57   // Get region
58   typedef typename ImageType::RegionType RegionType;
59   typedef typename ImageType::SizeType SizeType;
60   typedef typename ImageType::IndexType IndexType;
61   RegionType region;
62   SizeType size;
63   IndexType start;
64   for(unsigned int i=0; i<Dim; i++) {
65     size[i] = mSize[i];
66     start[i] = mStart[i];
67   }
68   region.SetSize(size);
69   region.SetIndex(start);
70
71   // Build iterator
72   typedef itk::ImageRegionIterator<ImageType> IteratorType;
73   IteratorType it(input, region);
74   it.GoToBegin();
75   while (!it.IsAtEnd()) {
76     it.Set(value);
77     ++it;
78   }
79
80   // Write results
81   SetNextOutput<ImageType>(input);
82 }
83 //--------------------------------------------------------------------
84
85 //--------------------------------------------------------------------
86 template<unsigned int Dim, class PixelType>
87 void clitk::ImageFillRegionGenericFilter::Update_WithDimAndPixelType_SphericRegion() {
88
89   // Read input
90   typedef itk::Image<PixelType,Dim> ImageType;
91   //typename ImageType::Pointer input = clitk::readImage<ImageType>(mInputFilenames[0], mIOVerbose);
92   typename ImageType::Pointer input = GetInput<ImageType>(0);
93
94   // Get pixel value in correct type
95   PixelType value = PixelTypeDownCast<double, PixelType>(mPixelValue); 
96
97   // Centered?
98   if(m_IsCentered)
99     {
100       typename ImageType::SizeType size= input->GetLargestPossibleRegion().GetSize();
101       typename ImageType::SpacingType spacing= input->GetSpacing();
102       typename ImageType::PointType origin= input->GetOrigin();
103       mCenter.resize(Dim);
104       for (unsigned int i=0; i<Dim; i++)
105         mCenter[i]=origin[i]+(double)size[i]/2*spacing[i];
106     }
107
108   // Build iterator
109   typedef itk::ImageRegionIteratorWithIndex<ImageType> IteratorType;
110   IteratorType it(input, input->GetLargestPossibleRegion());
111   it.GoToBegin();
112
113   typename ImageType::PointType point; 
114   //typename itk::Vector<double, Dim> distance; 
115   typename ImageType::IndexType index;
116   //bool inside;
117   double distance;
118   
119   while (!it.IsAtEnd())
120     {    
121       //      inside=true;
122       index=it.GetIndex();
123       input->TransformIndexToPhysicalPoint(index, point);
124       distance=0.0;      
125       for(unsigned int i=0; i<Dim; i++)
126         distance+=powf( ( (mCenter[i]-point[i])/mRadius[i] ), 2);
127         
128       //  inside= ( (fabs(distance[i])<fabs(mRadius[i])) && inside );
129       //          distance[i]=mCenter[i]-point[i];
130       //          inside= ( (fabs(distance[i])<fabs(mRadius[i])) && inside );
131       //        }
132       
133       if (distance<1)
134         it.Set(value);
135       ++it;
136     }
137
138   // Write results
139   SetNextOutput<ImageType>(input);
140 }
141
142 //--------------------------------------------------------------------
143
144
145
146 //--------------------------------------------------------------------
147 void clitk::ImageFillRegionGenericFilter::SetSphericRegion(std::vector<double> &  radius, 
148                                                            std::vector<double> & center) 
149 {
150   mRadius.clear(); 
151   mRadius.resize(radius.size());
152   std::copy(radius.begin(), radius.end(), mRadius.begin());
153   mCenter.clear();
154   mCenter.resize(center.size());
155   std::copy(center.begin(), center.end(), mCenter.begin());
156   mSphericRegion = true;
157   m_IsCentered=false;
158 }
159
160 void clitk::ImageFillRegionGenericFilter::SetSphericRegion(std::vector<double> & radius) {
161   mRadius.clear(); 
162   mRadius.resize(radius.size());
163   std::copy(radius.begin(), radius.end(), mRadius.begin());
164   m_IsCentered=true;
165   mSphericRegion = true;
166 }
167 //--------------------------------------------------------------------
168
169
170 #endif //define CLITKIMAGEFILLREGIONGENERICFILTER_CXX