19 #include <itkArithmeticOpsFunctors.h> 21 #include "itkUnaryFunctorImageFilter.h" 22 #include <itkBinaryFunctorImageFilter.h> 24 #include <itkTanImageFilter.h> 25 #include <itkAtanImageFilter.h> 26 #include <itkCosImageFilter.h> 27 #include <itkAcosImageFilter.h> 28 #include <itkSinImageFilter.h> 29 #include <itkAsinImageFilter.h> 30 #include <itkRoundImageFilter.h> 31 #include <itkSquareImageFilter.h> 32 #include <itkSqrtImageFilter.h> 33 #include <itkAbsImageFilter.h> 34 #include <itkExpImageFilter.h> 35 #include <itkExpNegativeImageFilter.h> 36 #include <itkLog10ImageFilter.h> 43 template<
class TInput,
class TOutput>
55 return !(*
this != other);
57 inline TOutput operator()(
const TInput & A)
const 62 bool valueLeft =
false;
65 template<
class TInput,
class TOutput>
77 return !(*
this != other);
79 inline TOutput operator()(
const TInput & A)
const 87 bool valueLeft =
false;
90 template<
class TInput,
class TOutput>
100 bool operator==(
const MultValue & other)
const 102 return !(*
this != other);
104 inline TOutput operator()(
const TInput & A)
const 109 bool valueLeft =
false;
112 template<
class TInput,
class TOutput>
124 return !(*
this != other);
126 inline TOutput operator()(
const TInput & A)
const 134 bool valueLeft =
false;
137 template<
class TInput,
class TOutput>
149 return !(*
this != other);
151 inline TOutput operator()(
const TInput & A)
const 154 return static_cast<TOutput
>(std::pow(value, A));
156 return static_cast<TOutput
>(std::pow(A, value));
159 bool valueLeft =
false;
166 template<
typename DefaultFunctorType,
typename DoubleFunctorType,
typename ImageType,
typename DoubleImageType >
169 typedef itk::UnaryFunctorImageFilter< ImageType, ImageType, DefaultFunctorType > DefaultFilterType;
170 typedef itk::UnaryFunctorImageFilter< ImageType, DoubleImageType, DoubleFunctorType > DoubleFilterType;
172 if (returnDoubleImage)
174 typename DoubleFilterType::Pointer filter = DoubleFilterType::New();
175 filter->SetInput(imageA);
176 filter->GetFunctor().valueLeft = valueLeft;
177 filter->GetFunctor().value = value;
183 typename DefaultFilterType::Pointer filter = DefaultFilterType::New();
184 filter->SetInput(imageA);
185 filter->GetFunctor().valueLeft = valueLeft;
186 filter->GetFunctor().value = value;
192 template<
typename DefaultFunctorType,
typename DoubleFunctorType,
typename ImageType,
typename DoubleImageType >
195 typedef itk::UnaryFunctorImageFilter< ImageType, ImageType, DefaultFunctorType > DefaultFilterType;
196 typedef itk::UnaryFunctorImageFilter< ImageType, DoubleImageType, DoubleFunctorType > DoubleFilterType;
198 if (returnDoubleImage)
200 typename DoubleFilterType::Pointer filter = DoubleFilterType::New();
201 filter->SetInput(imageA);
207 typename DefaultFilterType::Pointer filter = DefaultFilterType::New();
208 filter->SetInput(imageA);
214 template<
typename TPixel,
unsigned int VImageDimension>
217 typedef itk::Image<TPixel, VImageDimension>
ImageType;
218 typedef itk::Image<double, VImageDimension> DoubleOutputType;
222 case mitk::NonStaticArithmeticOperation::OperationsEnum::AddValue:
223 ExecuteOneImageFilterWithFunctor<mitk::Functor::AddValue<TPixel, TPixel>,
224 mitk::Functor::AddValue<TPixel, double>,
225 ImageType, DoubleOutputType>(imageA, value, valueLeft, returnDoubleImage, parameterFree, outputImage);
227 case mitk::NonStaticArithmeticOperation::OperationsEnum::SubValue:
228 ExecuteOneImageFilterWithFunctor<mitk::Functor::SubValue<TPixel, TPixel>,
229 mitk::Functor::SubValue<TPixel, double>,
230 ImageType, DoubleOutputType>(imageA, value, valueLeft, returnDoubleImage, parameterFree, outputImage);
232 case mitk::NonStaticArithmeticOperation::OperationsEnum::MultValue:
233 ExecuteOneImageFilterWithFunctor<mitk::Functor::MultValue<TPixel, TPixel>,
234 mitk::Functor::MultValue<TPixel, double>,
235 ImageType, DoubleOutputType>(imageA, value, valueLeft, returnDoubleImage, parameterFree, outputImage);
237 case mitk::NonStaticArithmeticOperation::OperationsEnum::DivValue:
238 ExecuteOneImageFilterWithFunctor<mitk::Functor::DivValue<TPixel, TPixel>,
239 mitk::Functor::DivValue<TPixel, double>,
240 ImageType, DoubleOutputType>(imageA, value, valueLeft, returnDoubleImage, parameterFree, outputImage);
242 case mitk::NonStaticArithmeticOperation::OperationsEnum::PowValue:
243 ExecuteOneImageFilterWithFunctor<mitk::Functor::PowValue<TPixel, TPixel>,
244 mitk::Functor::PowValue<TPixel, double>,
245 ImageType, DoubleOutputType>(imageA, value, valueLeft, returnDoubleImage, parameterFree, outputImage);
248 case mitk::NonStaticArithmeticOperation::OperationsEnum::Tan:
249 ExecuteOneImageFilterWithFunctorNonParameter<itk::Functor::Tan<TPixel, TPixel>,
250 itk::Functor::Tan<TPixel, double>,
251 ImageType, DoubleOutputType>(imageA, value, valueLeft, returnDoubleImage, parameterFree, outputImage);
253 case mitk::NonStaticArithmeticOperation::OperationsEnum::ATan:
254 ExecuteOneImageFilterWithFunctorNonParameter<itk::Functor::Atan<TPixel, TPixel>,
255 itk::Functor::Atan<TPixel, double>,
256 ImageType, DoubleOutputType>(imageA, value, valueLeft, returnDoubleImage, parameterFree, outputImage);
258 case mitk::NonStaticArithmeticOperation::OperationsEnum::Cos:
259 ExecuteOneImageFilterWithFunctorNonParameter<itk::Functor::Cos<TPixel, TPixel>,
260 itk::Functor::Cos<TPixel, double>,
261 ImageType, DoubleOutputType>(imageA, value, valueLeft, returnDoubleImage, parameterFree, outputImage);
263 case mitk::NonStaticArithmeticOperation::OperationsEnum::ACos:
264 ExecuteOneImageFilterWithFunctorNonParameter<itk::Functor::Acos<TPixel, TPixel>,
265 itk::Functor::Acos<TPixel, double>,
266 ImageType, DoubleOutputType>(imageA, value, valueLeft, returnDoubleImage, parameterFree, outputImage);
268 case mitk::NonStaticArithmeticOperation::OperationsEnum::Sin:
269 ExecuteOneImageFilterWithFunctorNonParameter<itk::Functor::Sin<TPixel, TPixel>,
270 itk::Functor::Sin<TPixel, double>,
271 ImageType, DoubleOutputType>(imageA, value, valueLeft, returnDoubleImage, parameterFree, outputImage);
273 case mitk::NonStaticArithmeticOperation::OperationsEnum::ASin:
274 ExecuteOneImageFilterWithFunctorNonParameter<itk::Functor::Asin<TPixel, TPixel>,
275 itk::Functor::Asin<TPixel, double>,
276 ImageType, DoubleOutputType>(imageA, value, valueLeft, returnDoubleImage, parameterFree, outputImage);
278 case mitk::NonStaticArithmeticOperation::OperationsEnum::Square:
279 ExecuteOneImageFilterWithFunctorNonParameter<itk::Functor::Square<TPixel, TPixel>,
280 itk::Functor::Square<TPixel, double>,
281 ImageType, DoubleOutputType>(imageA, value, valueLeft, returnDoubleImage, parameterFree, outputImage);
283 case mitk::NonStaticArithmeticOperation::OperationsEnum::Sqrt:
284 ExecuteOneImageFilterWithFunctorNonParameter<itk::Functor::Sqrt<TPixel, TPixel>,
285 itk::Functor::Sqrt<TPixel, double>,
286 ImageType, DoubleOutputType>(imageA, value, valueLeft, returnDoubleImage, parameterFree, outputImage);
288 case mitk::NonStaticArithmeticOperation::OperationsEnum::Abs:
289 ExecuteOneImageFilterWithFunctorNonParameter<itk::Functor::Abs<TPixel, TPixel>,
290 itk::Functor::Abs<TPixel, double>,
291 ImageType, DoubleOutputType>(imageA, value, valueLeft, returnDoubleImage, parameterFree, outputImage);
293 case mitk::NonStaticArithmeticOperation::OperationsEnum::Exp:
294 ExecuteOneImageFilterWithFunctorNonParameter<itk::Functor::Exp<TPixel, TPixel>,
295 itk::Functor::Exp<TPixel, double>,
296 ImageType, DoubleOutputType>(imageA, value, valueLeft, returnDoubleImage, parameterFree, outputImage);
298 case mitk::NonStaticArithmeticOperation::OperationsEnum::ExpNeg:
299 ExecuteOneImageFilterWithFunctorNonParameter<itk::Functor::ExpNegative<TPixel, TPixel>,
300 itk::Functor::ExpNegative<TPixel, double>,
301 ImageType, DoubleOutputType>(imageA, value, valueLeft, returnDoubleImage, parameterFree, outputImage);
303 case mitk::NonStaticArithmeticOperation::OperationsEnum::Log10:
304 ExecuteOneImageFilterWithFunctorNonParameter<itk::Functor::Log10<TPixel, TPixel>,
305 itk::Functor::Log10<TPixel, double>,
306 ImageType, DoubleOutputType>(imageA, value, valueLeft, returnDoubleImage, parameterFree, outputImage);
316 helper.
m_Algorithm = NonStaticArithmeticOperation::OperationsEnum::Add2;
324 helper.
m_Algorithm = NonStaticArithmeticOperation::OperationsEnum::Sub2;
332 helper.
m_Algorithm = NonStaticArithmeticOperation::OperationsEnum::Mult;
340 helper.
m_Algorithm = NonStaticArithmeticOperation::OperationsEnum::Div;
472 if (imageA->GetDimension() != imageB->GetDimension())
474 mitkThrow() <<
"Image have different dimensions. This is not supported by mitk::ArithmeticOperation";
477 switch (imageA->GetDimension())
492 mitkThrow() <<
"Image Dimension of "<<imageA->GetDimension() <<
" is not supported";
498 template<
typename TPixel1,
unsigned int VImageDimension1,
typename TPixel2,
unsigned int VImageDimension2>
501 typedef itk::Image<TPixel1, VImageDimension1> Image1Type;
502 typedef itk::Image<TPixel2, VImageDimension2> Image2Type;
503 typedef itk::Image<double, VImageDimension1> DoubleOutputType;
506 switch (m_Algorithm) {
507 case OperationsEnum::Add2:
508 ExecuteTwoImageFilterWithFunctor<itk::Functor::Add2<TPixel1, TPixel2, TPixel1>,
509 itk::Functor::Add2<TPixel1, TPixel2, double>,
510 Image1Type, Image2Type, DoubleOutputType>(imageA, imageB);
513 case OperationsEnum::Sub2:
514 ExecuteTwoImageFilterWithFunctor<itk::Functor::Sub2<TPixel1, TPixel2, TPixel1>,
515 itk::Functor::Add2<TPixel1, TPixel2, double>,
516 Image1Type, Image2Type, DoubleOutputType>(imageA, imageB);
519 case OperationsEnum::Mult:
520 ExecuteTwoImageFilterWithFunctor<itk::Functor::Mult<TPixel1, TPixel2, TPixel1>,
521 itk::Functor::Add2<TPixel1, TPixel2, double>,
522 Image1Type, Image2Type, DoubleOutputType>(imageA, imageB);
525 case OperationsEnum::Div:
526 ExecuteTwoImageFilterWithFunctor<itk::Functor::Div<TPixel1, TPixel2, TPixel1>,
527 itk::Functor::Add2<TPixel1, TPixel2, double>,
528 Image1Type, Image2Type, DoubleOutputType>(imageA, imageB);
535 template<
typename DefaultFunctorType,
typename DoubleFunctorType,
typename Image1Type,
typename Image2Type,
typename DoubleImageType >
538 typedef itk::BinaryFunctorImageFilter< Image1Type, Image2Type, Image1Type,DefaultFunctorType > DefaultFilterType;
539 typedef itk::BinaryFunctorImageFilter< Image1Type, Image2Type, DoubleImageType, DoubleFunctorType > DoubleFilterType;
541 if (m_GenerateDoubleOutput)
543 typename DoubleFilterType::Pointer filter = DoubleFilterType::New();
544 filter->SetInput1(imageA);
545 filter->SetInput2(imageB);
551 typename DefaultFilterType::Pointer filter = DefaultFilterType::New();
552 filter->SetInput1(imageA);
553 filter->SetInput2(imageB);
static Image::Pointer Subtract(Image::Pointer &imageA, Image::Pointer &imageB, bool outputAsDouble=true)
MITKCORE_EXPORT bool operator!=(const InteractionEvent &a, const InteractionEvent &b)
static Image::Pointer Abs(Image::Pointer &imageA, bool outputAsDouble=true)
itk::Image< unsigned char, 3 > ImageType
mitk::Image::Pointer m_ResultImage
static Image::Pointer Sin(Image::Pointer &imageA, bool outputAsDouble=true)
static Image::Pointer Asin(Image::Pointer &imageA, bool outputAsDouble=true)
static Image::Pointer Square(Image::Pointer &imageA, bool outputAsDouble=true)
DataCollection - Class to facilitate loading/accessing structured data.
#define AccessByItk_n(mitkImage, itkImageTypeFunction, va_tuple)
Access a MITK image by an ITK image with one or more parameters.
static Image::Pointer Sqrt(Image::Pointer &imageA, bool outputAsDouble=true)
static void ExecuteOneImageFilterWithFunctor(ImageType *imageA, double value, bool returnDoubleImage, bool valueLeft, bool, mitk::Image::Pointer &outputImage)
static Image::Pointer Log10(Image::Pointer &imageA, bool outputAsDouble=true)
MITKCORE_EXPORT bool operator==(const InteractionEvent &a, const InteractionEvent &b)
static Image::Pointer Divide(Image::Pointer &imageA, Image::Pointer &imageB, bool outputAsDouble=true)
static Image::Pointer Cos(Image::Pointer &imageA, bool outputAsDouble=true)
static Image::Pointer Acos(Image::Pointer &imageA, bool outputAsDouble=true)
static Image::Pointer Tan(Image::Pointer &imageA, bool outputAsDouble=true)
static void ExecuteOneImageFilter(itk::Image< TPixel, VImageDimension > *imageA, double value, bool returnDoubleImage, bool valueLeft, bool parameterFree, mitk::NonStaticArithmeticOperation::OperationsEnum algorithm, mitk::Image::Pointer &outputImage)
void CallExecuteTwoImageFilter(mitk::Image::Pointer imageA, mitk::Image::Pointer imageB)
static Image::Pointer ExpNeg(Image::Pointer &imageA, bool outputAsDouble=true)
static void ExecuteOneImageFilterWithFunctorNonParameter(ImageType *imageA, double, bool returnDoubleImage, bool, bool, mitk::Image::Pointer &outputImage)
void CastToMitkImage(const itk::SmartPointer< ItkOutputImageType > &itkimage, itk::SmartPointer< mitk::Image > &mitkoutputimage)
Cast an itk::Image (with a specific type) to an mitk::Image.
#define AccessTwoImagesFixedDimensionByItk(mitkImage1, mitkImage2, itkImageTypeFunction, dimension)
Access two mitk-images with known dimension by itk-images.
void ExecuteTwoImageFilterWithFunctor(Image1Type *imageA, Image2Type *imageB)
void ExecuteTwoImageFilter(itk::Image< TPixel1, VImageDimension1 > *imageA, itk::Image< TPixel2, VImageDimension2 > *imageB)
static Image::Pointer Add(Image::Pointer &imageA, Image::Pointer &imageB, bool outputAsDouble=true)
OperationsEnum m_Algorithm
static Image::Pointer Atan(Image::Pointer &imageA, bool outputAsDouble=true)
static Image::Pointer Exp(Image::Pointer &imageA, bool outputAsDouble=true)
static Image::Pointer Multiply(Image::Pointer &imageA, Image::Pointer &imageB, bool outputAsDouble=true)