1 #ifndef CLITKIMAGEFILLREGIONGENERICFILTER_CXX
2 #define CLITKIMAGEFILLREGIONGENERICFILTER_CXX
4 -------------------------------------------------------------------
5 * @file clitkImageFillRegionGenericFilter.cxx
6 * @author David Sarrut <David.Sarrut@creatis.insa-lyon.fr>
10 -------------------------------------------------------------------*/
12 #include "clitkImageFillRegionGenericFilter.h"
14 //--------------------------------------------------------------------
15 clitk::ImageFillRegionGenericFilter::ImageFillRegionGenericFilter():
16 clitk::ImageToImageGenericFilter<Self>("ImageFillRegion") {
17 InitializeImageType<2>();
18 InitializeImageType<3>();
23 //--------------------------------------------------------------------
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);
36 //--------------------------------------------------------------------
40 //--------------------------------------------------------------------
41 template<class ImageType>
42 void clitk::ImageFillRegionGenericFilter::UpdateWithInputImageType() {
45 typedef typename ImageType::PixelType PixelType;
46 static unsigned int Dim = ImageType::ImageDimension;
49 if (mSphericRegion) return Update_WithDimAndPixelType_SphericRegion<ImageType::ImageDimension,PixelType>();
52 typename ImageType::Pointer input = GetInput<ImageType>(0);
54 // Get pixel value in correct type
55 PixelType value = PixelTypeDownCast<double, PixelType>(mPixelValue);
58 typedef typename ImageType::RegionType RegionType;
59 typedef typename ImageType::SizeType SizeType;
60 typedef typename ImageType::IndexType IndexType;
64 for(unsigned int i=0; i<Dim; i++) {
69 region.SetIndex(start);
72 typedef itk::ImageRegionIterator<ImageType> IteratorType;
73 IteratorType it(input, region);
75 while (!it.IsAtEnd()) {
81 SetNextOutput<ImageType>(input);
83 //--------------------------------------------------------------------
85 //--------------------------------------------------------------------
86 template<unsigned int Dim, class PixelType>
87 void clitk::ImageFillRegionGenericFilter::Update_WithDimAndPixelType_SphericRegion() {
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);
94 // Get pixel value in correct type
95 PixelType value = PixelTypeDownCast<double, PixelType>(mPixelValue);
100 typename ImageType::SizeType size= input->GetLargestPossibleRegion().GetSize();
101 typename ImageType::SpacingType spacing= input->GetSpacing();
102 typename ImageType::PointType origin= input->GetOrigin();
104 for (unsigned int i=0; i<Dim; i++)
105 mCenter[i]=origin[i]+(double)size[i]/2*spacing[i];
109 typedef itk::ImageRegionIteratorWithIndex<ImageType> IteratorType;
110 IteratorType it(input, input->GetLargestPossibleRegion());
113 typename ImageType::PointType point;
114 //typename itk::Vector<double, Dim> distance;
115 typename ImageType::IndexType index;
119 while (!it.IsAtEnd())
123 input->TransformIndexToPhysicalPoint(index, point);
125 for(unsigned int i=0; i<Dim; i++)
126 distance+=powf( ( (mCenter[i]-point[i])/mRadius[i] ), 2);
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 );
139 SetNextOutput<ImageType>(input);
142 //--------------------------------------------------------------------
146 //--------------------------------------------------------------------
147 void clitk::ImageFillRegionGenericFilter::SetSphericRegion(std::vector<double> & radius,
148 std::vector<double> & center)
151 mRadius.resize(radius.size());
152 std::copy(radius.begin(), radius.end(), mRadius.begin());
154 mCenter.resize(center.size());
155 std::copy(center.begin(), center.end(), mCenter.begin());
156 mSphericRegion = true;
160 void clitk::ImageFillRegionGenericFilter::SetSphericRegion(std::vector<double> & radius) {
162 mRadius.resize(radius.size());
163 std::copy(radius.begin(), radius.end(), mRadius.begin());
165 mSphericRegion = true;
167 //--------------------------------------------------------------------
170 #endif //define CLITKIMAGEFILLREGIONGENERICFILTER_CXX