Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkModelSignalImageGenerator.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 
16 #include "mitkImageCast.h"
17 #include "mitkImageAccessByItk.h"
18 #include "mitkITKImageImport.h"
21 
22 
24 {
25  m_ParameterInputMap.insert(std::make_pair(parameterIndex,parameterImage));
26 
27 }
28 
30 {
31  Generate();
32  return m_ResultImage;
33 }
34 
35 template <typename TPixel, unsigned int VDim>
36 void
38 {
39  m_InternalMask = dynamic_cast<InternalMaskType*>(image);
40 
41  if (m_InternalMask.IsNull())
42  {
43  MITK_INFO << "Parameter Fit Generator. Need to cast mask for parameter fit.";
44  typedef itk::Image<TPixel, VDim> InputImageType;
45  typedef itk::CastImageFilter< InputImageType, InternalMaskType > CastFilterType;
46  typename CastFilterType::Pointer spImageCaster = CastFilterType::New();
47 
48  spImageCaster->SetInput(image);
49 
50  m_InternalMask = spImageCaster->GetOutput();
51  spImageCaster->Update();
52  }
53 }
54 
55 void mitk::ModelSignalImageGenerator::SortParameterImages()
56 {
57  ParameterVectorType inputImages(this->m_ParameterInputMap.size());
58 
59  unsigned int i = 0;
60  for (ParameterMapType::const_iterator pos = m_ParameterInputMap.begin(); pos != m_ParameterInputMap.end(); ++pos)
61  {
62 
63  i = pos->first;
64  inputImages[i] = pos->second;
65  }
66 
67  this->m_InputParameterImages = inputImages;
68 
69 
70 }
71 
73 {
74  SortParameterImages();
75 
76  if(this->m_Mask.IsNotNull())
77  {
79  }
80  else
81  {
82  this->m_InternalMask = nullptr;
83  }
84 
88 // mitk::Image::Pointer firstParameterImage = this->m_InputParameterImages[0];
89 // AccessFixedDimensionByItk(firstParameterImage, mitk::ModelSignalImageGenerator::DoGenerateData, 3);
90 
91 
92  typedef itk::Image<double, 3> InputFrameImageType;
93  typedef itk::Image<double, 3> OutputImageType;
94 
96  FilterType::Pointer filter = FilterType::New();
97 
98  for(unsigned int i=0; i<this->m_ParameterInputMap.size(); ++i)
99  {
100  InputFrameImageType::Pointer frameImage = InputFrameImageType::New();
101  Image::Pointer parameterImage = m_InputParameterImages.at(i);
102 
103  mitk::CastToItkImage(parameterImage, frameImage);
104  filter->SetInput(i,frameImage);
105  }
106 
108  generationFunctor->SetModelParameterizer(m_Parameterizer);
109 
110  SimpleFunctorPolicy functor;
111  functor.SetFunctor(generationFunctor);
112  filter->SetFunctor(functor);
113  if (this->m_InternalMask.IsNotNull())
114  {
115  filter->SetMask(this->m_InternalMask);
116  }
117  filter->Update();
118 
119  if (filter->GetNumberOfOutputs() != generationFunctor->GetGrid().GetSize())
120  {
121  itkExceptionMacro("Error. Number of computed output Images does not match Grid size!");
122  }
123 
130  typedef itk::Image<double,4> DynamicITKImageType;
131 
132  Image::Pointer dynamicImage= Image::New();
133  mitk::Image::Pointer tempImage = mitk::ImportItkImage(filter->GetOutput(0))->Clone();
134 
135  DynamicITKImageType::Pointer dynamicITKImage = DynamicITKImageType::New();
136  DynamicITKImageType::RegionType dynamicITKRegion;
137  DynamicITKImageType::PointType dynamicITKOrigin;
138  DynamicITKImageType::IndexType dynamicITKIndex;
139  DynamicITKImageType::SpacingType dynamicITKSpacing;
140 
141  dynamicITKSpacing[0] = tempImage->GetGeometry()->GetSpacing()[0];
142  dynamicITKSpacing[1] = tempImage->GetGeometry()->GetSpacing()[1];
143  dynamicITKSpacing[2] = tempImage->GetGeometry()->GetSpacing()[2];
144  dynamicITKSpacing[3] = 3.0;
145 
146  dynamicITKIndex[0] = 0; // The first pixel of the REGION
147  dynamicITKIndex[1] = 0;
148  dynamicITKIndex[2] = 0;
149  dynamicITKIndex[3] = 0;
150 
151  dynamicITKRegion.SetSize( 0,tempImage->GetDimension(0));
152  dynamicITKRegion.SetSize( 1,tempImage->GetDimension(1));
153  dynamicITKRegion.SetSize( 2,tempImage->GetDimension(2));
154  dynamicITKRegion.SetSize(3, filter->GetNumberOfOutputs());
155 
156  dynamicITKRegion.SetIndex( dynamicITKIndex );
157 
158  dynamicITKOrigin[0]=tempImage->GetGeometry()->GetOrigin()[0];
159  dynamicITKOrigin[1]=tempImage->GetGeometry()->GetOrigin()[1];
160  dynamicITKOrigin[2]=tempImage->GetGeometry()->GetOrigin()[2];
161 
162  dynamicITKImage->SetOrigin(dynamicITKOrigin);
163  dynamicITKImage->SetSpacing(dynamicITKSpacing);
164  dynamicITKImage->SetRegions( dynamicITKRegion);
165  dynamicITKImage->Allocate();
166  dynamicITKImage->FillBuffer(0); //not sure if this is necessary
167 
168  // Convert
169  mitk::CastToMitkImage(dynamicITKImage, dynamicImage);
170 
171 
172 
174  timeGeometry->ClearAllGeometries();
175 
176  auto nrOfOutputs = filter->GetNumberOfOutputs();
177  auto grid = generationFunctor->GetGrid();
178  for (unsigned int i = 0; i<nrOfOutputs; ++i)
179  {
180  mitk::Image::Pointer frame = mitk::ImportItkImage(filter->GetOutput(i))->Clone();
181  mitk::ImageReadAccessor accessor(frame);
182  dynamicImage->SetVolume(accessor.GetData(), i);
183 
184  double tmax = 0;
185  if (i<(nrOfOutputs - 1))
186  {
187  tmax = grid[i + 1] * 1000;
188  }
189  else
190  {
191  tmax = grid[i] * 1000;
192  }
193  timeGeometry->AppendNewTimeStepClone(frame->GetGeometry(), grid[i] * 1000, tmax);
194  }
195 
196  dynamicImage->SetTimeGeometry(timeGeometry);
197 
198  this->m_ResultImage = dynamicImage->Clone();
199 
200 }
void DoPrepareMask(itk::Image< TPixel, VDim > *image)
#define MITK_INFO
Definition: mitkLogMacros.h:18
#define AccessFixedDimensionByItk(mitkImage, itkImageTypeFunction, dimension)
Access a mitk-image with known dimension by an itk-image.
std::vector< ParameterImageType > ParameterVectorType
Perform a generic pixel-wise operation on N images and produces m output images.
void SetFunctor(const mitk::SimpleFunctorBase *functor)
Image::Pointer ImportItkImage(const itk::SmartPointer< ItkOutputImageType > &itkimage, const BaseGeometry *geometry=nullptr, bool update=true)
Imports an itk::Image (with a specific type) as an mitk::Image.Instantiates instance of ITKImageImpor...
mitk::Image::Pointer image
static Pointer New()
void SetParameterInputImage(const ParametersIndexType index, ParameterImageType inputParameterImage)
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.
itk::Image< double, 4 > DynamicITKImageType
ImageReadAccessor class to get locked read access for a particular image part.
static mitk::PlanarFigure::Pointer Clone(mitk::PlanarFigure::Pointer original)
const void * GetData() const
Gives const access to the data.