Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
ImageAndValueArithmetic.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
13 #include "mitkProperties.h"
14 
15 #include "mitkCommandLineParser.h"
16 #include "mitkIOUtil.h"
17 
19 
20 static bool ConvertToBool(std::map<std::string, us::Any> &data, std::string name)
21 {
22  if (!data.count(name))
23  {
24  return false;
25  }
26  try {
27  return us::any_cast<bool>(data[name]);
28  }
29  catch ( const us::BadAnyCastException & )
30  {
31  return false;
32  }
33 }
34 
35 
36 int main(int argc, char* argv[])
37 {
38  mitkCommandLineParser parser;
39 
40  parser.setTitle("File Converter");
41  parser.setCategory("Basic Image Processing");
42  parser.setDescription("");
43  parser.setContributor("German Cancer Research Center (DKFZ)");
44 
45  parser.setArgumentPrefix("--","-");
46  // Add command line argument names
47  parser.addArgument("help", "h",mitkCommandLineParser::Bool, "Help:", "Show this help text");
48  parser.addArgument("image", "i", mitkCommandLineParser::File, "Input file:", "Input File",us::Any(),false, false, false, mitkCommandLineParser::Input);
49  parser.addArgument("value", "v", mitkCommandLineParser::Float, "Input Value:", "Input Value", us::Any(), false);
50  parser.addArgument("output", "o", mitkCommandLineParser::File, "Output file:", "Output file", us::Any(), false, false, false, mitkCommandLineParser::Output);
51 
52  parser.addArgument("as-double", "double", mitkCommandLineParser::Bool, "Result as double", "Result as double image type", false, true);
53  parser.addArgument("image-right", "right", mitkCommandLineParser::Bool, "Image right (for example Value - Image)", "Image right (for example Value - Image)", false, true);
54 
55  parser.addArgument("add", "add", mitkCommandLineParser::Bool, "Add Left Image and Right Image", "Add Left Image and Right Image", us::Any(false), true);
56  parser.addArgument("subtract", "sub", mitkCommandLineParser::Bool, "Subtract right image from left image", "Subtract right image from left image", us::Any(false), true);
57  parser.addArgument("multiply", "multi", mitkCommandLineParser::Bool, "Multiply Left Image and Right Image", "Multiply Left Image and Right Image", us::Any(false), true);
58  parser.addArgument("divide", "div", mitkCommandLineParser::Bool, "Divide Left Image by Right Image", "Divide Left Image by Right Image", us::Any(false), true);
59 
60  std::map<std::string, us::Any> parsedArgs = parser.parseArguments(argc, argv);
61 
62  if (parsedArgs.size()==0)
63  return EXIT_FAILURE;
64 
65  // Show a help message
66  if ( parsedArgs.count("help") || parsedArgs.count("h"))
67  {
68  std::cout << parser.helpText();
69  return EXIT_SUCCESS;
70  }
71 
72  std::string inputFilename = us::any_cast<std::string>(parsedArgs["image"]);
73  std::string outputFilename = us::any_cast<std::string>(parsedArgs["output"]);
74 
75  auto nodes = mitk::IOUtil::Load(inputFilename);
76  if (nodes.size() == 0)
77  {
78  MITK_INFO << "No Image Loaded";
79  return 0;
80  }
81  mitk::Image::Pointer image = dynamic_cast<mitk::Image*>(nodes[0].GetPointer());
82 
83  if (image.IsNull())
84  {
85  MITK_INFO << "Loaded data is not of type image";
86  return 0;
87  }
88 
89  double value = us::any_cast<float>(parsedArgs["value"]);
90  bool resultAsDouble = ConvertToBool(parsedArgs, "as-double");
91  MITK_INFO << "Output image as double: " << resultAsDouble;
92 
93  mitk::Image::Pointer tmpImage = image->Clone();
94  if (ConvertToBool(parsedArgs, "image-right"))
95  {
96  if (ConvertToBool(parsedArgs, "add"))
97  {
98  MITK_INFO << " Start Doing Operation: ADD()";
99  tmpImage = mitk::ArithmeticOperation::Add(value, tmpImage, resultAsDouble);
100  }
101  if (ConvertToBool(parsedArgs, "subtract"))
102  {
103  MITK_INFO << " Start Doing Operation: SUB()";
104  tmpImage = mitk::ArithmeticOperation::Subtract(value, tmpImage, resultAsDouble);
105  }
106  if (ConvertToBool(parsedArgs, "multiply"))
107  {
108  MITK_INFO << " Start Doing Operation: MULT()";
109  tmpImage = mitk::ArithmeticOperation::Multiply(value, tmpImage, resultAsDouble);
110  }
111  if (ConvertToBool(parsedArgs, "divide"))
112  {
113  MITK_INFO << " Start Doing Operation: DIV()";
114  tmpImage = mitk::ArithmeticOperation::Divide(value, tmpImage, resultAsDouble);
115  }
116  }
117  else {
118  if (ConvertToBool(parsedArgs, "add"))
119  {
120  MITK_INFO << " Start Doing Operation: ADD()";
121  tmpImage = mitk::ArithmeticOperation::Add(tmpImage, value, resultAsDouble);
122  }
123  if (ConvertToBool(parsedArgs, "subtract"))
124  {
125  MITK_INFO << " Start Doing Operation: SUB()";
126  tmpImage = mitk::ArithmeticOperation::Subtract(tmpImage, value, resultAsDouble);
127  }
128  if (ConvertToBool(parsedArgs, "multiply"))
129  {
130  MITK_INFO << " Start Doing Operation: MULT()";
131  tmpImage = mitk::ArithmeticOperation::Multiply(tmpImage, value, resultAsDouble);
132  }
133  if (ConvertToBool(parsedArgs, "divide"))
134  {
135  MITK_INFO << " Start Doing Operation: DIV()";
136  tmpImage = mitk::ArithmeticOperation::Divide(tmpImage, value, resultAsDouble);
137  }
138 
139  }
140 
141  mitk::IOUtil::Save(tmpImage, outputFilename);
142 
143  return EXIT_SUCCESS;
144 }
static Image::Pointer Subtract(Image::Pointer &imageA, Image::Pointer &imageB, bool outputAsDouble=true)
#define MITK_INFO
Definition: mitkLogMacros.h:18
int main(int argc, char *argv[])
std::string inputFilename
Definition: MitkMCxyz.cpp:625
void setContributor(std::string contributor)
ValueType * any_cast(Any *operand)
Definition: usAny.h:377
void addArgument(const std::string &longarg, const std::string &shortarg, Type type, const std::string &argLabel, const std::string &argHelp=std::string(), const us::Any &defaultValue=us::Any(), bool optional=true, bool ignoreRest=false, bool deprecated=false, mitkCommandLineParser::Channel channel=mitkCommandLineParser::Channel::None)
std::map< std::string, us::Any > parseArguments(const StringContainerType &arguments, bool *ok=nullptr)
std::string outputFilename
Definition: MitkMCxyz.cpp:626
static Image::Pointer Divide(Image::Pointer &imageA, Image::Pointer &imageB, bool outputAsDouble=true)
static bool ConvertToBool(std::map< std::string, us::Any > &data, std::string name)
Image class for storing images.
Definition: mitkImage.h:72
Definition: usAny.h:163
std::string helpText() const
void setCategory(std::string category)
mitk::Image::Pointer image
void setArgumentPrefix(const std::string &longPrefix, const std::string &shortPrefix)
static void Save(const mitk::BaseData *data, const std::string &path, bool setPathProperty=false)
Save a mitk::BaseData instance.
Definition: mitkIOUtil.cpp:774
void setTitle(std::string title)
static Image::Pointer Add(Image::Pointer &imageA, Image::Pointer &imageB, bool outputAsDouble=true)
void setDescription(std::string description)
static Image::Pointer Multiply(Image::Pointer &imageA, Image::Pointer &imageB, bool outputAsDouble=true)
static DataStorage::SetOfObjects::Pointer Load(const std::string &path, DataStorage &storage, const ReaderOptionsFunctorBase *optionsCallback=nullptr)
Load a file into the given DataStorage.
Definition: mitkIOUtil.cpp:489