Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkCreateDistanceImageFromSurfaceFilter.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 
14 #include "mitkImageCast.h"
15 
16 #include "vtkCellArray.h"
17 #include "vtkCellData.h"
18 #include "vtkDoubleArray.h"
19 #include "vtkPolyData.h"
20 #include "vtkSmartPointer.h"
21 
22 #include "itkImageRegionIteratorWithIndex.h"
23 #include "itkNeighborhoodIterator.h"
24 
25 #include <queue>
26 
27 void mitk::CreateDistanceImageFromSurfaceFilter::CreateEmptyDistanceImage()
28 {
29  // Determine the bounds of the input points in index- and world-coordinates
30  DistanceImageType::PointType minPointInWorldCoordinates, maxPointInWorldCoordinates;
31  DistanceImageType::IndexType minPointInIndexCoordinates, maxPointInIndexCoordinates;
32 
33  DetermineBounds(
34  minPointInWorldCoordinates, maxPointInWorldCoordinates, minPointInIndexCoordinates, maxPointInIndexCoordinates);
35 
36  // Calculate the extent of the region that contains all given points in MM.
37  // To do this, we take the difference between the maximal and minimal
38  // index-coordinates (must not be less than 1) and multiply it with the
39  // spacing of the reference-image.
40  Vector3D extentMM;
41  for (unsigned int dim = 0; dim < 3; ++dim)
42  {
43  extentMM[dim] = (std::abs(maxPointInIndexCoordinates[dim] - minPointInIndexCoordinates[dim])) *
44  m_ReferenceImage->GetSpacing()[dim];
45  }
46 
47  /*
48  * Now create an empty distance image. The created image will always have the same number of pixels, independent from
49  * the original image (e.g. always consists of 500000 pixels) and will have an isotropic spacing.
50  * The spacing is calculated like the following:
51  * The image's volume = 500000 Pixels = extentX*spacing*extentY*spacing*extentZ*spacing
52  * So the spacing is: spacing = ( extentX*extentY*extentZ / 500000 )^(1/3)
53  */
54  double basis = (extentMM[0] * extentMM[1] * extentMM[2]) / m_DistanceImageVolume;
55  double exponent = 1.0 / 3.0;
56  m_DistanceImageSpacing = pow(basis, exponent);
57 
58  // calculate the number of pixels of the distance image for each direction
59  unsigned int numberOfXPixel = extentMM[0] / m_DistanceImageSpacing;
60  unsigned int numberOfYPixel = extentMM[1] / m_DistanceImageSpacing;
61  unsigned int numberOfZPixel = extentMM[2] / m_DistanceImageSpacing;
62 
63  // We increase the sizeOfRegion by 4 as we decrease the origin by 2 later.
64  // This expansion of the region is necessary to achieve a complete
65  // interpolation.
66  DistanceImageType::SizeType sizeOfRegion;
67  sizeOfRegion[0] = numberOfXPixel + 8;
68  sizeOfRegion[1] = numberOfYPixel + 8;
69  sizeOfRegion[2] = numberOfZPixel + 8;
70 
71  // The region starts at index 0,0,0
72  DistanceImageType::IndexType initialOriginAsIndex;
73  initialOriginAsIndex.Fill(0);
74 
75  DistanceImageType::PointType originAsWorld = minPointInWorldCoordinates;
76 
77  DistanceImageType::RegionType lpRegion;
78  lpRegion.SetSize(sizeOfRegion);
79  lpRegion.SetIndex(initialOriginAsIndex);
80 
81  // We initialize the itk::Image with
82  // * origin and direction to have it correctly placed and rotated in the world
83  // * the largest possible region to set the extent to be calculated
84  // * the isotropic spacing that we have calculated above
85  m_DistanceImageITK = DistanceImageType::New();
86  m_DistanceImageITK->SetOrigin(originAsWorld);
87  m_DistanceImageITK->SetDirection(m_ReferenceImage->GetDirection());
88  m_DistanceImageITK->SetRegions(lpRegion);
89  m_DistanceImageITK->SetSpacing(m_DistanceImageSpacing);
90  m_DistanceImageITK->Allocate();
91 
92  // First of all the image is initialized with the value 10*m_DistanceImageSpacing for each pixel
93  m_DistanceImageDefaultBufferValue = 10 * m_DistanceImageSpacing;
94  m_DistanceImageITK->FillBuffer(m_DistanceImageDefaultBufferValue);
95 
96  // Now we move the origin of the distanceImage 2 index-Coordinates
97  // in all directions
98  DistanceImageType::IndexType originAsIndex;
99  m_DistanceImageITK->TransformPhysicalPointToIndex(originAsWorld, originAsIndex);
100  originAsIndex[0] -= 2;
101  originAsIndex[1] -= 2;
102  originAsIndex[2] -= 2;
103  m_DistanceImageITK->TransformIndexToPhysicalPoint(originAsIndex, originAsWorld);
104  m_DistanceImageITK->SetOrigin(originAsWorld);
105 }
106 
108  : m_DistanceImageSpacing(0.0), m_DistanceImageDefaultBufferValue(0.0)
109 {
110  m_DistanceImageVolume = 50000;
111  this->m_UseProgressBar = false;
112  this->m_ProgressStepSize = 5;
113 
115  this->SetNthOutput(0, output.GetPointer());
116 }
117 
119 {
120 }
121 
123 {
124  this->PreprocessContourPoints();
125  this->CreateEmptyDistanceImage();
126 
127  // First of all we have to build the equation-system from the existing contour-edge-points
128  this->CreateSolutionMatrixAndFunctionValues();
129 
130  if (this->m_UseProgressBar)
132 
133  m_Weights = m_SolutionMatrix.partialPivLu().solve(m_FunctionValues);
134 
135  if (this->m_UseProgressBar)
137 
138  // The last step is to create the distance map with the interpolated distance function
139  this->FillDistanceImage();
140 
141  if (this->m_UseProgressBar)
143 
144  m_Centers.clear();
145  m_Normals.clear();
146 }
147 
148 void mitk::CreateDistanceImageFromSurfaceFilter::PreprocessContourPoints()
149 {
150  unsigned int numberOfInputs = this->GetNumberOfIndexedInputs();
151 
152  if (numberOfInputs == 0)
153  {
154  MITK_ERROR << "mitk::CreateDistanceImageFromSurfaceFilter: No input available. Please set an input!" << std::endl;
155  itkExceptionMacro("mitk::CreateDistanceImageFromSurfaceFilter: No input available. Please set an input!");
156  return;
157  }
158 
159  // First of all we have to extract the nomals and the surface points.
160  // Duplicated points can be eliminated
161 
162  vtkSmartPointer<vtkPolyData> polyData;
163  vtkSmartPointer<vtkDoubleArray> currentCellNormals;
164  vtkSmartPointer<vtkCellArray> existingPolys;
165  vtkSmartPointer<vtkPoints> existingPoints;
166 
167  double p[3];
168  PointType currentPoint;
169  PointType normal;
170 
171  for (unsigned int i = 0; i < numberOfInputs; i++)
172  {
173  auto currentSurface = this->GetInput(i);
174  polyData = currentSurface->GetVtkPolyData();
175 
176  if (polyData->GetNumberOfPolys() == 0)
177  {
178  MITK_INFO << "mitk::CreateDistanceImageFromSurfaceFilter: No input-polygons available. Please be sure the input "
179  "surface consists of polygons!"
180  << std::endl;
181  }
182 
183  currentCellNormals = vtkDoubleArray::SafeDownCast(polyData->GetCellData()->GetNormals());
184 
185  existingPolys = polyData->GetPolys();
186 
187  existingPoints = polyData->GetPoints();
188 
189  existingPolys->InitTraversal();
190 
191  vtkIdType *cell(nullptr);
192  vtkIdType cellSize(0);
193 
194  for (existingPolys->InitTraversal(); existingPolys->GetNextCell(cellSize, cell);)
195  {
196  for (vtkIdType j = 0; j < cellSize; j++)
197  {
198  existingPoints->GetPoint(cell[j], p);
199 
200  currentPoint.copy_in(p);
201 
202  int count = std::count(m_Centers.begin(), m_Centers.end(), currentPoint);
203 
204  if (count == 0)
205  {
206  double currentNormal[3];
207  currentCellNormals->GetTuple(cell[j], currentNormal);
208 
209  normal.copy_in(currentNormal);
210 
211  m_Normals.push_back(normal);
212 
213  m_Centers.push_back(currentPoint);
214  }
215 
216  } // end for all points
217  } // end for all cells
218  } // end for all outputs
219 }
220 
221 void mitk::CreateDistanceImageFromSurfaceFilter::CreateSolutionMatrixAndFunctionValues()
222 {
223  // For we can now calculate the exact size of the centers we initialize the data structures
224  unsigned int numberOfCenters = m_Centers.size();
225  m_Centers.reserve(numberOfCenters * 3);
226 
227  m_FunctionValues.resize(numberOfCenters * 3);
228 
229  m_FunctionValues.fill(0);
230 
231  PointType currentPoint;
232  PointType normal;
233 
234  // Create inner points
235  for (unsigned int i = 0; i < numberOfCenters; i++)
236  {
237  currentPoint = m_Centers.at(i);
238  normal = m_Normals.at(i);
239 
240  currentPoint[0] = currentPoint[0] - normal[0] * m_DistanceImageSpacing;
241  currentPoint[1] = currentPoint[1] - normal[1] * m_DistanceImageSpacing;
242  currentPoint[2] = currentPoint[2] - normal[2] * m_DistanceImageSpacing;
243 
244  m_Centers.push_back(currentPoint);
245 
246  m_FunctionValues[numberOfCenters + i] = -m_DistanceImageSpacing;
247  }
248 
249  // Create outer points
250  for (unsigned int i = 0; i < numberOfCenters; i++)
251  {
252  currentPoint = m_Centers.at(i);
253  normal = m_Normals.at(i);
254 
255  currentPoint[0] = currentPoint[0] + normal[0] * m_DistanceImageSpacing;
256  currentPoint[1] = currentPoint[1] + normal[1] * m_DistanceImageSpacing;
257  currentPoint[2] = currentPoint[2] + normal[2] * m_DistanceImageSpacing;
258 
259  m_Centers.push_back(currentPoint);
260 
261  m_FunctionValues[numberOfCenters * 2 + i] = m_DistanceImageSpacing;
262  }
263 
264  // Now we have created all centers and all function values. Next step is to create the solution matrix
265  numberOfCenters = m_Centers.size();
266 
267  m_SolutionMatrix.resize(numberOfCenters, numberOfCenters);
268 
269  m_Weights.resize(numberOfCenters);
270 
271  PointType p1;
272  PointType p2;
273  double norm;
274 
275  for (unsigned int i = 0; i < numberOfCenters; i++)
276  {
277  for (unsigned int j = 0; j < numberOfCenters; j++)
278  {
279  // Calculate the RBF value. Currently using Phi(r) = r with r is the euclidian distance between two points
280  p1 = m_Centers.at(i);
281  p2 = m_Centers.at(j);
282  p1 = p1 - p2;
283  norm = p1.two_norm();
284  m_SolutionMatrix(i, j) = norm;
285  }
286  }
287 }
288 
289 void mitk::CreateDistanceImageFromSurfaceFilter::FillDistanceImage()
290 {
291  /*
292  * Now we must calculate the distance for each pixel. But instead of calculating the distance value
293  * for all of the image's pixels we proceed similar to the region growing algorithm:
294  *
295  * 1. Take the first pixel from the narrowband_point_list and calculate the distance for each neighbor (6er)
296  * 2. If the current index's distance value is below a certain threshold push it into the list
297  * 3. Next iteration take the next index from the list and originAsIndex with 1. again
298  *
299  * This is done until the narrowband_point_list is empty.
300  */
301 
302  typedef itk::ImageRegionIteratorWithIndex<DistanceImageType> ImageIterator;
303  typedef itk::NeighborhoodIterator<DistanceImageType> NeighborhoodImageIterator;
304 
305  std::queue<DistanceImageType::IndexType> narrowbandPoints;
306  PointType currentPoint = m_Centers.at(0);
307  double distance = this->CalculateDistanceValue(currentPoint);
308 
309  // create itk::Point from vnl_vector
310  DistanceImageType::PointType currentPointAsPoint;
311  currentPointAsPoint[0] = currentPoint[0];
312  currentPointAsPoint[1] = currentPoint[1];
313  currentPointAsPoint[2] = currentPoint[2];
314 
315  // Transform the input point in world-coordinates to index-coordinates
316  DistanceImageType::IndexType currentIndex;
317  m_DistanceImageITK->TransformPhysicalPointToIndex(currentPointAsPoint, currentIndex);
318 
319  assert(
320  m_DistanceImageITK->GetLargestPossibleRegion().IsInside(currentIndex)); // we are quite certain this should hold
321 
322  narrowbandPoints.push(currentIndex);
323  m_DistanceImageITK->SetPixel(currentIndex, distance);
324 
325  NeighborhoodImageIterator::RadiusType radius;
326  radius.Fill(1);
327  NeighborhoodImageIterator nIt(radius, m_DistanceImageITK, m_DistanceImageITK->GetLargestPossibleRegion());
328  unsigned int relativeNbIdx[] = {4, 10, 12, 14, 16, 22};
329 
330  bool isInBounds = false;
331  while (!narrowbandPoints.empty())
332  {
333  nIt.SetLocation(narrowbandPoints.front());
334  narrowbandPoints.pop();
335 
336  unsigned int *relativeNb = &relativeNbIdx[0];
337  for (int i = 0; i < 6; i++)
338  {
339  nIt.GetPixel(*relativeNb, isInBounds);
340  if (isInBounds && nIt.GetPixel(*relativeNb) == m_DistanceImageDefaultBufferValue)
341  {
342  currentIndex = nIt.GetIndex(*relativeNb);
343 
344  // Transform the currently checked point from index-coordinates to
345  // world-coordinates
346  m_DistanceImageITK->TransformIndexToPhysicalPoint(currentIndex, currentPointAsPoint);
347 
348  // create a vnl_vector
349  currentPoint[0] = currentPointAsPoint[0];
350  currentPoint[1] = currentPointAsPoint[1];
351  currentPoint[2] = currentPointAsPoint[2];
352 
353  // and check the distance
354  distance = this->CalculateDistanceValue(currentPoint);
355  if (std::fabs(distance) <= m_DistanceImageSpacing * 2)
356  {
357  nIt.SetPixel(*relativeNb, distance);
358  narrowbandPoints.push(currentIndex);
359  }
360  }
361  relativeNb++;
362  }
363  }
364 
365  ImageIterator imgRegionIterator(m_DistanceImageITK, m_DistanceImageITK->GetLargestPossibleRegion());
366  imgRegionIterator.GoToBegin();
367 
368  double prevPixelVal = 1;
369 
370  DistanceImageType::IndexType _size;
371  _size.Fill(-1);
372  _size += m_DistanceImageITK->GetLargestPossibleRegion().GetSize();
373 
374  // Set every pixel inside the surface to -m_DistanceImageDefaultBufferValue except the edge point (so that the
375  // received surface is closed)
376  while (!imgRegionIterator.IsAtEnd())
377  {
378  if (imgRegionIterator.Get() == m_DistanceImageDefaultBufferValue && prevPixelVal < 0)
379  {
380  while (imgRegionIterator.Get() == m_DistanceImageDefaultBufferValue)
381  {
382  if (imgRegionIterator.GetIndex()[0] == _size[0] || imgRegionIterator.GetIndex()[1] == _size[1] ||
383  imgRegionIterator.GetIndex()[2] == _size[2] || imgRegionIterator.GetIndex()[0] == 0U ||
384  imgRegionIterator.GetIndex()[1] == 0U || imgRegionIterator.GetIndex()[2] == 0U)
385  {
386  imgRegionIterator.Set(m_DistanceImageDefaultBufferValue);
387  prevPixelVal = m_DistanceImageDefaultBufferValue;
388  ++imgRegionIterator;
389  break;
390  }
391  else
392  {
393  imgRegionIterator.Set((-1) * m_DistanceImageDefaultBufferValue);
394  ++imgRegionIterator;
395  prevPixelVal = (-1) * m_DistanceImageDefaultBufferValue;
396  }
397  }
398  }
399  else if (imgRegionIterator.GetIndex()[0] == _size[0] || imgRegionIterator.GetIndex()[1] == _size[1] ||
400  imgRegionIterator.GetIndex()[2] == _size[2] || imgRegionIterator.GetIndex()[0] == 0U ||
401  imgRegionIterator.GetIndex()[1] == 0U || imgRegionIterator.GetIndex()[2] == 0U)
402 
403  {
404  imgRegionIterator.Set(m_DistanceImageDefaultBufferValue);
405  prevPixelVal = m_DistanceImageDefaultBufferValue;
406  ++imgRegionIterator;
407  }
408  else
409  {
410  prevPixelVal = imgRegionIterator.Get();
411  ++imgRegionIterator;
412  }
413  }
414 
415  Image::Pointer resultImage = this->GetOutput();
416 
417  // Cast the created distance-Image from itk::Image to the mitk::Image
418  // that is our output.
419  CastToMitkImage(m_DistanceImageITK, resultImage);
420 }
421 
422 double mitk::CreateDistanceImageFromSurfaceFilter::CalculateDistanceValue(PointType p)
423 {
424  double distanceValue(0);
425  PointType p1;
426  PointType p2;
427  double norm;
428 
429  CenterList::iterator centerIter;
430 
431  unsigned int count(0);
432  for (centerIter = m_Centers.begin(); centerIter != m_Centers.end(); centerIter++)
433  {
434  p1 = *centerIter;
435  p2 = p - p1;
436  norm = p2.two_norm();
437  distanceValue = distanceValue + (norm * m_Weights[count]);
438  ++count;
439  }
440  return distanceValue;
441 }
442 
444 {
445 }
446 
448 {
449  std::stringstream out;
450  out << "Nummber of rows: " << m_SolutionMatrix.rows() << " ****** Number of columns: " << m_SolutionMatrix.cols()
451  << endl;
452  out << "[ ";
453  for (int i = 0; i < m_SolutionMatrix.rows(); i++)
454  {
455  for (int j = 0; j < m_SolutionMatrix.cols(); j++)
456  {
457  out << m_SolutionMatrix(i, j) << " ";
458  }
459  out << ";" << endl;
460  }
461  out << " ]\n\n\n";
462 
463  for (unsigned int i = 0; i < m_Centers.size(); i++)
464  {
465  out << m_Centers.at(i) << ";" << endl;
466  }
467  std::cout << "Equation system: \n\n\n" << out.str();
468 }
469 
471 {
472  this->SetInput(0, surface);
473 }
474 
476 {
477  if (this->GetInput(idx) != surface)
478  {
479  this->SetNthInput(idx, const_cast<mitk::Surface *>(surface));
480  this->Modified();
481  }
482 }
483 
485 {
486  if (this->GetNumberOfIndexedInputs() < 1)
487  return nullptr;
488 
489  return static_cast<const mitk::Surface *>(this->ProcessObject::GetInput(0));
490 }
491 
493 {
494  if (this->GetNumberOfIndexedInputs() < 1)
495  return nullptr;
496 
497  return static_cast<const mitk::Surface *>(this->ProcessObject::GetInput(idx));
498 }
499 
501 {
502  DataObjectPointerArraySizeType nb = this->GetNumberOfIndexedInputs();
503 
504  for (DataObjectPointerArraySizeType i = 0; i < nb; i++)
505  {
506  if (this->GetInput(i) == input)
507  {
508  this->RemoveInput(i);
509  return;
510  }
511  }
512 }
513 
515 {
516  for (unsigned int i = 0; i < this->GetNumberOfIndexedInputs(); i++)
517  {
518  this->PopBackInput();
519  }
520  this->SetNumberOfIndexedInputs(0);
521  this->SetNumberOfIndexedOutputs(1);
522 
524  this->SetNthOutput(0, output.GetPointer());
525 }
526 
528 {
529  this->m_UseProgressBar = status;
530 }
531 
533 {
534  this->m_ProgressStepSize = stepSize;
535 }
536 
537 void mitk::CreateDistanceImageFromSurfaceFilter::SetReferenceImage(itk::ImageBase<3>::Pointer referenceImage)
538 {
539  m_ReferenceImage = referenceImage;
540 }
541 
542 void mitk::CreateDistanceImageFromSurfaceFilter::DetermineBounds(
543  DistanceImageType::PointType &minPointInWorldCoordinates,
544  DistanceImageType::PointType &maxPointInWorldCoordinates,
545  DistanceImageType::IndexType &minPointInIndexCoordinates,
546  DistanceImageType::IndexType &maxPointInIndexCoordinates)
547 {
548  PointType firstCenter = m_Centers.at(0);
549  DistanceImageType::PointType tmpPoint;
550  tmpPoint[0] = firstCenter[0];
551  tmpPoint[1] = firstCenter[1];
552  tmpPoint[2] = firstCenter[2];
553 
554  // transform the first point from world-coordinates to index-coordinates
555  itk::ContinuousIndex<double, 3> tmpIndex;
556  m_ReferenceImage->TransformPhysicalPointToContinuousIndex(tmpPoint, tmpIndex);
557 
558  // initialize the variables with this first point
559  DistanceImageType::IndexValueType xmin = tmpIndex[0];
560  DistanceImageType::IndexValueType ymin = tmpIndex[1];
561  DistanceImageType::IndexValueType zmin = tmpIndex[2];
562  DistanceImageType::IndexValueType xmax = tmpIndex[0];
563  DistanceImageType::IndexValueType ymax = tmpIndex[1];
564  DistanceImageType::IndexValueType zmax = tmpIndex[2];
565 
566  // iterate over the rest of the points
567  auto centerIter = m_Centers.begin();
568  for (++centerIter; centerIter != m_Centers.end(); centerIter++)
569  {
570  tmpPoint[0] = (*centerIter)[0];
571  tmpPoint[1] = (*centerIter)[1];
572  tmpPoint[2] = (*centerIter)[2];
573 
574  // transform each point from world-coordinates to index-coordinates
575  m_ReferenceImage->TransformPhysicalPointToContinuousIndex(tmpPoint, tmpIndex);
576 
577  // and set the variables accordingly to find the minimum
578  // and maximum in all directions in index-coordinates
579  if (xmin > tmpIndex[0])
580  {
581  xmin = tmpIndex[0];
582  }
583  if (ymin > tmpIndex[1])
584  {
585  ymin = tmpIndex[1];
586  }
587  if (zmin > tmpIndex[2])
588  {
589  zmin = tmpIndex[2];
590  }
591  if (xmax < tmpIndex[0])
592  {
593  xmax = tmpIndex[0];
594  }
595  if (ymax < tmpIndex[1])
596  {
597  ymax = tmpIndex[1];
598  }
599  if (zmax < tmpIndex[2])
600  {
601  zmax = tmpIndex[2];
602  }
603  }
604 
605  // put the found coordinates into Index-Points
606  minPointInIndexCoordinates[0] = xmin;
607  minPointInIndexCoordinates[1] = ymin;
608  minPointInIndexCoordinates[2] = zmin;
609 
610  maxPointInIndexCoordinates[0] = xmax;
611  maxPointInIndexCoordinates[1] = ymax;
612  maxPointInIndexCoordinates[2] = zmax;
613 
614  // and transform them into world-coordinates
615  m_ReferenceImage->TransformIndexToPhysicalPoint(minPointInIndexCoordinates, minPointInWorldCoordinates);
616  m_ReferenceImage->TransformIndexToPhysicalPoint(maxPointInIndexCoordinates, maxPointInWorldCoordinates);
617 }
void Progress(unsigned int steps=1)
Sets the current amount of progress to current progress + steps.
Class for storing surfaces (vtkPolyData).
Definition: mitkSurface.h:28
#define MITK_INFO
Definition: mitkLogMacros.h:18
#define MITK_ERROR
Definition: mitkLogMacros.h:20
static ProgressBar * GetInstance()
static method to get the GUI dependent ProgressBar-instance so the methods for steps to do and progre...
void SetReferenceImage(itk::ImageBase< 3 >::Pointer referenceImage)
void SetProgressStepSize(unsigned int stepSize)
Set the stepsize which the progress bar should proceed.
Vector< ScalarType, 3 > Vector3D
Definition: mitkVector.h:130
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
void SetUseProgressBar(bool)
Set whether the mitkProgressBar should be used.
OutputType * GetOutput()
Get the output data of this image source object.