]> Creatis software - clitk.git/blobdiff - filters/clitkSplitImageGenericFilter.cxx
mechanism for hiding experimental stuff in vv
[clitk.git] / filters / clitkSplitImageGenericFilter.cxx
index bb46dd971206a7324235a524e6126eddffa1ba9f..9dbfd70582eabdadc4ed3d06f18f70b22c625711 100644 (file)
 
 #include "clitkSplitImageGenericFilter.txx"
 //--------------------------------------------------------------------
-clitk::SplitImageGenericFilter::SplitImageGenericFilter() {
+clitk::SplitImageGenericFilter::SplitImageGenericFilter():
+  clitk::ImageToImageGenericFilter<Self>("SplitImage") {
   mSplitDimension = 0;
+  InitializeImageType<3>();
+  InitializeImageType<4>();
+}
+//--------------------------------------------------------------------
+
+
+//--------------------------------------------------------------------
+template<unsigned int Dim>
+void clitk::SplitImageGenericFilter::InitializeImageType() {      
+  ADD_IMAGE_TYPE(Dim, char);
+  ADD_IMAGE_TYPE(Dim, unsigned char);
+  ADD_IMAGE_TYPE(Dim, short);
+  ADD_IMAGE_TYPE(Dim, int);
+  ADD_IMAGE_TYPE(Dim, float);
+  ADD_VEC_IMAGE_TYPE(Dim, 3,float);
 }
 //--------------------------------------------------------------------
 
 //--------------------------------------------------------------------
-void clitk::SplitImageGenericFilter::Update () {
-  
-    // Read the Dimension and PixelType
-    int Dimension, Components;
-    std::string PixelType;
-    ReadImageDimensionAndPixelType(this->mInputFilenames[0], Dimension, PixelType, Components);
-
-    
-    // Call UpdateWithDim
-    if(Dimension==3) UpdateWithDim<3>(PixelType, Components);
-    else if (Dimension==4)UpdateWithDim<4>(PixelType, Components); 
-    else 
-      {
-       std::cout<<"Error, Only for 3 or 4  Dimensions!!!"<<std::endl ;
-       return;
-      }
+template<class ImageType>
+void clitk::SplitImageGenericFilter::UpdateWithInputImageType() {
+
+  // Read input
+  typedef typename ImageType::PixelType PixelType;
+  typedef itk::Image<PixelType,ImageType::ImageDimension-1> OutputImageType;
+  typename ImageType::Pointer input = this->GetInput<ImageType>(0);
+  typedef itk::ExtractImageFilter<ImageType,OutputImageType> FilterType;
+  typename FilterType::Pointer filter= FilterType::New();
+
+  filter->SetInput(input);
+  typename ImageType::SizeType size=input->GetLargestPossibleRegion().GetSize();
+  size[mSplitDimension]=0;
+  typename ImageType::RegionType extracted_region;
+  extracted_region.SetSize(size);
+  filter->SetExtractionRegion(extracted_region);
+  filter->Update();
+
+  typename ImageType::IndexType index=input->GetLargestPossibleRegion().GetIndex();
+  std::string base_filename=GetOutputFilename();
+  unsigned int number_of_output_images=input->GetLargestPossibleRegion().GetSize()[mSplitDimension];
+  for (unsigned int i=0;i<number_of_output_images;i++)
+  {
+      std::ostringstream ss;
+      ss << i;
+      index[mSplitDimension]=i;
+      extracted_region.SetIndex(index);
+      filter->SetExtractionRegion(extracted_region);
+      filter->Update();
+      SetOutputFilename(base_filename+"_"+ss.str()+".mhd");
+      typename OutputImageType::Pointer output=filter->GetOutput();
+      SetNextOutput<OutputImageType>(output);
+  }
 }
 //--------------------------------------------------------------------