Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkImageGenerationHelper.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 
15 #include "mitkImageCast.h"
16 
17 
18  typedef itk::Image<double,3> FrameITKImageType;
19  typedef itk::Image<double,4> DynamicITKImageType;
20 
21 
22  mitk::Image::Pointer mitk::ImageGenerationHelper::GenerateTestFrame(unsigned int timePointIndex)
23  {
24  FrameITKImageType::Pointer image = FrameITKImageType::New();
25 
26  FrameITKImageType::IndexType start;
27  start[0] = 0; // first index on X
28  start[1] = 0; // first index on Y
29  start[2] = 0; // first index on Z
30 
31  FrameITKImageType::SizeType size;
32  size[0] = this->m_DimX; // size along X
33  size[1] = this->m_DimY; // size along Y
34  size[2] = this->m_DimZ; // size along Z
35 
36  FrameITKImageType::RegionType region;
37  region.SetSize( size );
38  region.SetIndex( start );
39 
40  image->SetRegions( region );
41  image->Allocate();
42 
43  itk::ImageRegionIterator<FrameITKImageType> it = itk::ImageRegionIterator<FrameITKImageType>(image,image->GetLargestPossibleRegion());
44 
45  while (!it.IsAtEnd())
46  {
47  it.Set(this->m_Curve[timePointIndex]);
48  ++it;
49  }
50 
52  mitkImage->InitializeByItk( image.GetPointer() );
53  mitkImage->SetVolume( image->GetBufferPointer() );
54 
55  return mitkImage;
56  }
57 
58 
59 
60 
62  {
63 
64  unsigned int timeSteps = this->m_Grid.GetSize();
65 
66  if(this->m_Curve.GetSize() != this->m_Grid.GetSize())
67  {
68  itkExceptionMacro("Error. TimeGrid and ConcentrationCurve do not have same size. No Image Generation possible!");
69 
70  }
71  if(this->m_DimX == 0 && this->m_DimY == 0 && this->m_DimZ == 0)
72  {
73  itkExceptionMacro("Error. No Dimensions for Image Set!");
74 
75  }
76  if(this->m_Curve.GetSize() == 0 || this->m_Grid.GetSize() == 0)
77  {
78  itkExceptionMacro("Error. No Curve/Grid set!");
79 
80  }
81 
82  mitk::Image::Pointer tempImage = GenerateTestFrame(0);
83  mitk::Image::Pointer dynamicImage = mitk::Image::New();
84 
85  DynamicITKImageType::Pointer dynamicITKImage = DynamicITKImageType::New();
86  DynamicITKImageType::RegionType dynamicITKRegion;
87  DynamicITKImageType::PointType dynamicITKOrigin;
88  DynamicITKImageType::IndexType dynamicITKIndex;
89  DynamicITKImageType::SpacingType dynamicITKSpacing;
90 
91  dynamicITKSpacing[0] = tempImage->GetGeometry()->GetSpacing()[0];
92  dynamicITKSpacing[1] = tempImage->GetGeometry()->GetSpacing()[1];
93  dynamicITKSpacing[2] = tempImage->GetGeometry()->GetSpacing()[2];
94  dynamicITKSpacing[3] = 1.0;
95 
96  dynamicITKIndex[0] = 0; // The first pixel of the REGION
97  dynamicITKIndex[1] = 0;
98  dynamicITKIndex[2] = 0;
99  dynamicITKIndex[3] = 0;
100 
101  dynamicITKRegion.SetSize( 0,tempImage->GetDimension(0));
102  dynamicITKRegion.SetSize( 1,tempImage->GetDimension(1));
103  dynamicITKRegion.SetSize( 2,tempImage->GetDimension(2));
104  dynamicITKRegion.SetSize( 3,timeSteps);
105 
106  dynamicITKRegion.SetIndex( dynamicITKIndex );
107 
108  dynamicITKOrigin[0]=tempImage->GetGeometry()->GetOrigin()[0];
109  dynamicITKOrigin[1]=tempImage->GetGeometry()->GetOrigin()[1];
110  dynamicITKOrigin[2]=tempImage->GetGeometry()->GetOrigin()[2];
111 
112  dynamicITKImage->SetOrigin(dynamicITKOrigin);
113  dynamicITKImage->SetSpacing(dynamicITKSpacing);
114  dynamicITKImage->SetRegions( dynamicITKRegion);
115  dynamicITKImage->Allocate();
116  dynamicITKImage->FillBuffer(0); //not sure if this is necessary
117 
118  // Convert
119  mitk::CastToMitkImage(dynamicITKImage, dynamicImage);
120 
122  timeGeometry->ClearAllGeometries();
123 
124 
125  for (unsigned int i = 0; i<timeSteps; ++i)
126  {
127  mitk::Image::Pointer frameImage = GenerateTestFrame(i);
128  mitk::ImageReadAccessor readAccess(frameImage, frameImage->GetVolumeData(0));
129  dynamicImage->SetVolume(readAccess.GetData(),i);
130 
131  timeGeometry->AppendNewTimeStepClone(frameImage->GetGeometry(),this->m_Grid(i),this->m_Grid(i+1));
132  }
133 
134  dynamicImage->SetTimeGeometry(timeGeometry);
135 
136  return dynamicImage;
137  }
138 
139 
itk::Image< double, 3 > FrameITKImageType
itk::Image< double, 4 > DynamicITKImageType
mitk::Image::Pointer image
static Pointer New()
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
ImageReadAccessor class to get locked read access for a particular image part.