/*========================================================================= 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://oncora1.lyon.fnclcc.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 __clitkRayCastInterpolateImageFunctionWithOrigin_h #define __clitkRayCastInterpolateImageFunctionWithOrigin_h #include "clitkBSplineDeformableTransform.h" #include "itkInterpolateImageFunction.h" #include "itkTransform.h" #include "itkVector.h" namespace clitk { template class ITK_EXPORT RayCastInterpolateImageFunctionWithOrigin : public itk::InterpolateImageFunction { public: /** Standard class typedefs. */ typedef RayCastInterpolateImageFunctionWithOrigin Self; typedef itk::InterpolateImageFunction Superclass; typedef itk::SmartPointer Pointer; typedef itk::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 itk::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 itk::Vector DirectionType; /** Type of the Interpolator Base class */ typedef itk::InterpolateImageFunction InterpolatorType; typedef typename InterpolatorType::Pointer InterpolatorPointer; //JV Type of the Interpolator for the transform typedef itk::InterpolateImageFunction DeformableTransformInterpolatorType; typedef typename DeformableTransformInterpolatorType::Pointer DeformableTransformInterpolatorPointer; /** 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 focalPoint. */ itkSetMacro( FocalPoint, InputPointType ); /** Get a pointer to the focalpoint. */ itkGetMacro( FocalPoint, InputPointType ); /** Connect the threshold. */ itkSetMacro( Threshold, double ); /** Get a pointer to the threshhold. */ 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; } //JV transform is deformable itkSetMacro( TransformIsDeformable, bool ); itkGetMacro( TransformIsDeformable, bool ); //JV interpolator for deformable transform itkSetObjectMacro( DeformableTransformInterpolator, DeformableTransformInterpolatorType ); itkGetObjectMacro( DeformableTransformInterpolator, DeformableTransformInterpolatorType ); protected: /// Constructor RayCastInterpolateImageFunctionWithOrigin(); /// Destructor ~RayCastInterpolateImageFunctionWithOrigin(){}; /// Print the object void PrintSelf(std::ostream& os, itk::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; //JV Pointer to the deformable transform interpolator DeformableTransformInterpolatorPointer m_DeformableTransformInterpolator; //JV Transform is deformable: fetch interpolated value at transformed intersect bool m_TransformIsDeformable; private: RayCastInterpolateImageFunctionWithOrigin( const Self& ); //purposely not implemented void operator=( const Self& ); //purposely not implemented }; } // namespace clitk #ifndef ITK_MANUAL_INSTANTIATION #include "clitkRayCastInterpolateImageFunctionWithOrigin.txx" #endif #endif