From 43be439f9fac109acc0518205a34c28d47f85678 Mon Sep 17 00:00:00 2001 From: Romulo Pinho Date: Tue, 21 Feb 2012 15:34:51 +0100 Subject: [PATCH] new vector cast filter - contrary to ITK's equivalent, supports fields with different number components per pixel --- itk/itkFlexibleVectorCastImageFilter.h | 113 +++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 itk/itkFlexibleVectorCastImageFilter.h diff --git a/itk/itkFlexibleVectorCastImageFilter.h b/itk/itkFlexibleVectorCastImageFilter.h new file mode 100644 index 0000000..1e73a92 --- /dev/null +++ b/itk/itkFlexibleVectorCastImageFilter.h @@ -0,0 +1,113 @@ +/*========================================================================= + + Program: Insight Segmentation & Registration Toolkit + Module: $RCSfile: itkFlexibleVectorCastImageFilter.h,v $ + Language: C++ + Date: $Date: 2008-10-17 16:30:53 $ + Version: $Revision: 1.16 $ + + Copyright (c) Insight Software Consortium. All rights reserved. + See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#ifndef __itkFlexibleVectorCastImageFilter_h +#define __itkFlexibleVectorCastImageFilter_h + +#include "itkUnaryFunctorImageFilter.h" +#include "itkNumericTraitsFixedArrayPixel.h" + +namespace itk +{ + +/** \class FlexibleVectorCastImageFilter + * + * \brief Casts input vector pixels to output vector pixel type. + * + * This filter is templated over the input image type and + * output image type. + * + * The filter expect both images to have the same number of dimensions, + * and that both the input and output have itk::Vector pixel types + * of the same VectorDimension. + * + * \sa Vector + * + * \ingroup IntensityImageFilters Multithreaded + */ +namespace Functor { + +template< class TInput, class TOutput> +class FlexibleVectorCast +{ +public: + FlexibleVectorCast() {} + ~FlexibleVectorCast() {} + bool operator!=( const FlexibleVectorCast & ) const + { + return false; + } + bool operator==( const FlexibleVectorCast & other ) const + { + return !(*this != other); + } + inline TOutput operator()( const TInput & A ) const + { + typedef typename TOutput::ValueType OutputValueType; + + TOutput value; + unsigned int k; + for( k = 0; k < TOutput::Dimension && k < TInput::Dimension; k++ ) + { + value[k] = static_cast( A[k] ); + } + + for (; k < TOutput::Dimension; k++) + value[k] = 0; + + return value; + } +}; +} + +template > +class ITK_EXPORT FlexibleVectorCastImageFilter : + public +UnaryFunctorImageFilter > +{ +public: + /** Standard class typedefs. */ + typedef FlexibleVectorCastImageFilter Self; + typedef UnaryFunctorImageFilter< + TInputImage,TOutputImage, + Functor::FlexibleVectorCast< typename TInputImage::PixelType, + typename TOutputImage::PixelType> > Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer ConstPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Runtime information support. */ + itkTypeMacro(FlexibleVectorCastImageFilter, + UnaryFunctorImageFilter); + +protected: + FlexibleVectorCastImageFilter() {} + virtual ~FlexibleVectorCastImageFilter() {} + +private: + FlexibleVectorCastImageFilter(const Self&); //purposely not implemented + void operator=(const Self&); //purposely not implemented + +}; + +} // end namespace itk + + +#endif -- 2.45.1