]> Creatis software - clitk.git/blob - tools/clitkSplitImageGenericFilter.cxx
Debug clitkNormalizeImage
[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 "itkChangeInformationImageFilter.h"
29 #include <itkIntensityWindowingImageFilter.h>
30 //--------------------------------------------------------------------
31 clitk::SplitImageGenericFilter::SplitImageGenericFilter():
32   clitk::ImageToImageGenericFilter<Self>("SplitImage")
33 {
34   mSplitDimension = 0;
35   InitializeImageType<3>();
36   InitializeImageType<4>();
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 typename clitk::SplitImageGenericFilter::PngConversion<ImageType>::OutputPngImagePointer
52 clitk::SplitImageGenericFilter::PngConversion<ImageType>::Do(double window,
53                                                              double level,
54                                                              ImagePointer input)
55 {
56   static const unsigned int PixelDimension = itk::PixelTraits<typename ImageType::PixelType>::Dimension;
57   return this->Do(window, level, input, static_cast< PixelDimType<PixelDimension> *>(ITK_NULLPTR) );
58 }
59 //--------------------------------------------------------------------
60
61 //--------------------------------------------------------------------
62 template <class ImageType>
63 template<unsigned int Dim>
64 typename clitk::SplitImageGenericFilter::PngConversion<ImageType>::OutputPngImagePointer
65 clitk::SplitImageGenericFilter::PngConversion<ImageType>::Do(double window,
66                                                              double level,
67                                                              ImagePointer input,
68                                                              PixelDimType<Dim> *)
69 {
70   clitkExceptionMacro("Png conversion is not implemented for vector fields");
71   return ITK_NULLPTR;
72 }
73 //--------------------------------------------------------------------
74
75 //--------------------------------------------------------------------
76 template <class ImageType>
77 typename clitk::SplitImageGenericFilter::PngConversion<ImageType>::OutputPngImagePointer
78 clitk::SplitImageGenericFilter::PngConversion<ImageType>::Do(double window,
79                                                              double level,
80                                                              ImagePointer input,
81                                                              PixelDimType<1> *)
82 {
83   typedef itk::IntensityWindowingImageFilter< ImageType, OutputPngImageType > CastFilterType;
84   typename CastFilterType::Pointer cast = CastFilterType::New();
85   cast->SetWindowLevel(window, level);
86   cast->SetInput(input);
87   cast->Update();
88   return cast->GetOutput();
89 }
90 //--------------------------------------------------------------------
91
92 //--------------------------------------------------------------------
93 template<class ImageType>
94 void clitk::SplitImageGenericFilter::UpdateWithInputImageType()
95 {
96
97   // Read input
98   typedef typename ImageType::PixelType PixelType;
99   typedef itk::Image<PixelType,ImageType::ImageDimension-1> OutputImageType;
100   typename ImageType::Pointer input = this->GetInput<ImageType>(0);
101   typedef itk::ExtractImageFilter<ImageType,OutputImageType> FilterType;
102   typename FilterType::Pointer filter= FilterType::New();
103
104   filter->SetInput(input);
105   typename ImageType::SizeType size=input->GetLargestPossibleRegion().GetSize();
106   size[mSplitDimension]=0;
107   typename ImageType::RegionType extracted_region;
108   extracted_region.SetSize(size);
109   filter->SetDirectionCollapseToIdentity();
110   filter->SetExtractionRegion(extracted_region);
111   filter->Update();
112
113   typedef itk::ChangeInformationImageFilter< OutputImageType > InformationFilterType;
114
115   typename ImageType::IndexType index=input->GetLargestPossibleRegion().GetIndex();
116   std::string base_filename=GetOutputFilename();
117   unsigned int number_of_output_images=input->GetLargestPossibleRegion().GetSize()[mSplitDimension];
118   for (unsigned int i=0; i<number_of_output_images; i++) {
119     std::ostringstream ss;
120     ss << std::setfill('0') << std::setw((int)(log10(double(number_of_output_images))+1)) << i;
121     index[mSplitDimension]=i;
122     extracted_region.SetIndex(index);
123     filter->SetExtractionRegion(extracted_region);
124     filter->Update();
125
126     if (ImageType::ImageDimension == 4 && mSplitDimension == 3) //Copy the transformation matrix if the original image is a 4D image splitted along the time dimension
127     {
128       typename InformationFilterType::Pointer informationFilter = InformationFilterType::New();
129       informationFilter->SetInput( filter->GetOutput() );
130       typename OutputImageType::DirectionType directionOutput;
131       for (unsigned j=0; j<3; ++j)
132         for (unsigned k=0; k<3; ++k)
133           directionOutput[j][k] = input->GetDirection()[j][k];
134       informationFilter->SetOutputDirection( directionOutput );
135       informationFilter->ChangeDirectionOn();
136       informationFilter->UpdateOutputInformation();
137
138       if(this->m_Png){
139         PngConversion<OutputImageType> png;
140         SetOutputFilename(base_filename+"_"+ss.str()+".png");
141         typename PngConversion<OutputImageType>::OutputPngImagePointer output;
142         output = png.Do(this->m_Window, this->m_Level, informationFilter->GetOutput());
143         this->template SetNextOutput<typename PngConversion<OutputImageType>::OutputPngImageType>(output);
144       }
145       else {
146         SetOutputFilename(base_filename+"_"+ss.str()+".mhd");
147         SetNextOutput<OutputImageType>(informationFilter->GetOutput());
148       }
149     }
150     else
151     {
152       if(this->m_Png){
153         PngConversion<OutputImageType> png;
154         SetOutputFilename(base_filename+"_"+ss.str()+".png");
155         typename PngConversion<OutputImageType>::OutputPngImagePointer output;
156         output = png.Do(this->m_Window, this->m_Level, filter->GetOutput());
157         this->template SetNextOutput<typename PngConversion<OutputImageType>::OutputPngImageType>(output);
158       }
159       else {
160         SetOutputFilename(base_filename+"_"+ss.str()+".mhd");
161         SetNextOutput<OutputImageType>(filter->GetOutput());
162       }
163     }
164   }
165 }
166 //--------------------------------------------------------------------