]> Creatis software - clitk.git/blob - registration/clitkLinearCombinationImageFilter.txx
Debug RTStruct conversion with empty struc
[clitk.git] / registration / clitkLinearCombinationImageFilter.txx
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 __clitkLinearCombinationImageFilter_txx
19 #define __clitkLinearCombinationImageFilter_txx
20 #include "clitkLinearCombinationImageFilter.h"
21
22
23 namespace clitk
24 {
25
26   //=========================================================================================================================
27   // LinearCombinationImageFilter
28   //=========================================================================================================================
29
30   //=========================================================================================================================
31   //constructor
32   template <class InputImageType, class OutputImageType> 
33   LinearCombinationImageFilter<InputImageType, OutputImageType>
34   ::LinearCombinationImageFilter()
35   {
36     this->SetNumberOfRequiredInputs(2);
37     m_A=1.;
38     m_B=1.;
39     m_C=0.;
40     
41   }
42
43   //=========================================================================================================================
44   //set input
45   template <class InputImageType, class OutputImageType> 
46   void LinearCombinationImageFilter<InputImageType, OutputImageType>::SetFirstInput(const typename InputImageType::Pointer input)
47   {
48     this->SetInput(0,input);
49   }
50   template <class InputImageType, class OutputImageType> 
51   void LinearCombinationImageFilter<InputImageType, OutputImageType>::SetSecondInput(const typename InputImageType::Pointer input)
52   {
53     this->SetInput(1,input);
54   }
55
56
57   template <class InputImageType, class OutputImageType> 
58   void LinearCombinationImageFilter<InputImageType, OutputImageType>::SetFirstInput(const typename InputImageType::ConstPointer input)
59   {
60     this->SetInput(0,input);
61   }
62   template <class InputImageType, class OutputImageType> 
63   void LinearCombinationImageFilter<InputImageType, OutputImageType>::SetSecondInput(const typename InputImageType::ConstPointer input)
64   {
65     this->SetInput(1,input);
66   }
67
68
69   //=========================================================================================================================
70   //Update
71   template <class InputImageType, class OutputImageType> 
72   void 
73   LinearCombinationImageFilter<InputImageType, OutputImageType>
74   ::ThreadedGenerateData(const OutputImageRegionType &threadRegion, int threadId)
75   {
76     //Pointers to input and output
77     typename InputImageType::ConstPointer input1=this->GetInput(0);
78     typename InputImageType::ConstPointer input2=this->GetInput(1);
79     typename OutputImageType::Pointer output=this->GetOutput();
80
81     //Iterator over input1, input0 and output
82     typedef itk::ImageRegionConstIterator<InputImageType> InputIteratortype;
83     typedef itk::ImageRegionIterator<OutputImageType> OutputIteratortype;
84     InputIteratortype input1Iterator (input1, threadRegion);
85     InputIteratortype input2Iterator (input2, threadRegion);
86     OutputIteratortype outputIterator (output, threadRegion);
87     input1Iterator.GoToBegin();
88     input2Iterator.GoToBegin();
89     outputIterator.GoToBegin();
90
91     //Find which coefficient should be applied
92
93     if (m_C==0.)
94       {
95         if (m_B==1.)
96           {
97             if (m_A==1.)
98               {
99                 while (!outputIterator.IsAtEnd())
100                   {
101                     // outputIterator.Set(static_cast<OutputPixelType>(input1Iterator.Get()+input2Iterator.Get()));
102                     outputIterator.Set(input1Iterator.Get()+input2Iterator.Get());
103                     ++input1Iterator;
104                     ++input2Iterator;
105                     ++outputIterator;    
106                   }
107               }
108             else 
109               {
110                 while (!outputIterator.IsAtEnd())
111                   {
112                     // outputIterator.Set(static_cast<OutputPixelType>(m_A* input1Iterator.Get()+input2Iterator.Get()));
113                     outputIterator.Set(m_A* input1Iterator.Get()+input2Iterator.Get());
114                     ++input1Iterator;
115                     ++input2Iterator;
116                     ++outputIterator;    
117                   }
118               }
119           }
120         // case B not 1
121         else
122           {
123             if (m_A==1.)
124               {
125                 
126                 while (!outputIterator.IsAtEnd())
127                   {
128                     //outputIterator.Set(static_cast<OutputPixelType>(input1Iterator.Get()+m_B *input2Iterator.Get()));
129                     outputIterator.Set(input1Iterator.Get()+m_B *input2Iterator.Get());
130                     ++input1Iterator;
131                     ++input2Iterator;
132                     ++outputIterator;    
133                   }
134               }
135             else 
136               {
137                 while (!outputIterator.IsAtEnd())
138                   {
139                     //outputIterator.Set(static_cast<OutputPixelType>(m_A* input1Iterator.Get()+ m_B*input2Iterator.Get()));
140                     outputIterator.Set(m_A* input1Iterator.Get()+ m_B*input2Iterator.Get());
141                     ++input1Iterator;
142                     ++input2Iterator;
143                     ++outputIterator;    
144                   }
145               }
146           }
147
148       }
149
150     //Case C not 0
151     else
152       {
153         if (m_B==1.)
154           {
155             if (m_A==1.)
156               {
157                 
158                 while (!outputIterator.IsAtEnd())
159                   {
160                     outputIterator.Set(static_cast<OutputPixelType>(input1Iterator.Get()+input2Iterator.Get())+ m_C);
161                     ++input1Iterator;
162                     ++input2Iterator;
163                     ++outputIterator;    
164                   }
165               }
166             else 
167               {
168                 while (!outputIterator.IsAtEnd())
169                   {
170                     outputIterator.Set(static_cast<OutputPixelType>(m_A* input1Iterator.Get()+input2Iterator.Get()+ m_C) );
171                     ++input1Iterator;
172                     ++input2Iterator;
173                     ++outputIterator;    
174                   }
175               }
176           }
177         // case B not 1
178         else
179           {
180             if (m_A==1.)
181               {
182               
183                 while (!outputIterator.IsAtEnd())
184                   {
185                     outputIterator.Set(static_cast<OutputPixelType>(input1Iterator.Get()+m_B *input2Iterator.Get()+ m_C) );
186                     ++input1Iterator;
187                     ++input2Iterator;
188                     ++outputIterator;    
189                   }
190               }
191             else 
192               {
193                 while (!outputIterator.IsAtEnd())
194                   {
195                     outputIterator.Set(static_cast<OutputPixelType>(m_A* input1Iterator.Get()+ m_B*input2Iterator.Get()+ m_C) );
196                     ++input1Iterator;
197                     ++input2Iterator;
198                     ++outputIterator;    
199                   }
200               }
201           }
202       }
203
204   }
205
206 }// end of namespace clitk
207
208   
209
210 #endif