X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=filters%2FclitkImageConvertGenericFilter.cxx;h=b4b8bc466bf0d0a07ac9c6a543e9fe9733b2bc4c;hb=7f78d7b6b6bca61ca0aae964a6747cd769c0ba94;hp=6afb8ab74f9ed85a881b2981591115690c13d29e;hpb=931a42358442f4ee4f314613c991c838d4b4e3b7;p=clitk.git diff --git a/filters/clitkImageConvertGenericFilter.cxx b/filters/clitkImageConvertGenericFilter.cxx index 6afb8ab..b4b8bc4 100644 --- a/filters/clitkImageConvertGenericFilter.cxx +++ b/filters/clitkImageConvertGenericFilter.cxx @@ -15,25 +15,38 @@ #include "clitkImageConvertGenericFilter.h" //-------------------------------------------------------------------- -clitk::ImageConvertGenericFilter::ImageConvertGenericFilter():ImageToImageGenericFilter() { +clitk::ImageConvertGenericFilter::ImageConvertGenericFilter(): + clitk::ImageToImageGenericFilter("ImageConvert") { mOutputPixelTypeName = "NotSpecified"; + InitializeImageType<2>(); + InitializeImageType<3>(); + InitializeImageType<4>(); } //-------------------------------------------------------------------- + +//-------------------------------------------------------------------- +template +void clitk::ImageConvertGenericFilter::InitializeImageType() { + ADD_IMAGE_TYPE(Dim, char); + ADD_IMAGE_TYPE(Dim, short); + ADD_IMAGE_TYPE(Dim, unsigned short); + ADD_IMAGE_TYPE(Dim, int); + ADD_IMAGE_TYPE(Dim, float); + ADD_IMAGE_TYPE(Dim, double); +} //-------------------------------------------------------------------- -void clitk::ImageConvertGenericFilter::Update() { - // Load image header - itk::ImageIOBase::Pointer header = clitk::readImageHeader(mInputFilenames[0]); - // Determine dim, pixel type, number of components - mDim = header->GetNumberOfDimensions(); - mPixelTypeName = header->GetComponentTypeAsString(header->GetComponentType()); - mNbOfComponents = header->GetNumberOfComponents(); + +//-------------------------------------------------------------------- +template +void clitk::ImageConvertGenericFilter::UpdateWithInputImageType() { // Verbose stuff if (mIOVerbose) { if (mInputFilenames.size() == 1) { std::cout << "Input image <" << mInputFilenames[0] << "> is "; + itk::ImageIOBase::Pointer header = clitk::readImageHeader(mInputFilenames[0]); printImageHeader(header, std::cout); std::cout << std::endl; } @@ -47,16 +60,82 @@ void clitk::ImageConvertGenericFilter::Update() { } } - // Switch by dimension - if (mInputFilenames.size() > 1) mDim++; - if (mDim == 2) { Update_WithDim<2>(); return; } - if (mDim == 3) { Update_WithDim<3>(); return; } - if (mDim == 4) { Update_WithDim<4>(); return; } - std::cerr << "Error, dimension of input image is " << mDim << ", but I only work with 2,3,4." << std::endl; - exit(0); + if ((mPixelTypeName == mOutputPixelTypeName) || (mOutputPixelTypeName == "NotSpecified")) { + // typename InputImageType::Pointer input = clitk::readImage(mInputFilenames); + typename InputImageType::Pointer input = this->template GetInput(0); + //clitk::writeImage(input, mOutputFilename, mIOVerbose); + this->SetNextOutput(input); + } + else { +#define TRY_TYPE(TYPE) \ + if (IsSameType(mOutputPixelTypeName)) { UpdateWithOutputType(); return; } + TRY_TYPE(char); + // TRY_TYPE(signed char); + TRY_TYPE(uchar); + TRY_TYPE(short); + TRY_TYPE(ushort); + TRY_TYPE(int); // no uint ... + TRY_TYPE(float); + TRY_TYPE(double); +#undef TRY_TYPE + + std::string list = CreateListOfTypes(); + std::cerr << "Error, I don't know the output type '" << mOutputPixelTypeName + << "'. " << std::endl << "Known types are " << list << "." << std::endl; + exit(0); + } } -//-------------------------------------------------------------------- +//==================================================================== + +//==================================================================== +template +void clitk::ImageConvertGenericFilter::UpdateWithOutputType() { + // Read + typename InputImageType::Pointer input =this->template GetInput(0); + + // Typedef + typedef typename InputImageType::PixelType PixelType; + + // Warning + if (std::numeric_limits::is_signed) { + if (!std::numeric_limits::is_signed) { + std::cerr << "Warning, input type is signed (" << mPixelTypeName << ") while output type is not (" + << mOutputPixelTypeName << "), use at your own responsability." << std::endl; + } + } + if (!std::numeric_limits::is_integer) { + if (std::numeric_limits::is_integer) { + std::cerr << "Warning, input type is not integer (" << mPixelTypeName << ") while output type is (" + << mOutputPixelTypeName << "), use at your own responsability." << std::endl; + } + } + // DD(std::numeric_limits::digits10); + // DD(std::numeric_limits::digits10); + if (!std::numeric_limits::is_integer) { + if (std::numeric_limits::is_integer) { + std::cerr << "Warning, input type is not integer (" << mPixelTypeName << ") while output type is (" + << mOutputPixelTypeName << "), use at your own responsability." << std::endl; + } + } + if (std::numeric_limits::digits10 > std::numeric_limits::digits10) { + std::cerr << "Warning, possible loss of precision : input type is (" << mPixelTypeName << ") while output type is (" + << mOutputPixelTypeName << "), use at your own responsability." << std::endl; + } + + // Cast + typedef itk::Image OutputImageType; + typedef itk::CastImageFilter FilterType; + typename FilterType::Pointer filter = FilterType::New(); + filter->SetInput(input); + filter->Update(); + + // Write + SetNextOutput(filter->GetOutput()); + //clitk::writeImage(filter->GetOutput(), mOutputFilename, mIOVerbose); +} +//==================================================================== + #endif /* end #define CLITKIMAGECONVERTGENERICFILTER_CXX */