/*========================================================================= Program: vv http://www.creatis.insa-lyon.fr/rio/vv Authors belong to: - University of LYON http://www.universite-lyon.fr/ - Léon Bérard cancer center http://www.centreleonberard.fr - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the copyright notices for more information. It is distributed under dual licence - BSD See included LICENSE.txt file - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html ===========================================================================**/ #ifndef __itkRayCastInterpolateImageFunctionWithOrigin_h #define __itkRayCastInterpolateImageFunctionWithOrigin_h #include "itkInterpolateImageFunction.h" #include "itkTransform.h" #include "itkVector.h" namespace itk { /** \class RayCastInterpolateImageFunctionWithOrigin * \brief Projective interpolation of an image at specified positions. * * RayCastInterpolateImageFunctionWithOrigin casts rays through a 3-dimensional * image and uses bilinear interpolation to integrate each plane of * voxels traversed. * * \warning This interpolator works for 3-dimensional images only. * * \ingroup ImageFunctions */ template class ITK_EXPORT RayCastInterpolateImageFunctionWithOrigin : public InterpolateImageFunction { public: /** Standard class typedefs. */ typedef RayCastInterpolateImageFunctionWithOrigin Self; typedef InterpolateImageFunction Superclass; typedef SmartPointer Pointer; typedef SmartPointer ConstPointer; /** Constants for the image dimensions */ itkStaticConstMacro(InputImageDimension, unsigned int, TInputImage::ImageDimension); /** * Type of the Transform Base class * The fixed image should be a 3D image */ typedef Transform TransformType; typedef typename TransformType::Pointer TransformPointer; typedef typename TransformType::InputPointType InputPointType; typedef typename TransformType::OutputPointType OutputPointType; typedef typename TransformType::ParametersType TransformParametersType; typedef typename TransformType::JacobianType TransformJacobianType; typedef typename Superclass::InputPixelType PixelType; typedef typename TInputImage::SizeType SizeType; typedef Vector DirectionType; /** Type of the Interpolator Base class */ typedef InterpolateImageFunction InterpolatorType; typedef typename InterpolatorType::Pointer InterpolatorPointer; /** Run-time type information (and related methods). */ itkTypeMacro(RayCastInterpolateImageFunctionWithOrigin, InterpolateImageFunction); /** Method for creation through the object factory. */ itkNewMacro(Self); /** OutputType typedef support. */ typedef typename Superclass::OutputType OutputType; /** InputImageType typedef support. */ typedef typename Superclass::InputImageType InputImageType; /** RealType typedef support. */ typedef typename Superclass::RealType RealType; /** Dimension underlying input image. */ itkStaticConstMacro(ImageDimension, unsigned int,Superclass::ImageDimension); /** Point typedef support. */ typedef typename Superclass::PointType PointType; /** Index typedef support. */ typedef typename Superclass::IndexType IndexType; /** ContinuousIndex typedef support. */ typedef typename Superclass::ContinuousIndexType ContinuousIndexType; /** \brief * Interpolate the image at a point position. * * Returns the interpolated image intensity at a * specified point position. No bounds checking is done. * The point is assume to lie within the image buffer. * * ImageFunction::IsInsideBuffer() can be used to check bounds before * calling the method. */ virtual OutputType Evaluate( const PointType& point ) const; /** Interpolate the image at a continuous index position * * Returns the interpolated image intensity at a * specified index position. No bounds checking is done. * The point is assume to lie within the image buffer. * * Subclasses must override this method. * * ImageFunction::IsInsideBuffer() can be used to check bounds before * calling the method. */ virtual OutputType EvaluateAtContinuousIndex( const ContinuousIndexType &index ) const; /** Connect the Transform. */ itkSetObjectMacro( Transform, TransformType ); /** Get a pointer to the Transform. */ itkGetObjectMacro( Transform, TransformType ); /** Connect the Interpolator. */ itkSetObjectMacro( Interpolator, InterpolatorType ); /** Get a pointer to the Interpolator. */ itkGetObjectMacro( Interpolator, InterpolatorType ); /** Connect the Interpolator. */ itkSetMacro( FocalPoint, InputPointType ); /** Get a pointer to the Interpolator. */ itkGetMacro( FocalPoint, InputPointType ); /** Connect the Transform. */ itkSetMacro( Threshold, double ); /** Get a pointer to the Transform. */ itkGetMacro( Threshold, double ); /** Check if a point is inside the image buffer. * \warning For efficiency, no validity checking of * the input image pointer is done. */ inline bool IsInsideBuffer( const PointType & ) const { return true; } bool IsInsideBuffer( const ContinuousIndexType & ) const { return true; } bool IsInsideBuffer( const IndexType & ) const { return true; } protected: /// Constructor RayCastInterpolateImageFunctionWithOrigin(); /// Destructor ~RayCastInterpolateImageFunctionWithOrigin(){}; /// Print the object void PrintSelf(std::ostream& os, Indent indent) const; /// Transformation used to calculate the new focal point position TransformPointer m_Transform; /// The focal point or position of the ray source InputPointType m_FocalPoint; /// The threshold above which voxels along the ray path are integrated. double m_Threshold; /// Pointer to the interpolator InterpolatorPointer m_Interpolator; private: RayCastInterpolateImageFunctionWithOrigin( const Self& ); //purposely not implemented void operator=( const Self& ); //purposely not implemented }; } // namespace itk #ifndef ITK_MANUAL_INSTANTIATION #include "itkRayCastInterpolateImageFunctionWithOrigin.txx" #endif #endif