17 #ifndef __itkSparseFieldFourthOrderLevelSetImageFilter_txx
18 #define __itkSparseFieldFourthOrderLevelSetImageFilter_txx
26 #include "itkNumericTraits.h"
30 template <
class TInputImage,
class TOutputImage>
32 SparseFieldFourthOrderLevelSetImageFilter <TInputImage, TOutputImage>
33 ::m_NumVertex = 1 << ImageDimension;
35 template <
class TInputImage,
class TOutputImage>
36 const typename SparseFieldFourthOrderLevelSetImageFilter <TInputImage,
37 TOutputImage>::ValueType
38 SparseFieldFourthOrderLevelSetImageFilter <TInputImage, TOutputImage>
39 ::m_DimConst = static_cast <ValueType> (2.0/m_NumVertex);
41 template<
class TInputImage,
class TOutputImage>
46 m_LevelSetFunction = 0;
47 m_ConvergenceFlag =
false;
49 this->SetIsoSurfaceValue(0);
50 m_MaxRefitIteration = 100;
51 m_MaxNormalIteration = 25;
52 m_RMSChangeNormalProcessTrigger = NumericTraits<ValueType>::Zero;
53 m_CurvatureBandWidth =
static_cast<ValueType>(ImageDimension) + 0.5;
54 m_NormalProcessType = 0;
55 m_NormalProcessConductance = NumericTraits<ValueType>::Zero;
56 m_NormalProcessUnsharpFlag =
false;
57 m_NormalProcessUnsharpWeight = NumericTraits<ValueType>::Zero;
60 template<
class TInputImage,
class TOutputImage>
65 Superclass::PrintSelf(os, indent);
66 os << indent <<
"MaxRefitIteration: " << m_MaxRefitIteration << std::endl;
67 os << indent <<
"MaxNormalIteration: " << m_MaxNormalIteration << std::endl;
68 os << indent <<
"CurvatureBandWidth: " << m_CurvatureBandWidth << std::endl;
70 os << indent <<
"RMSChangeNormalProcessTrigger: "
71 << m_RMSChangeNormalProcessTrigger<<std::endl;
73 os << indent <<
"NormalProcessType: " << m_NormalProcessType << std::endl;
75 os << indent <<
"NormalProcessConductance: "
76 << m_NormalProcessConductance<<std::endl;
78 os << indent <<
"NormalProcessUnsharpFlag: "
79 << m_NormalProcessUnsharpFlag << std::endl;
81 os << indent <<
"NormalProcessUnsharpWeight: "
82 << m_NormalProcessUnsharpWeight<<std::endl;
85 template<
class TInputImage,
class TOutputImage>
89 m_LevelSetFunction = lsf;
90 Superclass::SetDifferenceFunction(lsf);
93 template<
class TInputImage,
class TOutputImage>
100 unsigned int counter;
101 unsigned long position, stride[ImageDimension], indicator[ImageDimension];
102 const unsigned long center = it.
Size() / 2;
107 const NeighborhoodScalesType neighborhoodScales = this->GetDifferenceFunction()->ComputeNeighborhoodScales();
109 for( j = 0; j < ImageDimension; j++ )
111 stride[j] = it.
GetStride( (
unsigned long) j);
112 indicator[j] = 1 << j;
115 curvature = NumericTraits<ValueType>::Zero;
117 for (counter = 0; counter < m_NumVertex; counter++)
120 for (k = 0; k < ImageDimension; k++)
122 if (counter & indicator[k])
124 position -= stride[k];
133 normalvector = it.
GetPixel (position)->m_Data;
134 for (j = 0; j < ImageDimension; j++)
136 if ( counter & indicator[j] )
138 curvature -= normalvector[j] * neighborhoodScales[j];
142 curvature += normalvector[j] * neighborhoodScales[j];
148 if (flag ==
true) curvature = NumericTraits<ValueType>::Zero;
149 curvature *= m_DimConst;
153 template<
class TInputImage,
class TOutputImage>
161 DistanceImageIteratorType distanceImageIterator (
163 distanceImage->GetRequestedRegion());
166 for( j = 0; j < ImageDimension; j++ )
171 sparseImageIterator (radius,sparseImage,
177 sparseImageIterator.GoToBegin();
178 distanceImageIterator.GoToBegin();
179 while ( !distanceImageIterator.IsAtEnd() )
181 distance = distanceImageIterator.Value();
182 node = sparseImageIterator.GetCenterPixel();
183 if ( (distance >= -m_CurvatureBandWidth )&&
184 (distance <= m_CurvatureBandWidth ) )
187 ComputeCurvatureFromSparseImageNeighborhood (sparseImageIterator);
197 ++sparseImageIterator;
198 ++distanceImageIterator;
202 template<
class TInputImage,
class TOutputImage>
209 im = m_LevelSetFunction->GetSparseTargetImage();
213 layerIt = this->m_Layers[0]->Begin();
214 while (layerIt != this->m_Layers[0]->End() )
216 node = im->GetPixel(layerIt->m_Value);
229 template<
class TInputImage,
class TOutputImage>
239 NormalVectorFilter = NormalVectorFilterType::New();
240 NormalVectorFunction = NormalVectorFunctionType::New();
241 NormalVectorFunction->SetNormalProcessType ( m_NormalProcessType );
242 NormalVectorFunction->SetConductanceParameter ( m_NormalProcessConductance );
243 NormalVectorFilter->SetNormalFunction ( NormalVectorFunction );
244 NormalVectorFilter->SetIsoLevelLow (-m_CurvatureBandWidth-temp );
245 NormalVectorFilter->SetIsoLevelHigh ( m_CurvatureBandWidth+temp );
246 NormalVectorFilter->SetMaxIteration ( m_MaxNormalIteration );
247 NormalVectorFilter->SetUnsharpMaskingFlag (m_NormalProcessUnsharpFlag);
248 NormalVectorFilter->SetUnsharpMaskingWeight (m_NormalProcessUnsharpWeight);
253 typename OutputImageType::Pointer phi = this->GetOutput();
254 typename OutputImageType::Pointer tmp = OutputImageType::New();
255 tmp->SetRequestedRegion( phi->GetRequestedRegion() );
256 tmp->SetBufferedRegion( phi->GetBufferedRegion() );
257 tmp->SetLargestPossibleRegion( phi->GetLargestPossibleRegion() );
258 tmp->SetPixelContainer( phi->GetPixelContainer() );
259 tmp->CopyInformation( phi );
261 NormalVectorFilter->SetInput(tmp);
262 NormalVectorFilter->Update();
265 = NormalVectorFilter->GetOutput();
267 this->ComputeCurvatureTarget(tmp, SparseNormalImage);
268 m_LevelSetFunction->SetSparseTargetImage(SparseNormalImage);