X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=tools%2FclitkImageArithmGenericFilter.txx;h=6bf79d516d92698c09bd82c29125de065b84dae7;hb=342abd5c807dab47a30d8369aca8f7e5c9242b2b;hp=1316fc145c7caf0a524a9a77f3cf9255498f2c90;hpb=6d86b71b2f5fb9737cf57e55fa809219aa07d226;p=clitk.git diff --git a/tools/clitkImageArithmGenericFilter.txx b/tools/clitkImageArithmGenericFilter.txx index 1316fc1..6bf79d5 100644 --- a/tools/clitkImageArithmGenericFilter.txx +++ b/tools/clitkImageArithmGenericFilter.txx @@ -45,8 +45,6 @@ template void ImageArithmGenericFilter::InitializeImageType() { ADD_DEFAULT_IMAGE_TYPES(Dim); - ADD_VEC_IMAGE_TYPE(3u,3u,float); - ADD_VEC_IMAGE_TYPE(3u,3u,double); } //-------------------------------------------------------------------- @@ -89,7 +87,7 @@ void ImageArithmGenericFilter::SetArgsInfo(const args_info_type exit(-1); } if ((!mArgsInfo.input2_given) && (!mArgsInfo.scalar_given)) { - if (mArgsInfo.operation_arg < 5) { + if (mArgsInfo.operation_arg < 7 || mArgsInfo.operation_arg == 10 || mArgsInfo.operation_arg == 11 || mArgsInfo.operation_arg == 13) { std::cerr << "Such operation need the --scalar option." << std::endl; exit(-1); } @@ -111,7 +109,7 @@ void ImageArithmGenericFilter::UpdateWithInputImageType() IteratorType it(input1, input1->GetLargestPossibleRegion()); // typedef input2 - typename ImageType::Pointer input2 = NULL; + typename ImageType::Pointer input2 = ITK_NULLPTR; IteratorType it2; // Special case for normalisation @@ -165,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; @@ -220,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; @@ -271,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; @@ -337,21 +336,22 @@ void clitk::ImageArithmGenericFilter::ComputeImage(Iter1 it, Ite break; case 5: // Absolute value while (!it.IsAtEnd()) { - if (it.Get() <= 0) ito.Set(PixelTypeDownCast(-it.Get())); + double value = (double)it.Get() - mScalar; + if (value <= 0) ito.Set(PixelTypeDownCast(-value)); // <= zero to avoid warning for unsigned types - else ito.Set(PixelTypeDownCast(it.Get())); + else ito.Set(value); ++it; ++ito; } break; case 6: // Squared value while (!it.IsAtEnd()) { - ito.Set(PixelTypeDownCast((double)it.Get()*(double)it.Get())); + ito.Set(PixelTypeDownCast(((double)it.Get()-mScalar)*((double)it.Get()-mScalar))); ++it; ++ito; } break; - case 7: // Log + case 7: // ln while (!it.IsAtEnd()) { if (it.Get() > 0) ito.Set(PixelTypeDownCast(log((double)it.Get()))); @@ -379,7 +379,7 @@ void clitk::ImageArithmGenericFilter::ComputeImage(Iter1 it, Ite ++ito; } break; - case 10: // exp + case 10: // EPID while (!it.IsAtEnd()) { ito.Set(PixelTypeDownCast((0x10000 - (double)it.Get())/mScalar)); ++it; @@ -393,6 +393,18 @@ void clitk::ImageArithmGenericFilter::ComputeImage(Iter1 it, Ite ++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);