Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkIgnorePixelMaskGenerator.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 <mitkImageTimeSelector.h>
15 #include <mitkImageAccessByItk.h>
16 #include <itkImageIterator.h>
17 #include <itkImageConstIterator.h>
18 #include <mitkITKImageImport.h>
19 
20 namespace mitk
21 {
23 {
24  if (pixelValue != m_IgnoredPixelValue)
25  {
26  m_IgnoredPixelValue = pixelValue;
27  this->Modified();
28  }
29 }
30 
31 void IgnorePixelMaskGenerator::SetTimeStep(unsigned int timeStep)
32 {
33  if (m_TimeStep != timeStep)
34  {
35  m_TimeStep = timeStep;
36  }
37 }
38 
40 {
41  if (IsUpdateRequired())
42  {
43  if (m_inputImage.IsNull())
44  {
45  MITK_ERROR << "Image not set!";
46  }
47 
48  if (m_IgnoredPixelValue == std::numeric_limits<RealType>::min())
49  {
50  MITK_ERROR << "IgnotePixelValue not set!";
51  }
52 
53  if (m_TimeStep > (m_inputImage->GetTimeSteps() - 1))
54  {
55  MITK_ERROR << "Invalid time step: " << m_TimeStep << ". The image has " << m_inputImage->GetTimeSteps() << " timeSteps!";
56  }
57 
58  // extractimage time slice
60  imgTimeSel->SetInput(m_inputImage);
61  imgTimeSel->SetTimeNr(m_TimeStep);
62  imgTimeSel->UpdateLargestPossibleRegion();
63 
64  mitk::Image::Pointer timeSliceImage = imgTimeSel->GetOutput();
65 
66  // update m_InternalMask
67  AccessByItk(timeSliceImage, InternalCalculateMask);
68  m_InternalMask->SetGeometry(timeSliceImage->GetGeometry());
69 
70  this->Modified();
71  }
72  m_InternalMaskUpdateTime = m_InternalMask->GetMTime();
73  return m_InternalMask;
74 }
75 
76 template <typename TPixel, unsigned int VImageDimension>
77 void IgnorePixelMaskGenerator::InternalCalculateMask(typename itk::Image<TPixel, VImageDimension>* image)
78 {
79  typedef itk::Image<TPixel, VImageDimension> ImageType;
80  typedef itk::Image<unsigned short, VImageDimension> MaskType;
81 
82  typename MaskType::Pointer mask = MaskType::New();
83  mask->SetOrigin(image->GetOrigin());
84  mask->SetSpacing(image->GetSpacing());
85  mask->SetLargestPossibleRegion(image->GetLargestPossibleRegion());
86  mask->SetBufferedRegion(image->GetBufferedRegion());
87  mask->SetDirection(image->GetDirection());
88  mask->SetNumberOfComponentsPerPixel(image->GetNumberOfComponentsPerPixel());
89  mask->Allocate();
90  mask->FillBuffer(1);
91 
92  // iterate over image and mask and set mask=1 if image=m_IgnorePixelValue
93  itk::ImageRegionConstIterator<ImageType> imageIterator(image, image->GetLargestPossibleRegion());
94  itk::ImageRegionIterator<MaskType> maskIterator(mask, mask->GetLargestPossibleRegion());
95 
96 
97  for (imageIterator.GoToBegin(); !imageIterator.IsAtEnd(); ++imageIterator, ++maskIterator)
98  {
99  if (imageIterator.Value() == static_cast<TPixel>(m_IgnoredPixelValue))
100  {
101  maskIterator.Set(0);
102  }
103  }
104 
106 }
107 
108 bool IgnorePixelMaskGenerator::IsUpdateRequired() const
109 {
110  unsigned long thisClassTimeStamp = this->GetMTime();
111  unsigned long internalMaskTimeStamp = m_InternalMask->GetMTime();
112  unsigned long inputImageTimeStamp = m_inputImage->GetMTime();
113 
114  if (thisClassTimeStamp > m_InternalMaskUpdateTime) // inputs have changed
115  {
116  return true;
117  }
118 
119  if (m_InternalMaskUpdateTime < inputImageTimeStamp) // mask image has changed outside of this class
120  {
121  return true;
122  }
123 
124  if (internalMaskTimeStamp > m_InternalMaskUpdateTime) // internal mask has been changed outside of this class
125  {
126  return true;
127  }
128 
129  return false;
130 }
131 
132 } // end namespace
mitk::Image::ConstPointer m_inputImage
itk::Image< unsigned char, 3 > ImageType
#define MITK_ERROR
Definition: mitkLogMacros.h:20
DataCollection - Class to facilitate loading/accessing structured data.
mitk::Image::Pointer GetMask() override
Computes and returns the mask.
void InternalCalculateMask(typename itk::Image< TPixel, VImageDimension > *image)
Image::Pointer GrabItkImageMemory(itk::SmartPointer< ItkOutputImageType > &itkimage, mitk::Image *mitkImage=nullptr, const BaseGeometry *geometry=nullptr, bool update=true)
Grabs the memory of an itk::Image (with a specific type) and puts it into an mitk::Image.The memory is managed by the mitk::Image after calling this function. The itk::Image remains valid until the mitk::Image decides to free the memory.
#define AccessByItk(mitkImage, itkImageTypeFunction)
Access a MITK image by an ITK image.
mitk::Image::Pointer m_InternalMask
mitk::Image::Pointer image
void SetTimeStep(unsigned int timeStep) override
SetTimeStep is used to set the time step for which the mask is to be generated.
static T min(T x, T y)
Definition: svm.cpp:53
void SetIgnoredPixelValue(RealType pixelValue)
The mask will be 0 there inputImage==pixelValue and 1 otherwise.
mitk::Image::Pointer mask
static Pointer New()