1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
/*=========================================================================
Program: Insight Segmentation & Registration Toolkit
Module: itkScalarChanAndVeseSparseLevelSetImageFilter.txx
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) Insight Software Consortium. All rights reserved.
See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef __itkScalarChanAndVeseSparseLevelSetImageFilter_txx
#define __itkScalarChanAndVeseSparseLevelSetImageFilter_txx
#include "itkScalarChanAndVeseSparseLevelSetImageFilter.h"
namespace itk
{
template < class TInputImage, class TFeatureImage, class TOutputImage, class TFunction,
class TSharedData, typename TIdCell >
void
ScalarChanAndVeseSparseLevelSetImageFilter< TInputImage, TFeatureImage, TOutputImage,
TFunction, TSharedData, TIdCell >::
Initialize()
{
// Set the feature image for the individual level-set functions
for( IdCellType fId = 0; fId < this->m_FunctionCount; ++fId )
{
InputImagePointer input = this->m_LevelSet[fId];
InputPointType origin = input->GetOrigin();
// In the context of the global coordinates
FeatureIndexType start;
this->GetInput()->TransformPhysicalPointToIndex( origin, start );
// Defining roi region
FeatureRegionType region;
region.SetSize( input->GetLargestPossibleRegion().GetSize() );
region.SetIndex( start );
// Initialize the ROI filter with the feature image
ROIFilterPointer roi = ROIFilterType::New();
roi->SetInput( this->GetInput() );
roi->SetRegionOfInterest( region );
roi->Update();
// Assign roi output
FeatureImagePointer feature = roi->GetOutput();
this->m_DifferenceFunctions[fId]->SetFeatureImage( feature );
this->m_DifferenceFunctions[fId]->SetInitialImage( input );
this->m_DifferenceFunctions[fId]->CalculateAdvectionImage();
}
// Initialize the function count in m_SharedData
this->m_SharedData->SetFunctionCount ( this->m_FunctionCount );
// Set the KdTree pointer
if ( this->m_KdTree )
{
this->m_SharedData->SetKdTree( this->m_KdTree );
}
for ( IdCellType fId = 0; fId < this->m_FunctionCount; ++fId )
{
FunctionPtr typedPointer = this->m_DifferenceFunctions[fId];
typedPointer->SetFunctionId( fId );
this->m_SharedData->CreateHeavisideFunctionOfLevelSetImage ( fId, this->m_LevelSet[fId] );
// Share the m_SharedData structure
typedPointer->SetSharedData( this->m_SharedData );
}
this->m_SharedData->AllocateListImage( this->GetInput() );
this->m_SharedData->PopulateListImage();
Superclass::Initialize();
for ( IdCellType fId = 0; fId < this->m_FunctionCount; ++fId )
{
this->m_DifferenceFunctions[fId]->UpdateSharedData(true);
}
for ( IdCellType fId = 0; fId < this->m_FunctionCount; ++fId )
{
this->m_DifferenceFunctions[fId]->UpdateSharedData( false );
}
}
/** Overrides parent implementation */
// This function is called at the end of each iteration
template <class TInputImage, class TFeatureImage, class TOutputImage, class TFunction,
class TSharedData, typename TIdCell >
void
ScalarChanAndVeseSparseLevelSetImageFilter<TInputImage, TFeatureImage, TOutputImage,
TFunction, TSharedData, TIdCell > ::
InitializeIteration()
{
Superclass::InitializeIteration();
for (IdCellType fId = 0; fId < this->m_FunctionCount; ++fId)
{
this->m_DifferenceFunctions[fId]->UpdateSharedData( false );
}
// Estimate the progress of the filter
this->SetProgress( ( ( float ) this->m_ElapsedIterations
/ ( float ) this->m_NumberOfIterations ) );
}
template < class TInputImage, class TFeatureImage, class TOutputImage, class TFunction,
class TSharedData, typename TIdCell >
void
ScalarChanAndVeseSparseLevelSetImageFilter<TInputImage, TFeatureImage, TOutputImage,
TFunction, TSharedData, TIdCell > ::
UpdatePixel ( unsigned int fId, unsigned int idx,
NeighborhoodIterator< InputImageType > &iterator, ValueType &newValue,
bool &status )
{
FunctionPtr typedPointer = this->m_DifferenceFunctions[fId];
typedPointer->UpdatePixel( idx, iterator, newValue, status );
iterator.SetPixel(idx, newValue, status);
}
} /* end namespace itk */
#endif
|