00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __freMeanVectorFieldGenerator_txx
00023 #define __freMeanVectorFieldGenerator_txx
00024
00025 #include "freMeanVectorFieldGenerator.h"
00026 #include "itkCastImageFilter.h"
00027
00028 namespace FREE
00029 {
00030
00031 template <class TInputVectorField,class TOutputVectorField>
00032 void
00033 MeanVectorFieldGenerator<TInputVectorField, TOutputVectorField>::
00034 ResizeSumField(OutputImageType* elementField)
00035 {
00036 if (!m_iFieldCount)
00037 {
00038 if (!m_bUserRegion)
00039 {
00040 m_OutputRegion = elementField->GetLargestPossibleRegion();
00041 m_OutputOrigin = elementField->GetOrigin();
00042 }
00043
00044 m_SumVectorField = OutputImageType::New();
00045 m_SumVectorField->SetOrigin(m_OutputOrigin);
00046 m_SumVectorField->SetSpacing(elementField->GetSpacing());
00047 m_SumVectorField->SetRegions(m_OutputRegion);
00048 m_SumVectorField->Allocate();
00049
00050
00051 OutputVectorType pixel;
00052 for (int iIndex=0; iIndex < OutputVectorType::GetVectorDimension(); iIndex++) pixel[iIndex]=0;
00053 m_SumVectorField->FillBuffer(pixel);
00054 }
00055 };
00056
00057 template <class TInputVectorField,class TOutputVectorField>
00058 void
00059 MeanVectorFieldGenerator<TInputVectorField, TOutputVectorField>::
00060 AddField(const InputImageType* vectorField)
00061 {
00062 typedef itk::CastImageFilter<InputImageType,OutputImageType> CasterType;
00063
00064 typename CasterType::Pointer caster = CasterType::New();
00065 caster->SetInput(vectorField);
00066
00067 typename OutputImageType::Pointer smpCastedInput = caster->GetOutput();
00068 caster->Update();
00069
00070 ResizeSumField(smpCastedInput);
00071
00072 OutputRegionType newRegion = vectorField->GetLargestPossibleRegion();
00073
00074 if (newRegion.Crop(m_OutputRegion))
00075 {
00076
00077 typedef itk::ImageRegionIterator<OutputImageType> OutputIteratorType;
00078 typedef itk::ImageRegionConstIterator<OutputImageType> OutputConstIteratorType;
00079
00080 OutputIteratorType sumIterator(m_SumVectorField,newRegion);
00081 OutputConstIteratorType iterator(smpCastedInput,newRegion);
00082
00083 for (sumIterator.GoToBegin(), iterator.GoToBegin(); !(sumIterator.IsAtEnd()); ++sumIterator, ++iterator)
00084 {
00085 OutputVectorType result = sumIterator.Get();
00086 result = result+iterator.Get();
00087 sumIterator.Set(result);
00088 }
00089 }
00090
00091 m_iFieldCount++;
00092 };
00093
00096 template <class TInputVectorField,class TOutputVectorField>
00097 typename MeanVectorFieldGenerator<TInputVectorField, TOutputVectorField>::OutputImagePointer
00098 MeanVectorFieldGenerator<TInputVectorField, TOutputVectorField>::
00099 GetOutput (void) const
00100 {
00101 OutputImagePointer outputField = OutputImageType::New();
00102 outputField->SetOrigin(m_SumVectorField->GetOrigin());
00103 outputField->SetSpacing(m_SumVectorField->GetSpacing());
00104 outputField->SetRegions(m_SumVectorField->GetLargestPossibleRegion());
00105 outputField->Allocate();
00106
00107 typedef itk::ImageRegionIterator<OutputImageType> OutputIteratorType;
00108 typedef itk::ImageRegionConstIterator<OutputImageType> OutputConstIteratorType;
00109
00110 OutputConstIteratorType sumIterator(m_SumVectorField,m_OutputRegion);
00111 OutputIteratorType outIterator(outputField,m_OutputRegion);
00112
00113 typedef typename OutputVectorType::ValueType OutputVectorValueType;
00114 OutputVectorValueType factor = 0;
00115
00116 if (m_iFieldCount) factor = 1.0/(OutputVectorValueType)m_iFieldCount;
00117
00118 for (sumIterator.GoToBegin(),outIterator.GoToBegin(); !(sumIterator.IsAtEnd()); ++sumIterator, ++outIterator)
00119 {
00120 OutputVectorType result = sumIterator.Get();
00121 result = result*factor;
00122 outIterator.Set(result);
00123 }
00124
00125 return outputField;
00126 };
00127
00128 template <class TInputVectorField,class TOutputVectorField>
00129 void
00130 MeanVectorFieldGenerator<TInputVectorField, TOutputVectorField>::
00131 Reset()
00132 {
00133 m_iFieldCount = 0;
00134 m_bUserRegion = false;
00135 };
00136
00137 template <class TInputVectorField,class TOutputVectorField>
00138 MeanVectorFieldGenerator<TInputVectorField, TOutputVectorField>::
00139 MeanVectorFieldGenerator()
00140 {
00141 Reset();
00142 };
00143
00144 template <class TInputVectorField,class TOutputVectorField>
00145 MeanVectorFieldGenerator<TInputVectorField, TOutputVectorField>::
00146 ~MeanVectorFieldGenerator()
00147 {
00148 };
00149
00150 template <class TInputVectorField,class TOutputVectorField>
00151 typename MeanVectorFieldGenerator<TInputVectorField, TOutputVectorField>::OutputRegionType
00152 MeanVectorFieldGenerator<TInputVectorField, TOutputVectorField>::
00153 GetOutputRegion() const
00154 {
00155 return m_OutputRegion;
00156 };
00157
00158 template <class TInputVectorField,class TOutputVectorField>
00159 void
00160 MeanVectorFieldGenerator<TInputVectorField, TOutputVectorField>::
00161 SetOutputGeometry(const OutputRegionType& outputRegion, const OutputPointType& origin)
00162 {
00163 m_OutputRegion = outputRegion;
00164 m_OutputOrigin = origin;
00165 m_bUserRegion = true;
00166 };
00167
00168 }
00169
00170 #endif