freVarianceFieldGenerator.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: freVarianceFieldGenerator.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 __freVarianceFieldGenerator_txx
00023 #define __freVarianceFieldGenerator_txx
00024 
00025 #include "freVarianceFieldGenerator.h"
00026 
00027 #include "itkCastImageFilter.h"
00028 #include "itkNumericTraits.h"
00029 #include "itkSubtractImageFilter.h"
00030 
00031 namespace FREE
00032 {
00033 
00034 template <class TInputVectorField,class TOutputField>
00035 void
00036 VarianceFieldGenerator<TInputVectorField, TOutputField>::
00037 ResizeSumField(const InputImageType* elementField)
00038 {
00039         if (!m_iFieldCount)
00040         {
00041                 if (!m_bUserRegion)
00042                 {
00043                         m_OutputRegion = elementField->GetLargestPossibleRegion();
00044                         m_OutputOrigin = elementField->GetOrigin();
00045                 }
00046 
00047                 m_SumField = OutputImageType::New();
00048                 m_SumField->SetOrigin(m_OutputOrigin);
00049                 m_SumField->SetSpacing(elementField->GetSpacing());
00050                 m_SumField->SetRegions(m_OutputRegion);
00051                 m_SumField->Allocate();
00052 
00053                 //Reset the variance field to no variance (all values are 0)
00054     m_SumField->FillBuffer(itk::NumericTraits<OutputValueType>::Zero);
00055         }
00056 };
00057 
00058 template <class TInputVectorField,class TOutputField>
00059 typename VarianceFieldGenerator<TInputVectorField, TOutputField>::InputImagePointer
00060 VarianceFieldGenerator<TInputVectorField, TOutputField>::
00061 AddField(const InputImageType* pField, const InputImageType* pMeanField)
00062 {
00063         ResizeSumField(pField);
00064 
00065         typedef itk::SubtractImageFilter< InputImageType, InputImageType, InputImageType > SubtractFilterType;
00066         typename SubtractFilterType::Pointer smpSubFilter = SubtractFilterType::New();
00067                 
00068         smpSubFilter->SetInput1(pField);
00069         smpSubFilter->SetInput2(pMeanField);
00070                 
00071         InputImagePointer smpDVF = smpSubFilter->GetOutput();
00072         smpSubFilter->Update();
00073 
00074         OutputRegionType newRegion = smpDVF->GetLargestPossibleRegion();
00075 
00076         if (newRegion.Crop(m_OutputRegion))
00077         { //new field is inside the output region, so add values to the sum, otherwise safe time
00078                 // and skip;
00079                 typedef itk::ImageRegionIterator<OutputImageType> OutputIteratorType;
00080                 typedef itk::ImageRegionConstIterator<InputImageType> InputConstIteratorType;
00081 
00082     OutputIteratorType sumIterator(m_SumField,newRegion);
00083     InputConstIteratorType iterator(smpDVF,newRegion);
00084 
00085     for (sumIterator.GoToBegin(), iterator.GoToBegin(); !(sumIterator.IsAtEnd()); ++sumIterator, ++iterator)
00086     {
00087                         InputValueType dif = iterator.Get();
00088                         OutputValueType result = dif*dif;
00089       sumIterator.Set(sumIterator.Get()+result);  
00090                 }
00091         }
00092 
00093         m_iFieldCount++;
00094 
00095         return smpDVF;
00096 };
00097   
00098         /* Function creates an output vector field containing
00099          * the mean of every vector.*/
00100 template <class TInputVectorField,class TOutputField>
00101 typename VarianceFieldGenerator<TInputVectorField, TOutputField>::OutputImagePointer
00102 VarianceFieldGenerator<TInputVectorField, TOutputField>::
00103 GetOutput (void) const
00104 {
00105         OutputImagePointer outputField = OutputImageType::New();
00106         outputField->SetOrigin(m_SumField->GetOrigin());
00107         outputField->SetSpacing(m_SumField->GetSpacing());
00108         outputField->SetRegions(m_SumField->GetLargestPossibleRegion());
00109         outputField->Allocate();
00110 
00111         typedef itk::ImageRegionIterator<OutputImageType> OutputIteratorType;
00112         typedef itk::ImageRegionConstIterator<OutputImageType> OutputConstIteratorType;
00113 
00114   OutputConstIteratorType sumIterator(m_SumField,m_SumField->GetLargestPossibleRegion());
00115   OutputIteratorType outIterator(outputField,m_SumField->GetLargestPossibleRegion());
00116 
00117         OutputValueType factor = 0;
00118         if (m_iFieldCount>1) factor = 1.0/(m_iFieldCount - 1.0);
00119 
00120         for (sumIterator.GoToBegin(),outIterator.GoToBegin(); !(sumIterator.IsAtEnd()); ++sumIterator, ++outIterator)
00121         {
00122                 outIterator.Set( (sumIterator.Get())*factor);
00123         }
00124 
00125         return outputField;
00126 };
00127 
00128 template <class TInputVectorField,class TOutputField>
00129 void
00130 VarianceFieldGenerator<TInputVectorField, TOutputField>::
00131 Reset()
00132 {
00133         m_iFieldCount = 0;
00134         m_bUserRegion = false;
00135 };
00136 
00137 template <class TInputVectorField,class TOutputField>
00138 VarianceFieldGenerator<TInputVectorField, TOutputField>::
00139 VarianceFieldGenerator()
00140 {
00141         Reset();
00142 };
00143 
00144 template <class TInputVectorField,class TOutputField>
00145 VarianceFieldGenerator<TInputVectorField, TOutputField>::
00146 ~VarianceFieldGenerator()
00147 {
00148 };
00149 
00150 template <class TInputVectorField,class TOutputField>
00151 typename VarianceFieldGenerator<TInputVectorField, TOutputField>::OutputRegionType
00152 VarianceFieldGenerator<TInputVectorField, TOutputField>::
00153 GetOutputRegion() const
00154 {
00155         return m_OutputRegion;
00156 };
00157 
00158 template <class TInputVectorField,class TOutputField>
00159 void
00160 VarianceFieldGenerator<TInputVectorField, TOutputField>::
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 18:02:05 2007 for f.r.e.e. - Flexible Registration and Evaluation Engine by doxygen 1.5.3 written by Dimitri van Heesch, © 1997-2000