00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkImageFunction_h
00018 #define __itkImageFunction_h
00019
00020 #include "itkFunctionBase.h"
00021 #include "itkPoint.h"
00022 #include "itkIndex.h"
00023 #include "itkContinuousIndex.h"
00024 #include "itkImageBase.h"
00025
00026 namespace itk
00027 {
00028
00029
00055 template <
00056 class TInputImage,
00057 class TOutput,
00058 class TCoordRep = float
00059 >
00060 class ITK_EXPORT ImageFunction :
00061 public FunctionBase< Point<TCoordRep,
00062 ::itk::GetImageDimension<TInputImage>::ImageDimension>,
00063 TOutput >
00064 {
00065 public:
00067 itkStaticConstMacro(ImageDimension, unsigned int,
00068 TInputImage::ImageDimension);
00069
00071 typedef ImageFunction Self;
00072 typedef FunctionBase< Point<TCoordRep,
00073 itkGetStaticConstMacro(ImageDimension)>,
00074 TOutput > Superclass;
00075 typedef SmartPointer<Self> Pointer;
00076 typedef SmartPointer<const Self> ConstPointer;
00077
00079 itkTypeMacro(ImageFunction, FunctionBase);
00080
00082 typedef TInputImage InputImageType;
00083
00085 typedef typename InputImageType::PixelType InputPixelType;
00086
00088 typedef typename InputImageType::ConstPointer InputImageConstPointer;
00089
00091 typedef TOutput OutputType;
00092
00094 typedef TCoordRep CoordRepType;
00095
00097 typedef typename InputImageType::IndexType IndexType;
00098
00100 typedef ContinuousIndex<TCoordRep,itkGetStaticConstMacro(ImageDimension)>
00101 ContinuousIndexType;
00102
00104 typedef Point<TCoordRep,itkGetStaticConstMacro(ImageDimension)> PointType;
00105
00110 virtual void SetInputImage( const InputImageType * ptr );
00111
00113 const InputImageType * GetInputImage() const
00114 { return m_Image.GetPointer(); }
00115
00118 virtual TOutput Evaluate( const PointType& point ) const = 0;
00119
00122 virtual TOutput EvaluateAtIndex( const IndexType & index ) const = 0;
00123
00126 virtual TOutput EvaluateAtContinuousIndex(
00127 const ContinuousIndexType & index ) const = 0;
00128
00132 virtual bool IsInsideBuffer( const IndexType & index ) const
00133 {
00134 for ( unsigned int j = 0; j < ImageDimension; j++ )
00135 {
00136 if ( index[j] < m_StartIndex[j] ) { return false; };
00137 if ( index[j] > m_EndIndex[j] ) { return false; };
00138 }
00139 return true;
00140 }
00142
00146 virtual bool IsInsideBuffer( const ContinuousIndexType & index ) const
00147 {
00148 for ( unsigned int j = 0; j < ImageDimension; j++ )
00149 {
00150 if ( index[j] < m_StartContinuousIndex[j] ) { return false; };
00151 if ( index[j] > m_EndContinuousIndex[j] ) { return false; };
00152 }
00153 return true;
00154 }
00156
00160 virtual bool IsInsideBuffer( const PointType & point ) const
00161 {
00162 ContinuousIndexType index;
00163 m_Image->TransformPhysicalPointToContinuousIndex( point, index );
00164 return this->IsInsideBuffer( index );
00165 }
00167
00169 void ConvertPointToNearestIndex( const PointType & point,
00170 IndexType & index ) const
00171 {
00172 ContinuousIndexType cindex;
00173 m_Image->TransformPhysicalPointToContinuousIndex( point, cindex );
00174 this->ConvertContinuousIndexToNearestIndex( cindex, index );
00175 }
00177
00179 void ConvertPointToContinousIndex( const PointType & point,
00180 ContinuousIndexType & cindex ) const
00181 {
00182 itkWarningMacro("Please change your code to use ConvertPointToContinuousIndex rather than ConvertPointToContinousIndex. The latter method name was mispelled and the ITK developers failed to correct it before it was released. The mispelled method name is retained in order to maintain backward compatibility.");
00183 this->ConvertPointToContinuousIndex( point, cindex );
00184 }
00186
00188 void ConvertPointToContinuousIndex( const PointType & point,
00189 ContinuousIndexType & cindex ) const
00190 {
00191 m_Image->TransformPhysicalPointToContinuousIndex( point, cindex );
00192 }
00193
00195 inline void ConvertContinuousIndexToNearestIndex( const ContinuousIndexType & cindex,
00196 IndexType & index ) const
00197 {
00198 index.CopyWithRound( cindex );
00199 }
00200
00201 itkGetConstReferenceMacro(StartIndex, IndexType);
00202 itkGetConstReferenceMacro(EndIndex, IndexType);
00203
00204 itkGetConstReferenceMacro(StartContinuousIndex, ContinuousIndexType);
00205 itkGetConstReferenceMacro(EndContinuousIndex, ContinuousIndexType);
00206
00207 protected:
00208 ImageFunction();
00209 ~ImageFunction() {}
00210 void PrintSelf(std::ostream& os, Indent indent) const;
00211
00213 InputImageConstPointer m_Image;
00214
00216 IndexType m_StartIndex;
00217 IndexType m_EndIndex;
00218 ContinuousIndexType m_StartContinuousIndex;
00219 ContinuousIndexType m_EndContinuousIndex;
00220
00221 private:
00222 ImageFunction(const Self&);
00223 void operator=(const Self&);
00224
00225 };
00226
00227 }
00228
00229
00230 #define ITK_TEMPLATE_ImageFunction(_, EXPORT, x, y) namespace itk { \
00231 _(3(class EXPORT ImageFunction< ITK_TEMPLATE_3 x >)) \
00232 namespace Templates { typedef ImageFunction< ITK_TEMPLATE_3 x > ImageFunction##y; } \
00233 }
00234
00235 #if ITK_TEMPLATE_EXPLICIT
00236 # include "Templates/itkImageFunction+-.h"
00237 #endif
00238
00239 #if ITK_TEMPLATE_TXX
00240 # include "itkImageFunction.txx"
00241 #endif
00242
00243 #endif
00244