]> Creatis software - clitk.git/blob - tools/clitkImageConvertGenericFilter.h
Merge branch 'master' into GammaIndex3D
[clitk.git] / tools / clitkImageConvertGenericFilter.h
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 #ifndef CLITKIMAGECONVERTGENERICFILTER_H
19 #define CLITKIMAGECONVERTGENERICFILTER_H
20 /**
21  ===================================================================
22  * @file   clitkImageConvertGenericFilter.h
23  * @author David Sarrut <David.Sarrut@creatis.insa-lyon.fr>
24  * @date   05 May 2008 10:40:24
25
26  * @brief
27
28  ===================================================================*/
29
30 // clitk include
31 #include "clitkImageToImageGenericFilter.h"
32
33 // itk include
34 #include "itkCastImageFilter.h"
35 #include "itkVectorCastImageFilter.h"
36
37
38 namespace clitk {
39
40   template <class TPixel>
41   class ImageConvertTraits
42   {
43   public:
44     enum { IS_VECTOR = false };
45     ImageConvertTraits() {
46       TPixel p = "SCALAR";
47     }
48   };
49
50   template < class TPixel, unsigned int Comp >
51   class ImageConvertTraits< itk::Vector<TPixel, Comp> >
52   {
53   public:
54     enum { IS_VECTOR = true };
55   };
56
57   class ImageConvertGenericFilter:
58     public clitk::ImageToImageGenericFilter<ImageConvertGenericFilter> {
59
60   public:
61     // constructor - destructor
62     ImageConvertGenericFilter();
63
64     // Types
65     typedef ImageConvertGenericFilter     Self;
66     typedef itk::SmartPointer<Self>       Pointer;
67     typedef itk::SmartPointer<const Self> ConstPointer;
68
69     // New
70     itkNewMacro(Self);
71
72     // Members functions
73     std::string GetInputPixelTypeName() { return m_PixelTypeName; }
74     std::string GetOutputPixelTypeName() { return mOutputPixelTypeName; }
75     void SetOutputPixelType(std::string p) { mOutputPixelTypeName = p; }
76     void SetVV(bool b) { mVV = b; }
77     bool IsWarningOccur() { return mWarningOccur; }
78     std::string & GetWarning() { return mWarning; }
79     void EnableDisplayWarning(bool b) { mDisplayWarning = b; }
80     void SetCorrectNegativeSpacingFlag(bool b) { mCorrectNegativeSpacingFlag = b; }
81
82     //--------------------------------------------------------------------
83     // Main function called each time the filter is updated
84     template<class InputImageType>
85     void UpdateWithInputImageType();
86
87     template<class PixelType, class OutputPixelType>
88     void CheckTypes(std::string inType, std::string outType);
89
90   protected:
91
92     template<unsigned int Dim> void InitializeImageType();
93     std::string mOutputPixelTypeName;
94     std::string mWarning;
95     bool mWarningOccur;
96     bool mDisplayWarning;
97     bool mVV;
98     bool mCorrectNegativeSpacingFlag;
99
100   private:
101     template <class InputImageType, bool isVector>
102     class UpdateWithSelectiveOutputType
103     {
104     public:
105       static bool Run(ImageConvertGenericFilter& filter, std::string outputPixelType)
106       {
107           if (IsSameType<char>(outputPixelType))
108             UpdateWithOutputType<char>(filter);
109           else if (IsSameType<uchar>(outputPixelType))
110             UpdateWithOutputType<uchar>(filter);
111           else if (IsSameType<short>(outputPixelType))
112             UpdateWithOutputType<short>(filter);
113           else if (IsSameType<ushort>(outputPixelType))
114             UpdateWithOutputType<ushort>(filter);
115           else if (IsSameType<int>(outputPixelType))
116             UpdateWithOutputType<int>(filter);
117           else if (IsSameType<float>(outputPixelType))
118             UpdateWithOutputType<float>(filter);
119           else if (IsSameType<double>(outputPixelType))
120             UpdateWithOutputType<double>(filter);
121           else
122           {
123             std::string list = CreateListOfTypes<float, double>();
124             std::cerr << "Error, I don't know the vector output type '" << outputPixelType
125                       << "'. " << std::endl << "Known types are " << list << "." << std::endl;
126             return false;
127           }
128
129           return true;
130       }
131
132     private:
133
134       template <class OutputPixelType>
135       static void UpdateWithOutputType(ImageConvertGenericFilter& filter)
136       {
137         // Read
138         typename InputImageType::Pointer input =filter.template GetInput<InputImageType>(0);
139
140         // Typedef
141         typedef typename InputImageType::PixelType PixelType;
142
143         // Warning
144         filter.CheckTypes<PixelType, OutputPixelType>(filter.GetInputPixelTypeName(), filter.GetOutputPixelTypeName());
145
146         // Cast
147         typedef itk::Image<OutputPixelType,InputImageType::ImageDimension> OutputImageType;
148         typedef itk::CastImageFilter<InputImageType, OutputImageType> FilterType;
149         typename FilterType::Pointer cast_filter = FilterType::New();
150         cast_filter->SetInput(input);
151         cast_filter->Update();
152
153         // Write
154         filter.SetNextOutput<OutputImageType>(cast_filter->GetOutput());
155       }
156     };
157
158     template <class InputImageType>
159     class UpdateWithSelectiveOutputType<InputImageType, true>
160     {
161     public:
162       static bool Run(ImageConvertGenericFilter& filter, std::string outputPixelType)
163       {
164         /*
165         // RP: future conversions?
166         if (IsSameType<char>(outputPixelType))
167           UpdateWithOutputVectorType<char>();
168         else if (IsSameType<uchar>(outputPixelType))
169           UpdateWithOutputVectorType<uchar>();
170         else if (IsSameType<short>(outputPixelType))
171           UpdateWithOutputVectorType<short>();
172         else if (IsSameType<ushort>(outputPixelType))
173           UpdateWithOutputVectorType<ushort>();
174         else if (IsSameType<int>(outputPixelType))
175           UpdateWithOutputVectorType<int>();
176         else
177           */
178         if (IsSameType<float>(outputPixelType))
179           UpdateWithOutputVectorType<float>(filter);
180         else if (IsSameType<double>(outputPixelType))
181           UpdateWithOutputVectorType<double>(filter);
182         else
183         {
184           std::string list = CreateListOfTypes<float, double>();
185           std::cerr << "Error, I don't know the vector output type '" << outputPixelType
186                     << "'. " << std::endl << "Known types are " << list << "." << std::endl;
187           return false;
188         }
189
190         return true;
191       }
192
193     private:
194
195       template <class OutputPixelType>
196       static void UpdateWithOutputVectorType(ImageConvertGenericFilter& filter)
197       {
198         // Read
199         typename InputImageType::Pointer input =filter.template GetInput<InputImageType>(0);
200
201         // Typedef
202         typedef typename InputImageType::PixelType::ValueType PixelType;
203
204         // Warning
205         filter.CheckTypes<PixelType, OutputPixelType>(filter.GetInputPixelTypeName(), filter.GetOutputPixelTypeName());
206
207         // Cast
208         typedef itk::Image<itk::Vector<OutputPixelType, InputImageType::PixelType::Dimension>, InputImageType::ImageDimension> OutputImageType;
209         typedef itk::VectorCastImageFilter<InputImageType, OutputImageType> FilterType;
210         typename FilterType::Pointer cast_filter = FilterType::New();
211         cast_filter->SetInput(input);
212         cast_filter->Update();
213
214         // Write
215         filter.SetNextOutput<OutputImageType>(cast_filter->GetOutput());
216       }
217     };
218   }; // end class ImageConvertGenericFilter
219
220 //#include "clitkImageConvertGenericFilter.txx"
221
222 } // end namespace
223
224 #endif /* end #define CLITKIMAGECONVERTGENERICFILTER_H */