X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=tools%2FclitkImageConvertGenericFilter.h;h=8ffb360596833d0225c6b022cc9dd04711dc544d;hb=d2264227eb56300989795b8fd305cc3e1cfbe081;hp=6064b1821dbd0a6593c063fa452b8c05021bdeda;hpb=765020625fbc092d283e221e36c83e60a1844cb7;p=clitk.git diff --git a/tools/clitkImageConvertGenericFilter.h b/tools/clitkImageConvertGenericFilter.h old mode 100755 new mode 100644 index 6064b18..8ffb360 --- a/tools/clitkImageConvertGenericFilter.h +++ b/tools/clitkImageConvertGenericFilter.h @@ -32,9 +32,28 @@ // itk include #include "itkCastImageFilter.h" +#include "itkVectorCastImageFilter.h" + namespace clitk { + template + class ImageConvertTraits + { + public: + enum { IS_VECTOR = false }; + ImageConvertTraits() { + TPixel p = "SCALAR"; + } + }; + + template < class TPixel, unsigned int Comp > + class ImageConvertTraits< itk::Vector > + { + public: + enum { IS_VECTOR = true }; + }; + class ImageConvertGenericFilter: public clitk::ImageToImageGenericFilter { @@ -51,7 +70,10 @@ namespace clitk { itkNewMacro(Self); // Members functions + std::string GetInputPixelTypeName() { return m_PixelTypeName; } + std::string GetOutputPixelTypeName() { return mOutputPixelTypeName; } void SetOutputPixelType(std::string p) { mOutputPixelTypeName = p; } + void SetVV(bool b) { mVV = b; } bool IsWarningOccur() { return mWarningOccur; } std::string & GetWarning() { return mWarning; } void EnableDisplayWarning(bool b) { mDisplayWarning = b; } @@ -61,18 +83,139 @@ namespace clitk { template void UpdateWithInputImageType(); + template + void CheckTypes(std::string inType, std::string outType); + protected: + template void InitializeImageType(); std::string mOutputPixelTypeName; std::string mWarning; bool mWarningOccur; bool mDisplayWarning; - - template void UpdateWithOutputType(); - + bool mVV; + + private: + template + class UpdateWithSelectiveOutputType + { + public: + static bool Run(ImageConvertGenericFilter& filter, std::string outputPixelType) + { + if (IsSameType(outputPixelType)) + UpdateWithOutputType(filter); + else if (IsSameType(outputPixelType)) + UpdateWithOutputType(filter); + else if (IsSameType(outputPixelType)) + UpdateWithOutputType(filter); + else if (IsSameType(outputPixelType)) + UpdateWithOutputType(filter); + else if (IsSameType(outputPixelType)) + UpdateWithOutputType(filter); + else if (IsSameType(outputPixelType)) + UpdateWithOutputType(filter); + else if (IsSameType(outputPixelType)) + UpdateWithOutputType(filter); + else + { + std::string list = CreateListOfTypes(); + std::cerr << "Error, I don't know the vector output type '" << outputPixelType + << "'. " << std::endl << "Known types are " << list << "." << std::endl; + return false; + } + + return true; + } + + private: + + template + static void UpdateWithOutputType(ImageConvertGenericFilter& filter) + { + // Read + typename InputImageType::Pointer input =filter.template GetInput(0); + + // Typedef + typedef typename InputImageType::PixelType PixelType; + + // Warning + filter.CheckTypes(filter.GetInputPixelTypeName(), filter.GetOutputPixelTypeName()); + + // Cast + typedef itk::Image OutputImageType; + typedef itk::CastImageFilter FilterType; + typename FilterType::Pointer cast_filter = FilterType::New(); + cast_filter->SetInput(input); + cast_filter->Update(); + + // Write + filter.SetNextOutput(cast_filter->GetOutput()); + } + }; + + template + class UpdateWithSelectiveOutputType + { + public: + static bool Run(ImageConvertGenericFilter& filter, std::string outputPixelType) + { + /* + // RP: future conversions? + if (IsSameType(outputPixelType)) + UpdateWithOutputVectorType(); + else if (IsSameType(outputPixelType)) + UpdateWithOutputVectorType(); + else if (IsSameType(outputPixelType)) + UpdateWithOutputVectorType(); + else if (IsSameType(outputPixelType)) + UpdateWithOutputVectorType(); + else if (IsSameType(outputPixelType)) + UpdateWithOutputVectorType(); + else + */ + if (IsSameType(outputPixelType)) + UpdateWithOutputVectorType(filter); + else if (IsSameType(outputPixelType)) + UpdateWithOutputVectorType(filter); + else + { + std::string list = CreateListOfTypes(); + std::cerr << "Error, I don't know the vector output type '" << outputPixelType + << "'. " << std::endl << "Known types are " << list << "." << std::endl; + return false; + } + + return true; + } + + private: + + template + static void UpdateWithOutputVectorType(ImageConvertGenericFilter& filter) + { + // Read + typename InputImageType::Pointer input =filter.template GetInput(0); + + // Typedef + typedef typename InputImageType::PixelType::ValueType PixelType; + + // Warning + filter.CheckTypes(filter.GetInputPixelTypeName(), filter.GetOutputPixelTypeName()); + + // Cast + typedef itk::Image, InputImageType::ImageDimension> OutputImageType; + typedef itk::VectorCastImageFilter FilterType; + typename FilterType::Pointer cast_filter = FilterType::New(); + cast_filter->SetInput(input); + cast_filter->Update(); + + // Write + filter.SetNextOutput(cast_filter->GetOutput()); + } + }; }; // end class ImageConvertGenericFilter - //#include "clitkImageConvertGenericFilter.txx" +//#include "clitkImageConvertGenericFilter.txx" } // end namespace