]> Creatis software - clitk.git/blob - tools/clitkSplitImageGenericFilter.cxx
5a5e246e8c6eb81d11bf3d872c1cf3ba64ff94cb
[clitk.git] / tools / clitkSplitImageGenericFilter.cxx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to:
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
8
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.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ===========================================================================**/
18 /**
19  -------------------------------------------------------------------
20  * @file   clitkSplitImageGenericFilter.cxx
21  * @author Joël Schaerer
22  * @date   20 April 2009
23
24  * @brief
25  -------------------------------------------------------------------*/
26
27 #include "clitkSplitImageGenericFilter.h"
28 #include <itkIntensityWindowingImageFilter.h>
29 //--------------------------------------------------------------------
30 clitk::SplitImageGenericFilter::SplitImageGenericFilter():
31   clitk::ImageToImageGenericFilter<Self>("SplitImage")
32 {
33   mSplitDimension = 0;
34   InitializeImageType<3>();
35   InitializeImageType<4>();
36 }
37 //--------------------------------------------------------------------
38
39
40 //--------------------------------------------------------------------
41 template<unsigned int Dim>
42 void clitk::SplitImageGenericFilter::InitializeImageType()
43 {
44   ADD_DEFAULT_IMAGE_TYPES(Dim);
45   //ADD_VEC_IMAGE_TYPE(Dim, 3,float);
46 }
47 //--------------------------------------------------------------------
48
49 //--------------------------------------------------------------------
50 template<class ImageType>
51 void clitk::SplitImageGenericFilter::UpdateWithInputImageType()
52 {
53
54   // Read input
55   typedef typename ImageType::PixelType PixelType;
56   typedef itk::Image<PixelType,ImageType::ImageDimension-1> OutputImageType;
57   typename ImageType::Pointer input = this->GetInput<ImageType>(0);
58   typedef itk::ExtractImageFilter<ImageType,OutputImageType> FilterType;
59   typename FilterType::Pointer filter= FilterType::New();
60
61   filter->SetInput(input);
62   typename ImageType::SizeType size=input->GetLargestPossibleRegion().GetSize();
63   size[mSplitDimension]=0;
64   typename ImageType::RegionType extracted_region;
65   extracted_region.SetSize(size);
66 #if ITK_VERSION_MAJOR >= 4
67   filter->SetDirectionCollapseToSubmatrix();
68 #endif
69   filter->SetExtractionRegion(extracted_region);
70   filter->Update();
71
72   typename ImageType::IndexType index=input->GetLargestPossibleRegion().GetIndex();
73   std::string base_filename=GetOutputFilename();
74   unsigned int number_of_output_images=input->GetLargestPossibleRegion().GetSize()[mSplitDimension];
75   for (unsigned int i=0; i<number_of_output_images; i++) {
76     std::ostringstream ss;
77     ss << std::setfill('0') << std::setw((int)(log10(double(number_of_output_images))+1)) << i;
78     index[mSplitDimension]=i;
79     extracted_region.SetIndex(index);
80     filter->SetExtractionRegion(extracted_region);
81     filter->Update();
82     if(this->m_Png){
83       typedef itk::Image< unsigned char, ImageType::ImageDimension-1 > OutputPngImageType;
84       typedef itk::IntensityWindowingImageFilter< OutputImageType, OutputPngImageType > CastFilterType;
85       typename CastFilterType::Pointer cast = CastFilterType::New();
86       cast->SetWindowLevel(this->m_Window, this->m_Level);
87       cast->SetInput(filter->GetOutput());
88       SetOutputFilename(base_filename+"_"+ss.str()+".png");
89       SetNextOutput<OutputPngImageType>(cast->GetOutput());
90     }
91     else {
92       SetOutputFilename(base_filename+"_"+ss.str()+".mhd");
93       SetNextOutput<OutputImageType>(filter->GetOutput());
94     }
95   }
96 }
97 //--------------------------------------------------------------------