Medical Imaging Interaction Toolkit  2026.06.00
Medical Imaging Interaction Toolkit
mitkImageGenerator.h
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 #ifndef mitkImageGenerator_h
14 #define mitkImageGenerator_h
15 
16 #include <mitkImageWriteAccessor.h>
17 #include <MitkCoreExports.h>
18 #include <itkImageRegionIterator.h>
19 #include <itkMersenneTwisterRandomVariateGenerator.h>
20 #include <mitkImage.h>
21 
22 namespace mitk
23 {
33  {
34  public:
50  template <typename TPixelType>
51  static mitk::Image::Pointer GenerateGradientImage(unsigned int dimX,
52  unsigned int dimY,
53  unsigned int dimZ,
54  float spacingX = 1,
55  float spacingY = 1,
56  float spacingZ = 1)
57  {
58  typedef itk::Image<TPixelType, 3> ImageType;
59  typename ImageType::RegionType imageRegion;
60  imageRegion.SetSize(0, dimX);
61  imageRegion.SetSize(1, dimY);
62  imageRegion.SetSize(2, dimZ);
63  typename ImageType::SpacingType spacing;
64  spacing[0] = spacingX;
65  spacing[1] = spacingY;
66  spacing[2] = spacingZ;
67 
68  mitk::Point3D origin;
69  origin.Fill(0.0);
70  itk::Matrix<double, 3, 3> directionMatrix;
71  directionMatrix.SetIdentity();
72 
73  typename ImageType::Pointer image = ImageType::New();
74  image->SetSpacing(spacing);
75  image->SetOrigin(origin);
76  image->SetDirection(directionMatrix);
77  image->SetLargestPossibleRegion(imageRegion);
78  image->SetBufferedRegion(imageRegion);
79  image->SetRequestedRegion(imageRegion);
80  image->Allocate();
81  image->FillBuffer(0.0);
82 
83  typedef itk::ImageRegionIterator<ImageType> IteratorOutputType;
84  IteratorOutputType it(image, imageRegion);
85  it.GoToBegin();
86 
87  TPixelType val = 0;
88  while (!it.IsAtEnd())
89  {
90  it.Set(val);
91  val++;
92  ++it;
93  }
94 
95  mitk::Image::Pointer mitkImage = mitk::Image::New();
96  mitkImage->InitializeByItk(image.GetPointer());
97  mitkImage->SetVolume(image->GetBufferPointer());
98  return mitkImage;
99  }
100 
111  template <typename TPixelType>
112  static mitk::Image::Pointer GenerateImageFromReference(mitk::Image::Pointer reference, TPixelType fill_value)
113  {
114  mitk::Image::Pointer output = mitk::Image::New();
115  mitk::PixelType output_type = MakeScalarPixelType<TPixelType>();
116 
117  // all metadata (except type) come from reference image
118  output->SetGeometry(reference->GetGeometry());
119  output->Initialize(output_type, reference->GetDimension(), reference->GetDimensions());
120 
121  // get a pointer to the image buffer to write into
122  TPixelType *imageBuffer = nullptr;
123  try
124  {
125  mitk::ImageWriteAccessor writeAccess(output);
126  imageBuffer = static_cast<TPixelType *>(writeAccess.GetData());
127  }
128  catch (...)
129  {
130  MITK_ERROR << "Write access not granted on mitk::Image.";
131  }
132 
133  // fill the buffer with the specified value
134  for (unsigned int i = 0; i < output->GetVolumeData(0)->GetSize(); i++)
135  {
136  imageBuffer[i] = fill_value;
137  }
138 
139  return output;
140  }
141 
160  template <typename TPixelType>
161  static mitk::Image::Pointer GenerateRandomImage(unsigned int dimX,
162  unsigned int dimY,
163  unsigned int dimZ = 1,
164  unsigned int dimT = 1,
165  mitk::ScalarType spacingX = 1,
166  mitk::ScalarType spacingY = 1,
167  mitk::ScalarType spacingZ = 1,
168  const double randomMax = 1000.0f,
169  const double randMin = 0.0f)
170  {
171  // set the data type according to the template
172  mitk::PixelType type = MakeScalarPixelType<TPixelType>();
173  // type.Initialize(typeid(TPixelType));
174 
175  // initialize the MITK image with given dimension and data type
176  mitk::Image::Pointer output = mitk::Image::New();
177  auto dimensions = new unsigned int[4];
178  unsigned int numberOfDimensions = 0;
179  unsigned int bufferSize = 0;
180 
181  // check which dimension is needed
182  if (dimT <= 1)
183  {
184  if (dimZ <= 1)
185  { // 2D
186  numberOfDimensions = 2;
187  dimensions[0] = dimX;
188  dimensions[1] = dimY;
189  bufferSize = dimX * dimY;
190  }
191  else
192  { // 3D
193  numberOfDimensions = 3;
194  dimensions[0] = dimX;
195  dimensions[1] = dimY;
196  dimensions[2] = dimZ;
197  bufferSize = dimX * dimY * dimZ;
198  }
199  }
200  else
201  { // 4D
202  numberOfDimensions = 4;
203  dimensions[0] = dimX;
204  dimensions[1] = dimY;
205  dimensions[2] = dimZ;
206  dimensions[3] = dimT;
207  bufferSize = dimX * dimY * dimZ * dimT;
208  }
209  output->Initialize(type, numberOfDimensions, dimensions);
210  mitk::Vector3D spacing;
211  spacing[0] = spacingX;
212  spacing[1] = spacingY;
213  spacing[2] = spacingZ;
214  output->SetSpacing(spacing);
215 
216  // get a pointer to the image buffer to write into
217  TPixelType *imageBuffer = nullptr;
218  try
219  {
220  mitk::ImageWriteAccessor writeAccess(output);
221  imageBuffer = static_cast<TPixelType *>(writeAccess.GetData());
222  }
223  catch (...)
224  {
225  MITK_ERROR << "Write access not granted on mitk::Image.";
226  }
227 
228  // initialize the random generator
229  itk::Statistics::MersenneTwisterRandomVariateGenerator::Pointer randomGenerator =
230  itk::Statistics::MersenneTwisterRandomVariateGenerator::New();
231  randomGenerator->Initialize();
232 
233  // fill the buffer for each pixel/voxel
234  for (unsigned int i = 0; i < bufferSize; i++)
235  {
236  // the comparison of the component type is sufficient enough since the mitk::PixelType type object is
237  // created as SCALAR and hence does not need the comparison against type.GetPixelTypeId() ==
238  // itk::IOPixelEnum::SCALAR
239  if (type.GetComponentType() == itk::IOComponentEnum::INT) // call integer function
240  {
241  imageBuffer[i] = (TPixelType)randomGenerator->GetIntegerVariate((int)randomMax);
242  // TODO random generator does not support integer values in a given range (e.g. from 5-10)
243  // range is always [0, (int)randomMax]
244  }
245  else if ((type.GetComponentType() == itk::IOComponentEnum::DOUBLE) ||
246  (type.GetComponentType() == itk::IOComponentEnum::FLOAT)) // call floating point function
247  {
248  imageBuffer[i] = (TPixelType)randomGenerator->GetUniformVariate(randMin, randomMax);
249  }
250  else if (type.GetComponentType() == itk::IOComponentEnum::UCHAR)
251  {
252  // use the integer randomGenerator with mod 256 to generate unsigned char values
253  imageBuffer[i] = (unsigned char)((int)randomGenerator->GetIntegerVariate((int)randomMax)) % 256;
254  }
255  else if (type.GetComponentType() == itk::IOComponentEnum::USHORT)
256  {
257  imageBuffer[i] = (unsigned short)((int)randomGenerator->GetIntegerVariate((int)randomMax)) % 65536;
258  }
259  else
260  {
261  MITK_ERROR << "Datatype not supported yet.";
262  // TODO call different methods for other datatypes
263  }
264  }
265  return output;
266  }
267  };
268 } // namespace mitk
269 
270 #endif
#define MITKCORE_EXPORT
Generator for synthetic MITK images.
static mitk::Image::Pointer GenerateImageFromReference(mitk::Image::Pointer reference, TPixelType fill_value)
Generates an image with the same geometry as the given reference image.
static mitk::Image::Pointer GenerateRandomImage(unsigned int dimX, unsigned int dimY, unsigned int dimZ=1, unsigned int dimT=1, mitk::ScalarType spacingX=1, mitk::ScalarType spacingY=1, mitk::ScalarType spacingZ=1, const double randomMax=1000.0f, const double randMin=0.0f)
Generates a random image with the defined size and spacing.
static mitk::Image::Pointer GenerateGradientImage(unsigned int dimX, unsigned int dimY, unsigned int dimZ, float spacingX=1, float spacingY=1, float spacingZ=1)
Generates a 3D gradient image with the defined size and spacing.
Provides locked write access to a particular region of image data.
void * GetData()
Get a non-const pointer to the raw image data for writing.
static Pointer New()
Describes the data type of image pixels.
Definition: mitkPixelType.h:75
ItkIOComponentType GetComponentType() const
Get the scalar component type.
#define MITK_ERROR
Log an error message.
Definition: mitkLog.h:372
Find image slices visible on a given plane.
double ScalarType
Scalar type used throughout MITK for geometric computations.