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
- 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
{
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;
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)) {
IteratorType it(input1, input1->GetLargestPossibleRegion());
// typedef input2
- typename ImageType::Pointer input2 = NULL;
+ typename ImageType::Pointer input2 = ITK_NULLPTR;
IteratorType it2;
+ // Special case for normalisation
+ if (mTypeOfOperation == 12) {
+ typedef itk::MinimumMaximumImageCalculator<ImageType> MinMaxFilterType;
+ typename MinMaxFilterType::Pointer ff = MinMaxFilterType::New();
+ ff->SetImage(input1);
+ ff->ComputeMaximum();
+ mScalar = ff->GetMaximum();
+ mTypeOfOperation = 11; // divide
+ }
if (mIsOperationUseASecondImage) {
// Read input2
// Set input image iterator
it2 = IteratorType(input2, input2->GetLargestPossibleRegion());
// Check dimension
- if (!clitk::HaveSameSizeAndSpacing<ImageType, ImageType>(input1, input2)) {
- std::cerr << "* ERROR * the images (input and input2) must have the same size & spacing";
- return;
+ if (!clitk::HaveSameSize<ImageType, ImageType>(input1, input2)) {
+ itkExceptionMacro(<< "The images (input and input2) must have the same size");
+ }
+ if(!clitk::HaveSameSpacing<ImageType, ImageType>(input1, input2)) {
+ itkWarningMacro(<< "The images (input and input2) do not have the same spacing. "
+ << "Using first input's information.");
}
}
output->SetRegions(input1->GetLargestPossibleRegion());
output->SetOrigin(input1->GetOrigin());
output->SetSpacing(input1->GetSpacing());
+ output->SetDirection(input1->GetDirection());
output->Allocate();
// Set output iterator
typedef itk::ImageRegionIterator<OutputImageType> IteratorOutputType;
break;
case 2: // Divide
while (!ito.IsAtEnd()) {
- if (it1.Get() != 0)
+ if (it2.Get() != 0)
ito.Set(PixelTypeDownCast<double, PixelType>((double)it1.Get() / (double)it2.Get()));
else ito.Set(mDefaultPixelValue);
++it1;
case 8: // Relative Difference
while (!ito.IsAtEnd()) {
if (it1.Get() != 0) ito.Set(PixelTypeDownCast<double, PixelType>(((double)it1.Get()-(double)it2.Get()))/(double)it1.Get());
- else ito.Set(0.0);
+ else ito.Set(mDefaultPixelValue);
++it1;
++it2;
++ito;
++ito;
}
break;
- case 7: // Log
+ case 7: // ln
while (!it.IsAtEnd()) {
if (it.Get() > 0)
ito.Set(PixelTypeDownCast<double, PixelType>(log((double)it.Get())));
++ito;
}
break;
+ case 11: // divide
+ while (!it.IsAtEnd()) {
+ ito.Set(PixelTypeDownCast<double, PixelType>((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<double, PixelType>(-log((double)it.Get() / mScalar)) );
+ }
+ ++it;
+ ++ito;
+ }
+ break;
default: // error ?
std::cerr << "ERROR : the operation number (" << mTypeOfOperation << ") is not known." << std::endl;
exit(-1);
}
//--------------------------------------------------------------------
+
+
} // end namespace
#endif //#define CLITKIMAGEARITHMGENERICFILTER_TXX