00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
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
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 {
00078
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
00099
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 }
00169
00170 #endif