X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=tools%2FclitkImageArithmGenericFilter.txx;h=b2733472d66c54d5d3f41c9dc508522faec9cbb5;hb=5578995d9a82792833333eeb3dd5c8ecac967293;hp=e925f21ee177af3d5f34738891f209402ac794ff;hpb=a26cd8a19e1b9ad8344ab501436045f171a73713;p=clitk.git diff --git a/tools/clitkImageArithmGenericFilter.txx b/tools/clitkImageArithmGenericFilter.txx old mode 100755 new mode 100644 index e925f21..b273347 --- a/tools/clitkImageArithmGenericFilter.txx +++ b/tools/clitkImageArithmGenericFilter.txx @@ -3,7 +3,7 @@ Authors belong to: - University of LYON http://www.universite-lyon.fr/ - - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr + - Léon Bérard cancer center http://www.centreleonberard.fr - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr This software is distributed WITHOUT ANY WARRANTY; without even @@ -14,12 +14,14 @@ - BSD See included LICENSE.txt file - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html -======================================================================-====*/ +===========================================================================**/ #ifndef CLITKIMAGEARITHMGENERICFILTER_TXX #define CLITKIMAGEARITHMGENERICFILTER_TXX #include "clitkImageCommon.h" +#include "itkMinimumMaximumImageCalculator.h" + namespace clitk { @@ -63,7 +65,7 @@ void ImageArithmGenericFilter::SetArgsInfo(const args_info_type mArgsInfo=a; // Set value - SetIOVerbose(mArgsInfo.verbose_flag); + this->SetIOVerbose(mArgsInfo.verbose_flag); mTypeOfOperation = mArgsInfo.operation_arg; mDefaultPixelValue = mArgsInfo.pixelValue_arg; mScalar = mArgsInfo.scalar_arg; @@ -71,13 +73,13 @@ void ImageArithmGenericFilter::SetArgsInfo(const args_info_type if (mArgsInfo.imagetypes_flag) this->PrintAvailableImageTypes(); - if (mArgsInfo.input1_given) AddInputFilename(mArgsInfo.input1_arg); + if (mArgsInfo.input1_given) this->AddInputFilename(mArgsInfo.input1_arg); if (mArgsInfo.input2_given) { mIsOperationUseASecondImage = true; - AddInputFilename(mArgsInfo.input2_arg); + this->AddInputFilename(mArgsInfo.input2_arg); } - if (mArgsInfo.output_given) SetOutputFilename(mArgsInfo.output_arg); + if (mArgsInfo.output_given) this->SetOutputFilename(mArgsInfo.output_arg); // Check type of operation (with scalar or with other image) if ((mArgsInfo.input2_given) && (mArgsInfo.scalar_given)) { @@ -107,20 +109,32 @@ void ImageArithmGenericFilter::UpdateWithInputImageType() IteratorType it(input1, input1->GetLargestPossibleRegion()); // typedef input2 - typename ImageType::Pointer input2 = this->template GetInput(1); + typename ImageType::Pointer input2 = ITK_NULLPTR; IteratorType it2; - // Check dimension - if (!clitk::HaveSameSizeAndSpacing(input1, input2)) { - std::cerr << "* ERROR * the images (input and input2) must have the same size & spacing"; - return; + // Special case for normalisation + if (mTypeOfOperation == 12) { + typedef itk::MinimumMaximumImageCalculator MinMaxFilterType; + typename MinMaxFilterType::Pointer ff = MinMaxFilterType::New(); + ff->SetImage(input1); + ff->ComputeMaximum(); + mScalar = ff->GetMaximum(); + mTypeOfOperation = 11; // divide } if (mIsOperationUseASecondImage) { - // Read input2 - input2 = this->template GetInput(1); - // Set input image iterator - it2 = IteratorType(input2, input2->GetLargestPossibleRegion()); + // Read input2 + input2 = this->template GetInput(1); + // Set input image iterator + it2 = IteratorType(input2, input2->GetLargestPossibleRegion()); + // Check dimension + if (!clitk::HaveSameSize(input1, input2)) { + itkExceptionMacro(<< "The images (input and input2) must have the same size"); + } + if(!clitk::HaveSameSpacing(input1, input2)) { + itkWarningMacro(<< "The images (input and input2) do not have the same spacing. " + << "Using first input's information."); + } } // Check if overwrite and outputisfloat and pixeltype is not float -> do not overwrite @@ -149,6 +163,7 @@ void ImageArithmGenericFilter::UpdateWithInputImageType() output->SetRegions(input1->GetLargestPossibleRegion()); output->SetOrigin(input1->GetOrigin()); output->SetSpacing(input1->GetSpacing()); + output->SetDirection(input1->GetDirection()); output->Allocate(); // Set output iterator typedef itk::ImageRegionIterator IteratorOutputType; @@ -204,7 +219,7 @@ void ImageArithmGenericFilter::ComputeImage(Iter1 it1, Iter2 it break; case 2: // Divide while (!ito.IsAtEnd()) { - if (it1.Get() != 0) + if (it2.Get() != 0) ito.Set(PixelTypeDownCast((double)it1.Get() / (double)it2.Get())); else ito.Set(mDefaultPixelValue); ++it1; @@ -229,7 +244,6 @@ void ImageArithmGenericFilter::ComputeImage(Iter1 it1, Iter2 it } break; case 5: // Absolute difference - DD("AbsoluteDifff"); while (!ito.IsAtEnd()) { ito.Set(PixelTypeDownCast(fabs((double)it2.Get()-(double)it1.Get()))); ++it1; @@ -256,7 +270,7 @@ void ImageArithmGenericFilter::ComputeImage(Iter1 it1, Iter2 it case 8: // Relative Difference while (!ito.IsAtEnd()) { if (it1.Get() != 0) ito.Set(PixelTypeDownCast(((double)it1.Get()-(double)it2.Get()))/(double)it1.Get()); - else ito.Set(0.0); + else ito.Set(mDefaultPixelValue); ++it1; ++it2; ++ito; @@ -336,7 +350,7 @@ void clitk::ImageArithmGenericFilter::ComputeImage(Iter1 it, Ite ++ito; } break; - case 7: // Log + case 7: // ln while (!it.IsAtEnd()) { if (it.Get() > 0) ito.Set(PixelTypeDownCast(log((double)it.Get()))); @@ -364,6 +378,32 @@ void clitk::ImageArithmGenericFilter::ComputeImage(Iter1 it, Ite ++ito; } break; + case 10: // exp + while (!it.IsAtEnd()) { + ito.Set(PixelTypeDownCast((0x10000 - (double)it.Get())/mScalar)); + ++it; + ++ito; + } + break; + case 11: // divide + while (!it.IsAtEnd()) { + ito.Set(PixelTypeDownCast((double)it.Get() / mScalar) ); + ++it; + ++ito; + } + break; + case 13: // -ln I/I0 + while (!it.IsAtEnd()) { + if (it.Get() == 0) { // special case for fluence image with 0 value in a pixel -> consider 0.5 + ito.Set(-log(0.5 / mScalar) ); + } + else { + ito.Set(PixelTypeDownCast(-log((double)it.Get() / mScalar)) ); + } + ++it; + ++ito; + } + break; default: // error ? std::cerr << "ERROR : the operation number (" << mTypeOfOperation << ") is not known." << std::endl; exit(-1); @@ -371,6 +411,8 @@ void clitk::ImageArithmGenericFilter::ComputeImage(Iter1 it, Ite } //-------------------------------------------------------------------- + + } // end namespace #endif //#define CLITKIMAGEARITHMGENERICFILTER_TXX