X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=tools%2FclitkImageConvertGenericFilter.h;h=20717144431725a5f793d061467e10f170dc61bb;hb=0c56fa9705f9abdc98db8e0da1933ad3e5a3e192;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..2071714 --- 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,6 +70,8 @@ namespace clitk { itkNewMacro(Self); // Members functions + std::string GetInputPixelTypeName() { return m_PixelTypeName; } + std::string GetOutputPixelTypeName() { return mOutputPixelTypeName; } void SetOutputPixelType(std::string p) { mOutputPixelTypeName = p; } bool IsWarningOccur() { return mWarningOccur; } std::string & GetWarning() { return mWarning; } @@ -61,18 +82,138 @@ 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(); - + 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