freMeanVectorFieldGenerator.txx

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   F.R.E.E. - flexible registration evaluation engine
00004   Version:   v.1.0.0
00005   Date:      $Date: 2006/09/01 12:00:00 $
00006   Module:    $RCSfile: freMeanVectorFieldGenerator.txx,v $
00007   Language:  C++
00008 
00009 
00010 
00011   Copyright (c) 2007 Ralf o Floca (Department of Medical Informatics,
00012   Institute for Medical Biometry and Informatics, University of Heidelberg,
00013   Germany). All rights reserved.
00014   See FREECopyright.txt or http://www.mi.med.uni-hd.de/free/copyright.htm
00015   for details.
00016 
00017      This software is distributed WITHOUT ANY WARRANTY; without even 
00018      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
00019      PURPOSE.  See the above copyright notices for more information.
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                 //Reset the transformation field to no transformation (all vectors components are 0)
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         { //new field is inside the output region, so add values to the sum, otherwise safe time
00076                 // and skip;
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 }//End of Namespace free
00169 
00170 #endif

Generated at Sat Oct 13 16:35:58 2007 for f.r.e.e. - Flexible Registration and Evaluation Engine by doxygen 1.5.3 written by Dimitri van Heesch, © 1997-2000