#include "clitkImageFillRegionGenericFilter.h"
//--------------------------------------------------------------------
-clitk::ImageFillRegionGenericFilter::ImageFillRegionGenericFilter() {
+clitk::ImageFillRegionGenericFilter::ImageFillRegionGenericFilter():
+ clitk::ImageToImageGenericFilter<Self>("ImageFillRegion") {
+ InitializeImageType<2>();
+ InitializeImageType<3>();
mPixelValue = 0;
m_IsCentered=false;
- mSphericRegion=false;
+ mSphericRegion=false;
}
//--------------------------------------------------------------------
+//--------------------------------------------------------------------
+template<unsigned int Dim>
+void clitk::ImageFillRegionGenericFilter::InitializeImageType() {
+ // ADD_IMAGE_TYPE(Dim, char);
+ ADD_IMAGE_TYPE(Dim, short);
+ // ADD_IMAGE_TYPE(Dim, unsigned short);
+// ADD_IMAGE_TYPE(Dim, int);
+ ADD_IMAGE_TYPE(Dim, float);
+ // ADD_IMAGE_TYPE(Dim, double);
+}
+//--------------------------------------------------------------------
+
+
+
+//--------------------------------------------------------------------
+template<class ImageType>
+void clitk::ImageFillRegionGenericFilter::UpdateWithInputImageType() {
+
+ // Typedef
+ typedef typename ImageType::PixelType PixelType;
+ static unsigned int Dim = ImageType::ImageDimension;
+
+ // Spheric region
+ if (mSphericRegion) return Update_WithDimAndPixelType_SphericRegion<ImageType::ImageDimension,PixelType>();
+
+ // Read input
+ typename ImageType::Pointer input = GetInput<ImageType>(0);
+
+ // Get pixel value in correct type
+ PixelType value = PixelTypeDownCast<double, PixelType>(mPixelValue);
+
+ // Get region
+ typedef typename ImageType::RegionType RegionType;
+ typedef typename ImageType::SizeType SizeType;
+ typedef typename ImageType::IndexType IndexType;
+ RegionType region;
+ SizeType size;
+ IndexType start;
+ for(unsigned int i=0; i<Dim; i++) {
+ size[i] = mSize[i];
+ start[i] = mStart[i];
+ }
+ region.SetSize(size);
+ region.SetIndex(start);
+
+ // Build iterator
+ typedef itk::ImageRegionIterator<ImageType> IteratorType;
+ IteratorType it(input, region);
+ it.GoToBegin();
+ while (!it.IsAtEnd()) {
+ it.Set(value);
+ ++it;
+ }
+
+ // Write results
+ SetNextOutput<ImageType>(input);
+}
+//--------------------------------------------------------------------
+
+//--------------------------------------------------------------------
+template<unsigned int Dim, class PixelType>
+void clitk::ImageFillRegionGenericFilter::Update_WithDimAndPixelType_SphericRegion() {
+
+ // Read input
+ typedef itk::Image<PixelType,Dim> ImageType;
+ //typename ImageType::Pointer input = clitk::readImage<ImageType>(mInputFilenames[0], mIOVerbose);
+ typename ImageType::Pointer input = GetInput<ImageType>(0);
+
+ // Get pixel value in correct type
+ PixelType value = PixelTypeDownCast<double, PixelType>(mPixelValue);
+
+ // Centered?
+ if(m_IsCentered)
+ {
+ typename ImageType::SizeType size= input->GetLargestPossibleRegion().GetSize();
+ typename ImageType::SpacingType spacing= input->GetSpacing();
+ typename ImageType::PointType origin= input->GetOrigin();
+ mCenter.resize(Dim);
+ for (unsigned int i=0; i<Dim; i++)
+ mCenter[i]=origin[i]+(double)size[i]/2*spacing[i];
+ }
+
+ // Build iterator
+ typedef itk::ImageRegionIteratorWithIndex<ImageType> IteratorType;
+ IteratorType it(input, input->GetLargestPossibleRegion());
+ it.GoToBegin();
+
+ typename ImageType::PointType point;
+ //typename itk::Vector<double, Dim> distance;
+ typename ImageType::IndexType index;
+ //bool inside;
+ double distance;
+
+ while (!it.IsAtEnd())
+ {
+ // inside=true;
+ index=it.GetIndex();
+ input->TransformIndexToPhysicalPoint(index, point);
+ distance=0.0;
+ for(unsigned int i=0; i<Dim; i++)
+ distance+=powf( ( (mCenter[i]-point[i])/mRadius[i] ), 2);
+
+ // inside= ( (fabs(distance[i])<fabs(mRadius[i])) && inside );
+ // distance[i]=mCenter[i]-point[i];
+ // inside= ( (fabs(distance[i])<fabs(mRadius[i])) && inside );
+ // }
+
+ if (distance<1)
+ it.Set(value);
+ ++it;
+ }
+
+ // Write results
+ SetNextOutput<ImageType>(input);
+}
+
+//--------------------------------------------------------------------
+
+
+
//--------------------------------------------------------------------
void clitk::ImageFillRegionGenericFilter::SetSphericRegion(std::vector<double> & radius,
std::vector<double> & center)
//--------------------------------------------------------------------
-//--------------------------------------------------------------------
-void clitk::ImageFillRegionGenericFilter::Update () {
-
- // Load image header
- itk::ImageIOBase::Pointer header = clitk::readImageHeader(mInputFilenames[0]);
-
- // Determine dim, pixel type, number of components
- mDim = header->GetNumberOfDimensions();
- mPixelTypeName = header->GetComponentTypeAsString(header->GetComponentType());
- mNbOfComponents = header->GetNumberOfComponents();
-
- // Switch by dimension
- if (mDim == 2) { Update_WithDim<2>(); return; }
- if (mDim == 3) { Update_WithDim<3>(); return; }
- // if (mDim == 4) { Update_WithDim<4>(); return; }
-
- std::cerr << "Error, dimension of input image is " << mDim << ", but I only work with 2,3,4." << std::endl;
- exit(0);
-}
-//--------------------------------------------------------------------
-
#endif //define CLITKIMAGEFILLREGIONGENERICFILTER_CXX