]> Creatis software - clitk.git/blob - filters/clitkImageConvertGenericFilter.cxx
- new GF system
[clitk.git] / filters / clitkImageConvertGenericFilter.cxx
1 #ifndef CLITKIMAGECONVERTGENERICFILTER_CXX
2 #define CLITKIMAGECONVERTGENERICFILTER_CXX
3
4 /**
5  -------------------------------------------------
6  * @file   clitkImageConvertGenericFilter.cxx
7  * @author David Sarrut <david.sarrut@creatis.insa-lyon.fr>
8  * @date   05 May 2008 10:57:19
9  * 
10  * @brief  
11  * 
12  * 
13  -------------------------------------------------*/
14
15 #include "clitkImageConvertGenericFilter.h"
16
17 //--------------------------------------------------------------------
18 clitk::ImageConvertGenericFilter::ImageConvertGenericFilter():
19   clitk::ImageToImageGenericFilter<Self>("ImageConvert") {
20   mOutputPixelTypeName = "NotSpecified";
21   InitializeImageType<2>();
22   InitializeImageType<3>();  
23   InitializeImageType<4>();  
24 }
25 //--------------------------------------------------------------------
26
27
28 //--------------------------------------------------------------------
29 template<unsigned int Dim>
30 void clitk::ImageConvertGenericFilter::InitializeImageType() {      
31   ADD_IMAGE_TYPE(Dim, char);
32   ADD_IMAGE_TYPE(Dim, short);
33   ADD_IMAGE_TYPE(Dim, unsigned short);
34   ADD_IMAGE_TYPE(Dim, int);
35   ADD_IMAGE_TYPE(Dim, float);
36   ADD_IMAGE_TYPE(Dim, double);
37 }
38 //--------------------------------------------------------------------
39
40
41 //--------------------------------------------------------------------
42 template<class InputImageType>
43 void clitk::ImageConvertGenericFilter::UpdateWithInputImageType() {
44
45   // Verbose stuff
46   if (mIOVerbose) {
47     if (mInputFilenames.size() == 1) {
48       std::cout << "Input image <" << mInputFilenames[0] << "> is ";
49       itk::ImageIOBase::Pointer header = clitk::readImageHeader(mInputFilenames[0]);
50       printImageHeader(header, std::cout);
51       std::cout << std::endl;
52     }
53     else {
54       for(unsigned int i=0; i<mInputFilenames.size(); i++) {
55         std::cout << "Input image " << i << " <" << mInputFilenames[i] << "> is ";
56         itk::ImageIOBase::Pointer h = clitk::readImageHeader(mInputFilenames[i]);       
57         printImageHeader(h, std::cout);
58         std::cout << std::endl;
59       }
60     }
61   }
62
63
64   if ((mPixelTypeName == mOutputPixelTypeName) || (mOutputPixelTypeName == "NotSpecified")) {
65     //    typename InputImageType::Pointer input = clitk::readImage<InputImageType>(mInputFilenames);
66     typename InputImageType::Pointer input = this->template GetInput<InputImageType>(0);
67     //clitk::writeImage<InputImageType>(input, mOutputFilename, mIOVerbose);
68     this->SetNextOutput<InputImageType>(input);
69   }
70   else {
71 #define TRY_TYPE(TYPE) \
72     if (IsSameType<TYPE>(mOutputPixelTypeName)) { UpdateWithOutputType<InputImageType, TYPE>(); return; }
73     TRY_TYPE(char);
74     // TRY_TYPE(signed char);
75     TRY_TYPE(uchar);
76     TRY_TYPE(short);
77     TRY_TYPE(ushort);
78     TRY_TYPE(int); // no uint ...
79     TRY_TYPE(float);
80     TRY_TYPE(double);
81 #undef TRY_TYPE
82
83     std::string list = CreateListOfTypes<char, uchar, short, ushort, int, float, double>();
84     std::cerr << "Error, I don't know the output type '" << mOutputPixelTypeName 
85               << "'. " << std::endl << "Known types are " << list << "." << std::endl;
86     exit(0);
87   }  
88 }
89 //====================================================================
90
91 //====================================================================
92 template<class InputImageType, class OutputPixelType>
93 void clitk::ImageConvertGenericFilter::UpdateWithOutputType() {
94   // Read
95   typename InputImageType::Pointer input =this->template GetInput<InputImageType>(0);
96
97   // Typedef
98   typedef typename InputImageType::PixelType PixelType;
99
100   // Warning
101   if (std::numeric_limits<PixelType>::is_signed) {
102     if (!std::numeric_limits<OutputPixelType>::is_signed) {
103       std::cerr << "Warning, input type is signed (" << mPixelTypeName << ") while output type is not (" 
104                 << mOutputPixelTypeName << "), use at your own responsability." << std::endl;
105     }
106   }
107   if (!std::numeric_limits<PixelType>::is_integer) {
108     if (std::numeric_limits<OutputPixelType>::is_integer) {
109       std::cerr << "Warning, input type is not integer (" << mPixelTypeName << ") while output type is (" 
110                 << mOutputPixelTypeName << "), use at your own responsability." << std::endl;
111     }
112   }
113   //  DD(std::numeric_limits<PixelType>::digits10);
114   // DD(std::numeric_limits<OutputPixelType>::digits10);
115   if (!std::numeric_limits<PixelType>::is_integer) {
116     if (std::numeric_limits<OutputPixelType>::is_integer) {
117       std::cerr << "Warning, input type is not integer (" << mPixelTypeName << ") while output type is (" 
118                 << mOutputPixelTypeName << "), use at your own responsability." << std::endl;
119     }
120   }
121   if (std::numeric_limits<PixelType>::digits10 > std::numeric_limits<OutputPixelType>::digits10) {
122     std::cerr << "Warning, possible loss of precision : input type is (" << mPixelTypeName << ") while output type is (" 
123                 << mOutputPixelTypeName << "), use at your own responsability." << std::endl;
124   }
125
126   // Cast
127   typedef itk::Image<OutputPixelType,InputImageType::ImageDimension> OutputImageType;
128   typedef itk::CastImageFilter<InputImageType, OutputImageType> FilterType;
129   typename FilterType::Pointer filter = FilterType::New();
130   filter->SetInput(input);
131   filter->Update();
132
133   // Write
134   SetNextOutput<OutputImageType>(filter->GetOutput());
135   //clitk::writeImage<OutputImageType>(filter->GetOutput(), mOutputFilename, mIOVerbose);
136 }
137 //====================================================================
138
139
140 #endif /* end #define CLITKIMAGECONVERTGENERICFILTER_CXX */
141