1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
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
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.
13 It is distributed under dual licence
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"
26 //=========================================================================================================================
27 // LinearCombinationImageFilter
28 //=========================================================================================================================
30 //=========================================================================================================================
32 template <class InputImageType, class OutputImageType>
33 LinearCombinationImageFilter<InputImageType, OutputImageType>
34 ::LinearCombinationImageFilter()
36 this->SetNumberOfRequiredInputs(2);
43 //=========================================================================================================================
45 template <class InputImageType, class OutputImageType>
46 void LinearCombinationImageFilter<InputImageType, OutputImageType>::SetFirstInput(const typename InputImageType::Pointer input)
48 this->SetInput(0,input);
50 template <class InputImageType, class OutputImageType>
51 void LinearCombinationImageFilter<InputImageType, OutputImageType>::SetSecondInput(const typename InputImageType::Pointer input)
53 this->SetInput(1,input);
57 template <class InputImageType, class OutputImageType>
58 void LinearCombinationImageFilter<InputImageType, OutputImageType>::SetFirstInput(const typename InputImageType::ConstPointer input)
60 this->SetInput(0,input);
62 template <class InputImageType, class OutputImageType>
63 void LinearCombinationImageFilter<InputImageType, OutputImageType>::SetSecondInput(const typename InputImageType::ConstPointer input)
65 this->SetInput(1,input);
69 //=========================================================================================================================
71 template <class InputImageType, class OutputImageType>
73 LinearCombinationImageFilter<InputImageType, OutputImageType>
74 ::ThreadedGenerateData(const OutputImageRegionType &threadRegion, int threadId)
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();
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();
91 //Find which coefficient should be applied
99 while (!outputIterator.IsAtEnd())
101 // outputIterator.Set(static_cast<OutputPixelType>(input1Iterator.Get()+input2Iterator.Get()));
102 outputIterator.Set(input1Iterator.Get()+input2Iterator.Get());
110 while (!outputIterator.IsAtEnd())
112 // outputIterator.Set(static_cast<OutputPixelType>(m_A* input1Iterator.Get()+input2Iterator.Get()));
113 outputIterator.Set(m_A* input1Iterator.Get()+input2Iterator.Get());
126 while (!outputIterator.IsAtEnd())
128 //outputIterator.Set(static_cast<OutputPixelType>(input1Iterator.Get()+m_B *input2Iterator.Get()));
129 outputIterator.Set(input1Iterator.Get()+m_B *input2Iterator.Get());
137 while (!outputIterator.IsAtEnd())
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());
158 while (!outputIterator.IsAtEnd())
160 outputIterator.Set(static_cast<OutputPixelType>(input1Iterator.Get()+input2Iterator.Get())+ m_C);
168 while (!outputIterator.IsAtEnd())
170 outputIterator.Set(static_cast<OutputPixelType>(m_A* input1Iterator.Get()+input2Iterator.Get()+ m_C) );
183 while (!outputIterator.IsAtEnd())
185 outputIterator.Set(static_cast<OutputPixelType>(input1Iterator.Get()+m_B *input2Iterator.Get()+ m_C) );
193 while (!outputIterator.IsAtEnd())
195 outputIterator.Set(static_cast<OutputPixelType>(m_A* input1Iterator.Get()+ m_B*input2Iterator.Get()+ m_C) );
206 }// end of namespace clitk