]> Creatis software - clitk.git/blob - common/clitkImageToImageGenericFilterBase.cxx
Added Varian OBI file format
[clitk.git] / common / clitkImageToImageGenericFilterBase.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://oncora1.lyon.fnclcc.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 // clitk
20 #include "clitkImageToImageGenericFilterBase.h"
21
22 // itk
23 #include <itkImage.h>
24
25 //--------------------------------------------------------------------
26 clitk::ImageToImageGenericFilterBase::~ImageToImageGenericFilterBase() {}
27 //--------------------------------------------------------------------
28
29
30 //--------------------------------------------------------------------
31 clitk::ImageToImageGenericFilterBase::ImageToImageGenericFilterBase(std::string n)
32   :m_IOVerbose(false)
33 {
34   m_FilterName = n;
35   m_FailOnImageTypeError = true;
36   m_ReadOnDisk = true;
37   m_LastError = "";
38 }
39 //--------------------------------------------------------------------
40
41
42 //--------------------------------------------------------------------
43 void clitk::ImageToImageGenericFilterBase::SetInputFilenames(const std::vector<std::string> & filenames)
44 {
45   m_InputFilenames = filenames;
46 }
47 //--------------------------------------------------------------------
48
49
50 //--------------------------------------------------------------------
51 void clitk::ImageToImageGenericFilterBase::EnableReadOnDisk(bool b)
52 {
53   m_ReadOnDisk = b;
54 }
55 //--------------------------------------------------------------------
56
57
58 //--------------------------------------------------------------------
59 void clitk::ImageToImageGenericFilterBase::SetInputFilename(const std::string & filename)
60 {
61   std::vector<std::string> f;
62   f.push_back(filename);
63   SetInputFilenames(f);
64 }
65 //--------------------------------------------------------------------
66
67
68 //--------------------------------------------------------------------
69 void clitk::ImageToImageGenericFilterBase::AddInputFilename(const std::string & filename)
70 {
71   m_InputFilenames.push_back(filename);
72 }
73 //--------------------------------------------------------------------
74
75
76 //--------------------------------------------------------------------
77 void clitk::ImageToImageGenericFilterBase::SetOutputFilename(const std::string & filename)
78 {
79   m_OutputFilenames.clear();
80   m_OutputFilenames.push_back(filename);
81 }
82 //--------------------------------------------------------------------
83
84
85 //--------------------------------------------------------------------
86 void clitk::ImageToImageGenericFilterBase::AddOutputFilename(const std::string & filename)
87 {
88   m_OutputFilenames.push_back(filename);
89 }
90 //--------------------------------------------------------------------
91
92
93 //--------------------------------------------------------------------
94 void clitk::ImageToImageGenericFilterBase::SetOutputFilenames(const std::vector<std::string> & filenames)
95 {
96   m_OutputFilenames.clear();
97   std::copy(filenames.begin(),filenames.end(),m_OutputFilenames.begin());
98 }
99 //--------------------------------------------------------------------
100
101
102 //--------------------------------------------------------------------
103 std::string clitk::ImageToImageGenericFilterBase::GetOutputFilename()
104 {
105   assert(m_OutputFilenames.size() == 1);
106   return m_OutputFilenames.front();
107 }
108 //--------------------------------------------------------------------
109
110
111 //--------------------------------------------------------------------
112 void clitk::ImageToImageGenericFilterBase::GetInputImageDimensionAndPixelType(unsigned int& dim, \
113     std::string& pixeltype,unsigned int& components)
114 {
115   if (m_ReadOnDisk && m_InputFilenames.size()) {
116     int comp_temp,dim_temp; //clitkCommonImage takes ints
117     ReadImageDimensionAndPixelType(m_InputFilenames[0], dim_temp, pixeltype,comp_temp);
118     components=comp_temp;
119     dim=dim_temp;
120   } else {
121     if (m_InputVVImages.size()) {
122       pixeltype = m_InputVVImages[0]->GetScalarTypeAsITKString();
123       dim = m_InputVVImages[0]->GetNumberOfDimensions();
124       components = m_InputVVImages[0]->GetNumberOfScalarComponents();
125     } else
126       assert(false); //No input image, shouldn't happen
127   }
128   if (m_IOVerbose) {
129     std::cout << "Input is " << m_Dim << "D " << m_PixelTypeName << "." << std::endl;
130   }
131 }
132 //--------------------------------------------------------------------
133
134
135 //--------------------------------------------------------------------
136 vvImage::Pointer clitk::ImageToImageGenericFilterBase::GetOutputVVImage ()
137 {
138   assert(m_OutputVVImages.size());
139   return m_OutputVVImages[0];
140 }
141 //--------------------------------------------------------------------
142
143
144 //--------------------------------------------------------------------
145 std::vector<vvImage::Pointer> clitk::ImageToImageGenericFilterBase::GetOutputVVImages()
146 {
147   return m_OutputVVImages;
148 }
149 //--------------------------------------------------------------------
150
151
152 //--------------------------------------------------------------------
153 void clitk::ImageToImageGenericFilterBase::SetInputVVImage (vvImage::Pointer input)
154 {
155   m_InputVVImages.clear();
156   m_InputVVImages.push_back(input);
157 }
158 //--------------------------------------------------------------------
159
160
161 //--------------------------------------------------------------------
162 void clitk::ImageToImageGenericFilterBase::AddInputVVImage (vvImage::Pointer input)
163 {
164   m_InputVVImages.push_back(input);
165 }
166 //--------------------------------------------------------------------
167
168
169 //--------------------------------------------------------------------
170 void clitk::ImageToImageGenericFilterBase::SetInputVVImages (std::vector<vvImage::Pointer> input)
171 {
172   m_InputVVImages=input;
173 }
174 //--------------------------------------------------------------------
175
176
177 //--------------------------------------------------------------------
178 void clitk::ImageToImageGenericFilterBase::PrintAvailableImageTypes()
179 {
180   std::cout << GetAvailableImageTypes();
181 }
182 //--------------------------------------------------------------------
183
184
185
186 //--------------------------------------------------------------------
187 void clitk::ImageToImageGenericFilterBase::ImageTypeError()
188 {
189   std::cerr << "**Error** The filter <" << m_FilterName << "> is not available for "
190             << m_Dim << "D images with pixel="
191             << m_PixelTypeName << " and "
192             << m_NbOfComponents << " component." << std::endl;
193   std::cerr << GetAvailableImageTypes();
194   exit(0);
195 }
196 //--------------------------------------------------------------------
197
198
199 //--------------------------------------------------------------------
200 void clitk::ImageToImageGenericFilterBase::SetImageTypeError()
201 {
202   std::cerr << "TODO ! " << std::endl;
203   exit(0);
204 }
205 //--------------------------------------------------------------------
206
207
208 //--------------------------------------------------------------------
209 const std::string & clitk::ImageToImageGenericFilterBase::GetFilterName()
210 {
211   return m_FilterName;
212 }
213 //--------------------------------------------------------------------
214
215
216 //--------------------------------------------------------------------
217 void clitk::ImageToImageGenericFilterBase::SetFilterName(std::string & n)
218 {
219   m_FilterName = n;
220 }
221 //--------------------------------------------------------------------
222
223
224 //--------------------------------------------------------------------
225 void clitk::ImageToImageGenericFilterBase::SetIOVerbose(bool b)
226 {
227   m_IOVerbose = b;
228 }
229 //--------------------------------------------------------------------
230
231 #define DEF_SetNextOutput_And_GetInput(PixelType, Dim) \
232   template \
233 void clitk::ImageToImageGenericFilterBase::SetNextOutput<itk::Image<PixelType, Dim> >(itk::Image<PixelType,Dim>::Pointer output); \
234   template \
235    itk::Image<PixelType, Dim>::Pointer clitk::ImageToImageGenericFilterBase::GetInput<itk::Image<PixelType, Dim> >(unsigned int n);
236
237 #define DEF_SetNextOutput_And_GetInput_WithCompo(Compo, Dim)   \
238   template \
239   void clitk::ImageToImageGenericFilterBase::SetNextOutput<itk::Image<itk::Vector<float, Compo>, Dim> >(itk::Image<itk::Vector<float, Compo>,Dim>::Pointer output); \
240   template \
241   itk::Image<itk::Vector<float,Compo>, Dim>::Pointer clitk::ImageToImageGenericFilterBase::GetInput<itk::Image<itk::Vector<float, Compo>, Dim> >(unsigned int n);
242
243 DEF_SetNextOutput_And_GetInput(char, 2);
244 DEF_SetNextOutput_And_GetInput(unsigned char, 2);
245 DEF_SetNextOutput_And_GetInput(short, 2);
246 DEF_SetNextOutput_And_GetInput(unsigned short, 2);
247 DEF_SetNextOutput_And_GetInput(int, 2);
248 DEF_SetNextOutput_And_GetInput(float, 2);
249 DEF_SetNextOutput_And_GetInput(double, 2);
250
251 DEF_SetNextOutput_And_GetInput(char, 3);
252 DEF_SetNextOutput_And_GetInput(unsigned char, 3);
253 DEF_SetNextOutput_And_GetInput(short, 3);
254 DEF_SetNextOutput_And_GetInput(unsigned short, 3);
255 DEF_SetNextOutput_And_GetInput(int, 3);
256 DEF_SetNextOutput_And_GetInput(float, 3);
257 DEF_SetNextOutput_And_GetInput(double, 3);
258
259 DEF_SetNextOutput_And_GetInput_WithCompo(2, 2);
260 DEF_SetNextOutput_And_GetInput_WithCompo(2, 3);
261 DEF_SetNextOutput_And_GetInput_WithCompo(2, 4);
262 DEF_SetNextOutput_And_GetInput_WithCompo(3, 2);
263 DEF_SetNextOutput_And_GetInput_WithCompo(3, 3);
264 DEF_SetNextOutput_And_GetInput_WithCompo(3, 4);
265 DEF_SetNextOutput_And_GetInput_WithCompo(4, 2);
266 DEF_SetNextOutput_And_GetInput_WithCompo(4, 3);
267 DEF_SetNextOutput_And_GetInput_WithCompo(4, 4);
268
269 DEF_SetNextOutput_And_GetInput(char, 4);
270 DEF_SetNextOutput_And_GetInput(unsigned char, 4);
271 DEF_SetNextOutput_And_GetInput(short, 4);
272 DEF_SetNextOutput_And_GetInput(unsigned short, 4);
273 DEF_SetNextOutput_And_GetInput(int, 4);
274 DEF_SetNextOutput_And_GetInput(float, 4);
275 DEF_SetNextOutput_And_GetInput(double, 4);
276
277
278 //--------------------------------------------------------------------
279 template<class ImageType>
280 void clitk::ImageToImageGenericFilterBase::SetNextOutput(typename ImageType::Pointer output)
281 {
282   if (m_OutputFilenames.size()) {
283     clitk::writeImage<ImageType>(output, m_OutputFilenames.front(), m_IOVerbose);
284     m_OutputFilenames.pop_front();
285   }
286   if (m_InputVVImages.size()) //We assume that if a vv image is set as input, we want one as the output
287     m_OutputVVImages.push_back(vvImageFromITK<ImageType::ImageDimension,typename ImageType::PixelType>(output));
288 }
289 //--------------------------------------------------------------------
290
291
292 //--------------------------------------------------------------------
293 template<class ImageType>
294 typename ImageType::Pointer clitk::ImageToImageGenericFilterBase::GetInput(unsigned int n)
295 {
296   if (m_ReadOnDisk && m_InputFilenames.size() > n) {
297     return clitk::readImage<ImageType>(m_InputFilenames[n], m_IOVerbose);
298   } else {
299     if (m_InputVVImages.size() > n)
300       return typename ImageType::Pointer(const_cast<ImageType*>(vvImageToITK<ImageType>(m_InputVVImages[n]).GetPointer()));
301     else {
302       assert(false); //No input, this shouldn't happen
303       return typename ImageType::Pointer(NULL);
304     }
305   }
306 }
307 //--------------------------------------------------------------------
308
309
310