22 #include <itkImageRegionConstIterator.h> 23 #include <itkImageSliceIteratorWithIndex.h> 25 #include <type_traits> 29 m_SliceDifferenceImage(nullptr),
48 imageOperation->IsImageStillValid())
50 m_Image = imageOperation->GetImage();
56 m_Factor = imageOperation->GetFactor();
85 "Slice and image dimensions differ or slice index is too large. Sorry, cannot work like this.");
89 if (
m_Image->GetDimension() == 4)
92 timeSelector->SetInput(
m_Image);
94 timeSelector->UpdateLargestPossibleRegion();
95 image3D = timeSelector->GetOutput();
144 itkExceptionMacro(
"Diff image size differs from original image size. Sorry, cannot work like this.");
148 if (
m_Image->GetDimension() == 4)
151 timeSelector->SetInput(
m_Image);
153 timeSelector->UpdateLargestPossibleRegion();
154 image3D = timeSelector->GetOutput();
198 itkExceptionMacro(
"Diff image must be 2D or 3D. Sorry, cannot work like this.");
215 #define myMITKDiffImageApplierFilterAccessByItk(mitkImage, itkImageTypeFunction, pixeltype, dimension, itkimage2) \ 216 if (typeId == MapPixelComponentType<pixeltype>::value) \ 219 typedef itk::Image<pixeltype, dimension> ImageType; \ 220 typedef mitk::ImageToItk<ImageType> ImageToItkType; \ 221 itk::SmartPointer<ImageToItkType> imagetoitk = ImageToItkType::New(); \ 222 const mitk::Image *constImage = mitkImage; \ 223 mitk::Image *nonConstImage = const_cast<mitk::Image *>(constImage); \ 224 nonConstImage->Update(); \ 225 imagetoitk->SetInput(nonConstImage); \ 226 imagetoitk->Update(); \ 227 itkImageTypeFunction(imagetoitk->GetOutput(), itkimage2); \ 231 #define myMITKDiffImageApplierFilterAccessAllTypesByItk(mitkImage, itkImageTypeFunction, dimension, itkimage2) \ 234 myMITKDiffImageApplierFilterAccessByItk(mitkImage, itkImageTypeFunction, double, dimension, itkimage2) else myMITKDiffImageApplierFilterAccessByItk( \ 236 itkImageTypeFunction, \ 239 itkimage2) else myMITKDiffImageApplierFilterAccessByItk(mitkImage, itkImageTypeFunction, int, dimension, itkimage2) else myMITKDiffImageApplierFilterAccessByItk(mitkImage, \ 240 itkImageTypeFunction, \ 243 itkimage2) else myMITKDiffImageApplierFilterAccessByItk(mitkImage, itkImageTypeFunction, short, dimension, itkimage2) else myMITKDiffImageApplierFilterAccessByItk(mitkImage, itkImageTypeFunction, unsigned short, dimension, itkimage2) else myMITKDiffImageApplierFilterAccessByItk(mitkImage, \ 244 itkImageTypeFunction, \ 247 itkimage2) else myMITKDiffImageApplierFilterAccessByItk(mitkImage, \ 248 itkImageTypeFunction, \ 255 template <
typename TPixel,
unsigned int VImageDimension>
263 template <
typename TPixel,
unsigned int VImageDimension>
271 template <
typename TPixel1,
unsigned int VImageDimension1,
typename TPixel2,
unsigned int VImageDimension2>
273 itk::Image<TPixel2, VImageDimension2> *outputImage)
275 typedef itk::Image<TPixel1, VImageDimension1> DiffImageType;
276 typedef itk::Image<TPixel2, VImageDimension2> VolumeImageType;
278 typedef itk::ImageSliceIteratorWithIndex<VolumeImageType> OutputSliceIteratorType;
279 typedef itk::ImageRegionConstIterator<DiffImageType> DiffSliceIteratorType;
281 typename VolumeImageType::RegionType sliceInVolumeRegion;
283 sliceInVolumeRegion = outputImage->GetLargestPossibleRegion();
287 OutputSliceIteratorType outputIterator(outputImage, sliceInVolumeRegion);
291 DiffSliceIteratorType diffIterator(diffImage, diffImage->GetLargestPossibleRegion());
294 outputIterator.GoToBegin();
295 diffIterator.GoToBegin();
296 while (!outputIterator.IsAtEnd())
298 while (!outputIterator.IsAtEndOfSlice())
300 while (!outputIterator.IsAtEndOfLine())
302 TPixel2 newValue = outputIterator.Get() + (TPixel2)((
double)diffIterator.Get() *
m_Factor);
303 outputIterator.Set(newValue);
307 outputIterator.NextLine();
309 outputIterator.NextSlice();
313 template <
typename TPixel1,
unsigned int VImageDimension1,
typename TPixel2,
unsigned int VImageDimension2>
315 itk::Image<TPixel2, VImageDimension2> *outputImage)
317 typedef itk::Image<TPixel1, VImageDimension1> DiffImageType;
318 typedef itk::Image<TPixel2, VImageDimension2> VolumeImageType;
320 typedef itk::ImageRegionIterator<VolumeImageType> OutputSliceIteratorType;
321 typedef itk::ImageRegionConstIterator<DiffImageType> DiffSliceIteratorType;
323 OutputSliceIteratorType outputIterator(outputImage, outputImage->GetLargestPossibleRegion());
324 DiffSliceIteratorType diffIterator(diffImage, diffImage->GetLargestPossibleRegion());
327 outputIterator.GoToBegin();
328 diffIterator.GoToBegin();
329 while (!outputIterator.IsAtEnd())
331 TPixel2 newValue = outputIterator.Get() + (TPixel2)((
double)diffIterator.Get() *
m_Factor);
332 outputIterator.Set(newValue);
339 # pragma warning(push) 340 # pragma warning(disable:4146) // unary minus operator applied to unsigned type, result still unsigned 343 template <
typename TPixel,
unsigned int VImageDimension>
346 typedef itk::ImageRegionIterator<itk::Image<TPixel, VImageDimension>> IteratorType;
347 IteratorType iter(itkImage, itkImage->GetLargestPossibleRegion());
350 while (!iter.IsAtEnd())
352 iter.Set(-(iter.Get()));
358 # pragma warning(pop) Operation, that holds information about some image difference.
void ItkImageProcessing2DDiff(itk::Image< TPixel1, VImageDimension1 > *itkImage1, itk::Image< TPixel2, VImageDimension2 > *itkImage2)
unsigned int m_Dimension0
unsigned int m_SliceDimension
#define AccessFixedDimensionByItk(mitkImage, itkImageTypeFunction, dimension)
Access a mitk-image with known dimension by an itk-image.
Base class of all Operation-classes.
void ItkImageSwitch3DDiff(itk::Image< TPixel, VImageDimension > *image)
void SetChangedSlice(const Image *sliceDiff, unsigned int sliceDimension, unsigned int sliceIndex, unsigned int timeStep)
Update after changing a single slice.
Generates interpolations of 2D slices.
void ItkImageSwitch2DDiff(itk::Image< TPixel, VImageDimension > *image)
Applies difference images to 3D images.
void ItkImageProcessing3DDiff(itk::Image< TPixel1, VImageDimension1 > *itkImage1, itk::Image< TPixel2, VImageDimension2 > *itkImage2)
void BlockModified(bool)
Block reaction to an images Modified() events.
static DiffImageApplier * GetInstanceForUndo()
void SetChangedVolume(const Image *sliceDiff, unsigned int timeStep)
unsigned int m_Dimension1
static RenderingManager * GetInstance()
unsigned int m_SliceIndex
static SegmentationInterpolationController * InterpolatorForImage(const Image *)
Find interpolator for a given image.
void ExecuteOperation(Operation *operation) override
Image::Pointer m_SliceDifferenceImage
#define myMITKDiffImageApplierFilterAccessAllTypesByItk(mitkImage, itkImageTypeFunction, dimension, itkimage2)
void ItkInvertPixelValues(itk::Image< TPixel, VImageDimension > *itkImage)
void RequestUpdateAll(RequestType type=REQUEST_UPDATE_ALL)
~DiffImageApplier() override