Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
CLRemoveEmptyVoxels.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 "mitkCommandLineParser.h"
14 #include "mitkIOUtil.h"
15 #include "mitkImageCast.h"
16 #include <itkImageRegionConstIterator.h>
17 #include <itkImageRegionIterator.h>
18 #include "mitkImageGenerator.h"
19 
20 int main(int argc, char* argv[])
21 {
22  typedef itk::Image<double, 3> ImageType;
23  typedef itk::Image<unsigned char, 3> MaskImageType;
24  typedef ImageType::Pointer ImagePointerType;
25  typedef MaskImageType::Pointer MaskImagePointerType;
26 
27  typedef itk::ImageRegionConstIterator<ImageType> ConstIteratorType;
28  typedef itk::ImageRegionConstIterator<MaskImageType> ConstMaskIteratorType;
29  typedef itk::ImageRegionIterator<ImageType> IteratorType;
30  typedef itk::ImageRegionIterator<MaskImageType> MaskIteratorType;
31 
32  mitkCommandLineParser parser;
33 
34  parser.setTitle("Remove empty voxels Sampling");
35  parser.setCategory("Classification Command Tools");
36  parser.setDescription("");
37  parser.setContributor("German Cancer Research Center (DKFZ)");
38 
39  parser.setArgumentPrefix("--", "-");
40  // Add command line argument names
41  parser.addArgument("help", "h", mitkCommandLineParser::Bool, "Help:", "Show this help text");
42  parser.addArgument("mask-input", "mi", mitkCommandLineParser::Directory, "Input file:", "Input file", us::Any(), false, false, false, mitkCommandLineParser::Input);
43  parser.addArgument("mask-output", "mo", mitkCommandLineParser::File, "Output file:", "Output file", us::Any(), false, false, false, mitkCommandLineParser::Output);
44 
45  for (int i = 0; i < 100; ++i)
46  {
47  std::stringstream s1; s1 << i; std::string number = s1.str();
48  parser.addArgument("input"+number, "i"+number, mitkCommandLineParser::File, "Input file", "input file", us::Any(), true, false, false, mitkCommandLineParser::Output);
49  parser.addArgument("output" + number, "o" + number, mitkCommandLineParser::File, "Output File", "Output file", us::Any(), true, false, false, mitkCommandLineParser::Output);
50  }
51 
52  std::map<std::string, us::Any> parsedArgs = parser.parseArguments(argc, argv);
53 
54  if (parsedArgs.size() == 0)
55  return EXIT_FAILURE;
56 
57  // Show a help message
58  if (parsedArgs.count("help") || parsedArgs.count("h"))
59  {
60  std::cout << parser.helpText();
61  return EXIT_SUCCESS;
62  }
63 
64  // Load Mask Image and count number of non-zero voxels
65  mitk::Image::Pointer mask = mitk::IOUtil::Load<mitk::Image>(parsedArgs["mask-input"].ToString());
66  MaskImagePointerType itkMask = MaskImageType::New();
67  mitk::CastToItkImage(mask, itkMask);
68  ConstMaskIteratorType maskIter(itkMask, itkMask->GetLargestPossibleRegion());
69  std::size_t nonZero = 0;
70  while (!maskIter.IsAtEnd())
71  {
72  if (maskIter.Value() > 0)
73  {
74  ++nonZero;
75  }
76  ++maskIter;
77  }
78  maskIter.GoToBegin();
79 
80  // Create new mask image
81  auto mitkNewMask = mitk::ImageGenerator::GenerateGradientImage<unsigned char>(nonZero, 1, 1, 1, 1, 1);
82  MaskImagePointerType itkNewMask = MaskImageType::New();
83  mitk::CastToItkImage(mitkNewMask, itkNewMask);
84  MaskIteratorType newMaskIter(itkNewMask, itkNewMask->GetLargestPossibleRegion());
85 
86  // Read additional image
87  std::vector<mitk::Image::Pointer> mitkImagesVector;
88  std::vector<ImagePointerType> itkImageVector;
89  std::vector<ImagePointerType> itkOutputImageVector;
90  std::vector<ConstIteratorType> inputIteratorVector;
91  std::vector<IteratorType> outputIteratorVector;
92  for (int i = 0; i < 100; ++i)
93  {
94  std::stringstream s1; s1 << i; std::string number = s1.str();
95  if (parsedArgs.count("input" + number) < 1)
96  break;
97  if (parsedArgs.count("output" + number) < 1)
98  break;
99 
100  mitk::Image::Pointer image = mitk::IOUtil::Load<mitk::Image>(parsedArgs["input"+number].ToString());
101  mitkImagesVector.push_back(image);
102 
103  ImagePointerType itkImage = ImageType::New();
104  mitk::CastToItkImage(image, itkImage);
105  itkImageVector.push_back(itkImage);
106 
107  ConstIteratorType iter(itkImage, itkImage->GetLargestPossibleRegion());
108  inputIteratorVector.push_back(iter);
109 
110  auto mitkNewImage = mitk::ImageGenerator::GenerateGradientImage<double>(nonZero, 1, 1, 1, 1, 1);
111  ImagePointerType itkNewOutput = ImageType::New();
112  mitk::CastToItkImage(mitkNewImage, itkNewOutput);
113  IteratorType outputIter(itkNewOutput, itkNewOutput->GetLargestPossibleRegion());
114  itkOutputImageVector.push_back(itkNewOutput);
115  outputIteratorVector.push_back(outputIter);
116  }
117 
118  // Convert non-zero voxels to the new images
119  while (!maskIter.IsAtEnd())
120  {
121  if (maskIter.Value() > 0)
122  {
123  newMaskIter.Set(maskIter.Value());
124  ++newMaskIter;
125  for (std::size_t i = 0; i < outputIteratorVector.size(); ++i)
126  {
127  outputIteratorVector[i].Set(inputIteratorVector[i].Value());
128  ++(outputIteratorVector[i]);
129  }
130  }
131  ++maskIter;
132  for (std::size_t i = 0; i < inputIteratorVector.size(); ++i)
133  {
134  ++(inputIteratorVector[i]);
135  }
136 
137  }
138 
139  // Save the new images
140  for (std::size_t i = 0; i < outputIteratorVector.size(); ++i)
141  {
142  std::stringstream s1; s1 << i; std::string number = s1.str();
144  mitk::CastToMitkImage(itkOutputImageVector[i], mitkImage);
145  mitk::IOUtil::Save(mitkImage, parsedArgs["output" + number].ToString());
146  }
147  // Save the new mask
148  {
150  mitk::CastToMitkImage(itkNewMask, mitkImage);
151  mitk::IOUtil::Save(mitkImage, parsedArgs["mask-output"].ToString());
152  }
153 
154  return EXIT_SUCCESS;
155 }
itk::Image< unsigned char, 3 > ImageType
void setContributor(std::string contributor)
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)
Definition: usAny.h:163
itk::Image< unsigned char, 3 > MaskImageType
Definition: CLBrainMask.cpp:32
std::string helpText() const
void setCategory(std::string category)
mitk::Image::Pointer image
static Pointer New()
void setArgumentPrefix(const std::string &longPrefix, const std::string &shortPrefix)
void CastToMitkImage(const itk::SmartPointer< ItkOutputImageType > &itkimage, itk::SmartPointer< mitk::Image > &mitkoutputimage)
Cast an itk::Image (with a specific type) to an mitk::Image.
Definition: mitkImageCast.h:74
void MITKCORE_EXPORT CastToItkImage(const mitk::Image *mitkImage, itk::SmartPointer< ItkOutputImageType > &itkOutputImage)
Cast an mitk::Image to an itk::Image with a specific type.
static void Save(const mitk::BaseData *data, const std::string &path, bool setPathProperty=false)
Save a mitk::BaseData instance.
Definition: mitkIOUtil.cpp:774
mitk::Image::Pointer mask
void setTitle(std::string title)
int main(int argc, char *argv[])
void setDescription(std::string description)