Main Page   Groups   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Concepts

itkSparseFieldLevelSetImageFilter.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Insight Segmentation & Registration Toolkit
00004   Module:    $RCSfile: itkSparseFieldLevelSetImageFilter.h,v $
00005   Language:  C++
00006   Date:      $Date: 2004/12/21 22:47:31 $
00007   Version:   $Revision: 1.21 $
00008 
00009   Copyright (c) Insight Software Consortium. All rights reserved.
00010   See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
00011 
00012      This software is distributed WITHOUT ANY WARRANTY; without even 
00013      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
00014      PURPOSE.  See the above copyright notices for more information.
00015 
00016 =========================================================================*/
00017 #ifndef __itkSparseFieldLevelSetImageFilter_h_
00018 #define __itkSparseFieldLevelSetImageFilter_h_
00019 
00020 #include "itkFiniteDifferenceImageFilter.h"
00021 #include "itkMultiThreader.h"
00022 #include "itkSparseFieldLayer.h"
00023 #include "itkObjectStore.h"
00024 #include <vector>
00025 #include "itkNeighborhoodIterator.h"
00026 
00027 namespace itk {
00028 
00033 template <class TValueType>
00034 class SparseFieldLevelSetNode
00035 {
00036 public:
00037   TValueType m_Value;
00038   SparseFieldLevelSetNode *Next;
00039   SparseFieldLevelSetNode *Previous;
00040 };
00041 
00068 template <class TNeighborhoodType>
00069 class SparseFieldCityBlockNeighborList
00070 {
00071 public:
00072   typedef TNeighborhoodType NeighborhoodType;
00073   typedef typename NeighborhoodType::OffsetType OffsetType;
00074   typedef typename NeighborhoodType::RadiusType RadiusType;
00075   itkStaticConstMacro(Dimension, unsigned int,
00076                       NeighborhoodType::Dimension );
00077 
00078   const RadiusType &GetRadius() const
00079   { return m_Radius; }
00080   
00081   const unsigned int &GetArrayIndex(unsigned int i) const
00082   { return m_ArrayIndex[i]; }
00083 
00084   const OffsetType &GetNeighborhoodOffset(unsigned int i) const
00085   { return m_NeighborhoodOffset[i]; }
00086 
00087   const unsigned int &GetSize() const
00088   { return m_Size; }
00089 
00090   int GetStride(unsigned int i)
00091   { return m_StrideTable[i]; }
00092   
00093   SparseFieldCityBlockNeighborList();
00094   ~SparseFieldCityBlockNeighborList() {}
00095 
00096   void Print(std::ostream &os) const;
00097   
00098 private:
00099   unsigned int m_Size;
00100   RadiusType m_Radius;
00101   std::vector<unsigned int> m_ArrayIndex;
00102   std::vector<OffsetType>   m_NeighborhoodOffset;
00103 
00106   unsigned m_StrideTable[Dimension];
00107 };
00108 
00109   
00225 template <class TInputImage, class TOutputImage>
00226 class ITK_EXPORT SparseFieldLevelSetImageFilter :
00227   public FiniteDifferenceImageFilter<TInputImage, TOutputImage>
00228 {
00229 public:
00231   typedef SparseFieldLevelSetImageFilter  Self;
00232   typedef FiniteDifferenceImageFilter<TInputImage, TOutputImage> Superclass;
00233   typedef SmartPointer<Self>  Pointer;
00234   typedef SmartPointer<const Self>  ConstPointer;
00235 
00237   typedef typename Superclass::TimeStepType TimeStepType;
00238   
00240   itkNewMacro(Self);
00241 
00243   itkTypeMacro(SparseFieldLevelSetImageFilter, FiniteDifferenceImageFilter);
00244 
00246   typedef TInputImage  InputImageType;
00247   typedef TOutputImage OutputImageType;
00248   typedef typename OutputImageType::IndexType IndexType;
00249   itkStaticConstMacro(ImageDimension, unsigned int,
00250                       TOutputImage::ImageDimension);
00251 
00254   typedef typename OutputImageType::ValueType ValueType;
00255 
00257   typedef SparseFieldLevelSetNode<IndexType> LayerNodeType;
00258   
00260   typedef SparseFieldLayer<LayerNodeType> LayerType;
00261   typedef typename LayerType::Pointer LayerPointerType;
00262 
00264   typedef std::vector<LayerPointerType> LayerListType;
00265   
00267   typedef signed char StatusType;
00268   
00271   typedef Image<StatusType, itkGetStaticConstMacro(ImageDimension)>
00272   StatusImageType;
00273 
00276   typedef ObjectStore<LayerNodeType> LayerNodeStorageType;
00277 
00279   typedef std::vector<ValueType> UpdateBufferType;
00280 
00284   itkSetMacro(NumberOfLayers, unsigned int);
00285   itkGetMacro(NumberOfLayers, unsigned int);
00286 
00288   itkSetMacro(IsoSurfaceValue, ValueType);
00289   itkGetMacro(IsoSurfaceValue, ValueType);
00290 
00294   //  itkGetMacro(RMSChange, ValueType);
00295 
00300   itkSetMacro(InterpolateSurfaceLocation, bool);
00301   itkGetMacro(InterpolateSurfaceLocation, bool);
00302 
00304   void InterpolateSurfaceLocationOn()
00305   { this->SetInterpolateSurfaceLocation(true); }
00306   void InterpolateSurfaceLocationOff()
00307   { this->SetInterpolateSurfaceLocation(false); }
00308   
00309 protected:
00310   SparseFieldLevelSetImageFilter();
00311   ~SparseFieldLevelSetImageFilter();
00312   virtual void PrintSelf(std::ostream& os, Indent indent) const;
00313 
00318   inline virtual ValueType CalculateUpdateValue(
00319     const IndexType &itkNotUsed(idx),
00320     const TimeStepType &dt,
00321     const ValueType &value,
00322     const ValueType &change)
00323   { return (value + dt * change); }
00324 
00328   virtual void PostProcessOutput();
00329 
00334   virtual void InitializeBackgroundPixels();
00335  
00337   void Initialize();
00338 
00343   void CopyInputToOutput(); 
00344 
00346   void AllocateUpdateBuffer();
00347 
00350   void ApplyUpdate(TimeStepType dt);
00351 
00354   TimeStepType CalculateChange();
00355 
00359   void ConstructLayer(StatusType from, StatusType to);
00360 
00365   void ConstructActiveLayer();
00366 
00368   void InitializeActiveLayerValues();
00369   
00377   void PropagateLayerValues(StatusType from, StatusType to,
00378                             StatusType promote, int InOrOut);
00379 
00384   void PropagateAllLayerValues();
00385 
00389   void UpdateActiveLayerValues(TimeStepType dt, LayerType *StatusUpList,
00390                                LayerType *StatusDownList);
00392   void ProcessStatusList(LayerType *InputList, LayerType *OutputList,
00393                          StatusType ChangeToStatus, StatusType SearchForStatus);
00394 
00396   void ProcessOutsideList(LayerType *OutsideList, StatusType ChangeToStatus);
00397   
00398   itkGetConstMacro(ValueZero, ValueType);
00399   itkGetConstMacro(ValueOne, ValueType);
00400 
00402   SparseFieldCityBlockNeighborList<NeighborhoodIterator<OutputImageType> >
00403   m_NeighborList;
00404   
00407   static double m_ConstantGradientValue;
00408 
00410   static ValueType m_ValueOne;
00411 
00413   static ValueType m_ValueZero;
00414 
00417   static StatusType m_StatusChanging;
00418 
00421   static StatusType m_StatusActiveChangingUp;
00422 
00425   static StatusType m_StatusActiveChangingDown;
00426 
00429   static StatusType m_StatusBoundaryPixel;
00430 
00433   static StatusType m_StatusNull;
00434     
00438   typename OutputImageType::Pointer m_ShiftedImage;
00439 
00444   LayerListType m_Layers;
00445 
00449   unsigned int m_NumberOfLayers;
00450 
00452   typename StatusImageType::Pointer m_StatusImage;
00453 
00455   typename LayerNodeStorageType::Pointer m_LayerNodeStore;
00456   
00458   ValueType m_IsoSurfaceValue;
00459 
00462   UpdateBufferType m_UpdateBuffer;
00463 
00467   //  ValueType m_RMSChange;  
00468 
00473   bool m_InterpolateSurfaceLocation;
00474 
00475 private:
00476   SparseFieldLevelSetImageFilter(const Self&);//purposely not implemented
00477   void operator=(const Self&);      //purposely not implemented
00478 
00481   bool m_BoundsCheckingActive;
00482 
00483 };
00484   
00485   
00486 } // end namespace itk
00487 
00488 #ifndef ITK_MANUAL_INSTANTIATION
00489 #include "itkSparseFieldLevelSetImageFilter.txx"
00490 #endif
00491 
00492 #endif

Generated at Thu May 25 00:05:39 2006 for ITK by doxygen 1.3.5 written by Dimitri van Heesch, © 1997-2000