X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=filters%2FclitkImageConvertGenericFilter.cxx;h=ca70097a39947126761f4d09e14d50e3518ba83c;hb=bb436e8274c510438ccb5ec1df531675321341bb;hp=6afb8ab74f9ed85a881b2981591115690c13d29e;hpb=931a42358442f4ee4f314613c991c838d4b4e3b7;p=clitk.git diff --git a/filters/clitkImageConvertGenericFilter.cxx b/filters/clitkImageConvertGenericFilter.cxx index 6afb8ab..ca70097 100644 --- a/filters/clitkImageConvertGenericFilter.cxx +++ b/filters/clitkImageConvertGenericFilter.cxx @@ -1,62 +1,157 @@ +/*========================================================================= + 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 CLITKIMAGECONVERTGENERICFILTER_CXX #define CLITKIMAGECONVERTGENERICFILTER_CXX -/** - ------------------------------------------------- - * @file clitkImageConvertGenericFilter.cxx - * @author David Sarrut - * @date 05 May 2008 10:57:19 - * - * @brief - * - * - -------------------------------------------------*/ - #include "clitkImageConvertGenericFilter.h" //-------------------------------------------------------------------- -clitk::ImageConvertGenericFilter::ImageConvertGenericFilter():ImageToImageGenericFilter() { +clitk::ImageConvertGenericFilter::ImageConvertGenericFilter(): + clitk::ImageToImageGenericFilter("ImageConvert") +{ mOutputPixelTypeName = "NotSpecified"; + mWarningOccur = false; + mWarning = ""; + mDisplayWarning = true; + InitializeImageType<2>(); + InitializeImageType<3>(); + InitializeImageType<4>(); } //-------------------------------------------------------------------- + +//-------------------------------------------------------------------- +template +void clitk::ImageConvertGenericFilter::InitializeImageType() +{ + ADD_DEFAULT_IMAGE_TYPES(Dim); +} //-------------------------------------------------------------------- -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 "; + if (m_IOVerbose) { + if (m_InputFilenames.size() == 1) { + std::cout << "Input image <" << m_InputFilenames[0] << "> is "; + itk::ImageIOBase::Pointer header = clitk::readImageHeader(m_InputFilenames[0]); printImageHeader(header, std::cout); std::cout << std::endl; - } - else { - for(unsigned int i=0; i is "; - itk::ImageIOBase::Pointer h = clitk::readImageHeader(mInputFilenames[i]); - printImageHeader(h, std::cout); - std::cout << std::endl; + } else { + for(unsigned int i=0; i is "; + itk::ImageIOBase::Pointer h = clitk::readImageHeader(m_InputFilenames[i]); + printImageHeader(h, std::cout); + std::cout << std::endl; } } } - // 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 ((m_PixelTypeName == mOutputPixelTypeName) || (mOutputPixelTypeName == "NotSpecified")) { + // typename InputImageType::Pointer input = clitk::readImage(m_InputFilenames); + typename InputImageType::Pointer input = this->template GetInput(0); + //clitk::writeImage(input, mOutputFilename, m_IOVerbose); + 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 + std::ostringstream osstream; + if (std::numeric_limits::is_signed) { + if (!std::numeric_limits::is_signed) { + osstream << "Warning, input type is signed (" << m_PixelTypeName << ") while output type is not (" + << mOutputPixelTypeName << "), use at your own responsability." << std::endl; + mWarningOccur = true; + } + } + if (!std::numeric_limits::is_integer) { + if (std::numeric_limits::is_integer) { + osstream << "Warning, input type is not integer (" << m_PixelTypeName << ") while output type is (" + << mOutputPixelTypeName << "), use at your own responsability." << std::endl; + mWarningOccur = true; + } + } + // DD(std::numeric_limits::digits10); + // DD(std::numeric_limits::digits10); + if (!std::numeric_limits::is_integer) { + if (std::numeric_limits::is_integer) { + osstream << "Warning, input type is not integer (" << m_PixelTypeName << ") while output type is (" + << mOutputPixelTypeName << "), use at your own responsability." << std::endl; + mWarningOccur = true; + } + } + if (std::numeric_limits::digits10 > std::numeric_limits::digits10) { + osstream << "Warning, possible loss of precision : input type is (" << m_PixelTypeName << ") while output type is (" + << mOutputPixelTypeName << "), use at your own responsability." << std::endl; + mWarningOccur = true; + } + + mWarning = osstream.str(); + if (mDisplayWarning) { + std::cerr << mWarning; + } + + // 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, m_IOVerbose); +} +//==================================================================== + #endif /* end #define CLITKIMAGECONVERTGENERICFILTER_CXX */