itkImageFunction.h
Go to the documentation of this file.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<
00073 Point<TCoordRep, 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
00136 virtual bool IsInsideBuffer( const IndexType & index ) const
00137 {
00138 for( unsigned int j = 0; j < ImageDimension; j++ )
00139 {
00140 if( index[j] < m_StartIndex[j] )
00141 {
00142 return false;
00143 }
00144 if( index[j] > m_EndIndex[j] )
00145 {
00146 return false;
00147 }
00148 }
00149 return true;
00150 }
00152
00156 virtual bool IsInsideBuffer( const ContinuousIndexType & index ) const
00157 {
00158 for( unsigned int j = 0; j < ImageDimension; j++ )
00159 {
00160 if( index[j] < m_StartContinuousIndex[j] )
00161 {
00162 return false;
00163 }
00164 #ifdef ITK_USE_CENTERED_PIXEL_COORDINATES_CONSISTENTLY
00165 if( index[j] >= m_EndContinuousIndex[j] )
00166 #else
00167 if( index[j] > m_EndContinuousIndex[j] )
00168 #endif
00169 {
00170 return false;
00171 }
00172 }
00173 return true;
00174 }
00176
00180 virtual bool IsInsideBuffer( const PointType & point ) const
00181 {
00182 ContinuousIndexType index;
00183 m_Image->TransformPhysicalPointToContinuousIndex( point, index );
00184 return this->IsInsideBuffer( index );
00185 }
00187
00189 void ConvertPointToNearestIndex( const PointType & point,
00190 IndexType & index ) const
00191 {
00192 ContinuousIndexType cindex;
00193 m_Image->TransformPhysicalPointToContinuousIndex( point, cindex );
00194 this->ConvertContinuousIndexToNearestIndex( cindex, index );
00195 }
00197
00199 void ConvertPointToContinousIndex( const PointType & point,
00200 ContinuousIndexType & cindex ) const
00201 {
00202 itkWarningMacro("Please change your code to use ConvertPointToContinuousIndex "
00203 << "rather than ConvertPointToContinousIndex. The latter method name was "
00204 << "mispelled and the ITK developers failed to correct it before it was released."
00205 << "The mispelled method name is retained in order to maintain backward compatibility.");
00206 this->ConvertPointToContinuousIndex( point, cindex );
00207 }
00209
00211 void ConvertPointToContinuousIndex( const PointType & point,
00212 ContinuousIndexType & cindex ) const
00213 {
00214 m_Image->TransformPhysicalPointToContinuousIndex( point, cindex );
00215 }
00216
00218 inline void ConvertContinuousIndexToNearestIndex( const ContinuousIndexType & cindex,
00219 IndexType & index ) const
00220 {
00221 index.CopyWithRound( cindex );
00222 }
00223
00224 itkGetConstReferenceMacro(StartIndex, IndexType);
00225 itkGetConstReferenceMacro(EndIndex, IndexType);
00226
00227 itkGetConstReferenceMacro(StartContinuousIndex, ContinuousIndexType);
00228 itkGetConstReferenceMacro(EndContinuousIndex, ContinuousIndexType);
00229
00230 protected:
00231 ImageFunction();
00232 ~ImageFunction() {}
00233 void PrintSelf(std::ostream& os, Indent indent) const;
00234
00236 InputImageConstPointer m_Image;
00237
00239 IndexType m_StartIndex;
00240 IndexType m_EndIndex;
00241 ContinuousIndexType m_StartContinuousIndex;
00242 ContinuousIndexType m_EndContinuousIndex;
00243
00244 private:
00245 ImageFunction(const Self&);
00246 void operator=(const Self&);
00247
00248 };
00249
00250 }
00251
00252
00253
00254 #define ITK_TEMPLATE_ImageFunction(_, EXPORT, x, y) namespace itk { \
00255 _(3(class EXPORT ImageFunction< ITK_TEMPLATE_3 x >)) \
00256 namespace Templates { typedef ImageFunction< ITK_TEMPLATE_3 x > ImageFunction##y; } \
00257 }
00258
00259 #if ITK_TEMPLATE_EXPLICIT
00260 # include "Templates/itkImageFunction+-.h"
00261 #endif
00262
00263 #if ITK_TEMPLATE_TXX
00264 # include "itkImageFunction.txx"
00265 #endif
00266
00267 #endif
00268