00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkImplicitManifoldNormalVectorFilter_h_
00018 #define __itkImplicitManifoldNormalVectorFilter_h_
00019
00020 #include "itkConstNeighborhoodIterator.h"
00021 #include "itkNormalVectorFunctionBase.h"
00022 #include "itkFiniteDifferenceSparseImageFilter.h"
00023 #include "itkVector.h"
00024
00025 namespace itk {
00026
00070 template <class TInputImage, class TSparseOutputImage>
00071 class ImplicitManifoldNormalVectorFilter
00072 : public FiniteDifferenceSparseImageFilter <TInputImage, TSparseOutputImage>
00073 {
00074 public:
00076 typedef ImplicitManifoldNormalVectorFilter Self;
00077 typedef FiniteDifferenceSparseImageFilter <TInputImage,
00078 TSparseOutputImage> Superclass;
00079 typedef SmartPointer<Self> Pointer;
00080 typedef SmartPointer<const Self> ConstPointer;
00081
00083 itkTypeMacro(ImplicitManifoldNormalVectorFilter,
00084 FiniteDifferenceSparseImageFilter);
00085
00087 itkNewMacro(Self);
00088
00090 itkStaticConstMacro(ImageDimension, unsigned int,Superclass::ImageDimension);
00091
00093 typedef typename Superclass::InputImageType InputImageType;
00094 typedef typename Superclass::IndexType IndexType;
00095 typedef typename Superclass::NodeDataType NormalVectorType;
00096 typedef typename Superclass::NodeValueType NodeValueType;
00097 typedef typename Superclass::FiniteDifferenceFunctionType
00098 FiniteDifferenceFunctionType;
00099 typedef typename Superclass::SparseOutputImageType SparseOutputImageType;
00100 typedef typename Superclass::OutputNodeType NormalBandNodeType;
00101 typedef typename Superclass::NodeListType NodeListType;
00102
00104 typedef ConstNeighborhoodIterator <InputImageType> InputImageIteratorType;
00105
00108 typedef NormalVectorFunctionBase <SparseOutputImageType> NormalFunctionType;
00109
00111 typedef typename FiniteDifferenceFunctionType::RadiusType RadiusType;
00112
00114 void SetNormalFunction( NormalFunctionType *nf );
00115
00116 itkSetMacro(MaxIteration, unsigned int);
00117 itkGetMacro(MaxIteration, unsigned int);
00118 itkSetMacro(IsoLevelLow, NodeValueType);
00119 itkGetMacro(IsoLevelLow, NodeValueType);
00120 itkSetMacro(IsoLevelHigh, NodeValueType);
00121 itkGetMacro(IsoLevelHigh, NodeValueType);
00122 itkSetMacro(MinVectorNorm, NodeValueType);
00123 itkGetMacro(MinVectorNorm, NodeValueType);
00124 itkSetMacro(UnsharpMaskingFlag, bool);
00125 itkGetMacro(UnsharpMaskingFlag, bool);
00126 itkSetMacro(UnsharpMaskingWeight, NodeValueType);
00127 itkGetMacro(UnsharpMaskingWeight, NodeValueType);
00128
00129 protected:
00130 ImplicitManifoldNormalVectorFilter();
00131 ~ImplicitManifoldNormalVectorFilter() {};
00132 void PrintSelf(std::ostream& os, Indent indent) const;
00133
00135 virtual void Initialize();
00136
00138 void SetNormalBand();
00139
00141 void InitializeNormalBandNode( NormalBandNodeType *node,
00142 const InputImageIteratorType &it );
00143
00146 virtual void CopyInputToOutput() {};
00147
00148 private:
00149 ImplicitManifoldNormalVectorFilter(const Self&);
00150 void operator=(const Self&);
00151
00153 NormalFunctionType *m_NormalFunction;
00154
00156 unsigned int m_MaxIteration;
00157
00160 NodeValueType m_IsoLevelLow, m_IsoLevelHigh;
00161
00163 NodeValueType m_MinVectorNorm;
00164
00166 bool m_UnsharpMaskingFlag;
00167
00170 NodeValueType m_UnsharpMaskingWeight;
00171
00173 unsigned long m_Indicator [itkGetStaticConstMacro(ImageDimension)];
00174 unsigned int m_NumVertex;
00175 NodeValueType m_DimConst, m_DimConst2;
00176 RadiusType m_ManifoldRadius;
00177
00178 protected:
00180 virtual NormalVectorType DataConstraint( const NormalVectorType &data ) const
00181 {
00182 return (data / (m_MinVectorNorm + data.GetNorm()));
00183 }
00184
00188 virtual void PostProcessOutput();
00189
00190 public:
00193 virtual bool Halt()
00194 {
00195 if (this->GetElapsedIterations()==m_MaxIteration) return true;
00196 else return false;
00197 }
00198 };
00199
00200 }
00201
00202 #ifndef ITK_MANUAL_INSTANTIATION
00203 #include "itkImplicitManifoldNormalVectorFilter.txx"
00204 #endif
00205
00206 #endif