00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef _itkSparseFieldFourthOrderLevelSetImageFilter_h_
00018 #define _itkSparseFieldFourthOrderLevelSetImageFilter_h_
00019
00020 #include "itkSparseImage.h"
00021 #include "itkNormalVectorDiffusionFunction.h"
00022 #include "itkImplicitManifoldNormalVectorFilter.h"
00023 #include "itkLevelSetFunctionWithRefitTerm.h"
00024 #include "itkSparseFieldLevelSetImageFilter.h"
00025 #include <math.h>
00026
00027 namespace itk {
00028
00036 template <class TImageType>
00037 class NormalBandNode
00038 {
00039 public:
00041 typedef TImageType LevelSetImageType;
00042
00044 typedef typename LevelSetImageType::PixelType NodeValueType;
00045
00047 typedef typename LevelSetImageType::IndexType IndexType;
00048
00050 typedef Vector <NodeValueType,
00051 ::itk::GetImageDimension<TImageType>::ImageDimension>
00052 NodeDataType;
00053
00055 NodeDataType m_Data;
00056
00058 NodeDataType m_InputData;
00059
00061 NodeDataType m_Update;
00062
00065 NodeDataType
00066 m_ManifoldNormal[::itk::GetImageDimension<TImageType>::ImageDimension];
00067
00069 NodeDataType m_Flux [::itk::GetImageDimension<TImageType>::ImageDimension];
00070
00073 NodeValueType m_Curvature;
00074
00077 bool m_CurvatureFlag;
00078
00080 IndexType m_Index;
00081
00083 NormalBandNode *Next;
00084 NormalBandNode *Previous;
00085 };
00086
00153 template <class TInputImage, class TOutputImage>
00154 class ITK_EXPORT SparseFieldFourthOrderLevelSetImageFilter
00155 : public SparseFieldLevelSetImageFilter <TInputImage, TOutputImage>
00156 {
00157 public:
00159 typedef SparseFieldFourthOrderLevelSetImageFilter Self;
00160 typedef SparseFieldLevelSetImageFilter<TInputImage, TOutputImage> Superclass;
00161 typedef SmartPointer<Self> Pointer;
00162 typedef SmartPointer<const Self> ConstPointer;
00163
00165 itkTypeMacro(SparseFieldFourthOrderLevelSetImageFilter,
00166 SparseFieldLevelSetImageFilter);
00167
00169 itkStaticConstMacro(ImageDimension, unsigned int,Superclass::ImageDimension);
00170
00172 typedef typename Superclass::OutputImageType OutputImageType;
00173 typedef typename Superclass::ValueType ValueType;
00174 typedef typename Superclass::IndexType IndexType;
00175 typedef typename Superclass::LayerType LayerType;
00176
00179 typedef NormalBandNode <OutputImageType> NodeType;
00180
00182 typedef SparseImage <NodeType,
00183 itkGetStaticConstMacro(ImageDimension)> SparseImageType;
00184
00186 typedef typename NodeType::NodeDataType NormalVectorType;
00187
00189 typedef NeighborhoodIterator <SparseImageType> SparseImageIteratorType;
00190
00192 typedef ImplicitManifoldNormalVectorFilter <OutputImageType, SparseImageType>
00193 NormalVectorFilterType;
00194
00196 typedef NormalVectorDiffusionFunction <SparseImageType>
00197 NormalVectorFunctionType;
00198
00200
00201
00203 typedef LevelSetFunctionWithRefitTerm <OutputImageType,
00204 SparseImageType> LevelSetFunctionType;
00205
00206 itkGetConstReferenceMacro(MaxRefitIteration,unsigned int);
00207 itkSetMacro(MaxRefitIteration,unsigned int);
00208 itkGetConstReferenceMacro(MaxNormalIteration,unsigned int);
00209 itkSetMacro(MaxNormalIteration,unsigned int);
00210 itkGetConstReferenceMacro(CurvatureBandWidth,ValueType);
00211 itkSetMacro(CurvatureBandWidth,ValueType);
00212 itkGetConstReferenceMacro(RMSChangeNormalProcessTrigger, ValueType);
00213 itkSetMacro(RMSChangeNormalProcessTrigger, ValueType);
00214 itkGetConstReferenceMacro(NormalProcessType, int);
00215 itkSetMacro(NormalProcessType, int);
00216 itkGetConstReferenceMacro(NormalProcessConductance, ValueType);
00217 itkSetMacro(NormalProcessConductance, ValueType);
00218 itkSetMacro(NormalProcessUnsharpFlag, bool);
00219 itkGetConstReferenceMacro(NormalProcessUnsharpFlag, bool);
00220 itkSetMacro(NormalProcessUnsharpWeight, ValueType);
00221 itkGetConstReferenceMacro(NormalProcessUnsharpWeight, ValueType);
00222
00225 void SetLevelSetFunction( LevelSetFunctionType *lsf );
00226
00230 unsigned int GetMinimumNumberOfLayers() const
00231 {
00232 return (int)ceil(m_CurvatureBandWidth+
00233 itkGetStaticConstMacro(ImageDimension));
00234 }
00235
00238 virtual void SetNumberOfLayers( const unsigned int n )
00239 {
00240 unsigned int nm = vnl_math_max (this->GetMinimumNumberOfLayers (), n );
00241 if (nm != this->GetNumberOfLayers())
00242 {
00243 Superclass::SetNumberOfLayers (nm);
00244 this->Modified();
00245 }
00246 }
00247
00250 virtual void InitializeIteration()
00251 {
00252 Superclass::InitializeIteration();
00253 ValueType rmschange = this->GetRMSChange();
00254
00255 if ( ( this->GetElapsedIterations()==0 ) ||
00256 ( m_RefitIteration == m_MaxRefitIteration ) ||
00257 ( rmschange <= m_RMSChangeNormalProcessTrigger ) ||
00258 ( this->ActiveLayerCheckBand() ) )
00259 {
00260 if ( ( this->GetElapsedIterations() != 0 ) &&
00261 ( rmschange <= m_RMSChangeNormalProcessTrigger ) &&
00262 ( m_RefitIteration <= 1) )
00263 {
00264 m_ConvergenceFlag = true;
00265 }
00266
00267 m_RefitIteration = 0;
00268 ProcessNormals();
00269 }
00270
00271 m_RefitIteration++;
00272 }
00273
00274 protected:
00275 SparseFieldFourthOrderLevelSetImageFilter();
00276 ~SparseFieldFourthOrderLevelSetImageFilter() {};
00277 virtual void PrintSelf(std::ostream& os, Indent indent) const;
00278
00279
00282 ValueType ComputeCurvatureFromSparseImageNeighborhood
00283 ( SparseImageIteratorType &neighborhood ) const;
00284
00288 void ComputeCurvatureTarget( const OutputImageType *distanceImage,
00289 SparseImageType *sparseImage ) const;
00290
00292 void ProcessNormals();
00293
00298 bool ActiveLayerCheckBand() const;
00299
00300 private:
00303 unsigned int m_RefitIteration;
00304
00308 unsigned int m_MaxRefitIteration;
00309
00312 unsigned int m_MaxNormalIteration;
00313
00317 ValueType m_RMSChangeNormalProcessTrigger;
00318
00321 bool m_ConvergenceFlag;
00322
00325 LevelSetFunctionType *m_LevelSetFunction;
00326
00331 ValueType m_CurvatureBandWidth;
00332
00335 int m_NormalProcessType;
00336
00339 ValueType m_NormalProcessConductance;
00340
00343 bool m_NormalProcessUnsharpFlag;
00344
00347 ValueType m_NormalProcessUnsharpWeight;
00348
00350 static const unsigned long m_NumVertex;
00351 static const ValueType m_DimConst;
00352
00353 SparseFieldFourthOrderLevelSetImageFilter(const Self&);
00354
00355 void operator=(const Self&);
00356 };
00357
00358 }
00359
00360 #ifndef ITK_MANUAL_INSTANTIATION
00361 #include "itkSparseFieldFourthOrderLevelSetImageFilter.txx"
00362 #endif
00363
00364 #endif