diff --git a/Modules/Segmentation/Controllers/mitkSliceBasedInterpolationController.cpp b/Modules/Segmentation/Controllers/mitkSliceBasedInterpolationController.cpp deleted file mode 100644 index cd2f1d8062..0000000000 --- a/Modules/Segmentation/Controllers/mitkSliceBasedInterpolationController.cpp +++ /dev/null @@ -1,442 +0,0 @@ -/*============================================================================ - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center (DKFZ) -All rights reserved. - -Use of this source code is governed by a 3-clause BSD license that can be -found in the LICENSE file. - -============================================================================*/ - -#include "mitkSliceBasedInterpolationController.h" - -#include "mitkExtractSliceFilter.h" -#include "mitkImageAccessByItk.h" -#include "mitkImageCast.h" -#include "mitkImageReadAccessor.h" -#include "mitkImageTimeSelector.h" - -#include "mitkShapeBasedInterpolationAlgorithm.h" - -#include <itkCommand.h> -#include <itkImage.h> -#include <itkImageSliceConstIteratorWithIndex.h> - -mitk::SliceBasedInterpolationController::InterpolatorMapType - mitk::SliceBasedInterpolationController::s_InterpolatorForImage; // static member initialization - -mitk::SliceBasedInterpolationController *mitk::SliceBasedInterpolationController::InterpolatorForImage( - const Image *image) -{ - auto iter = s_InterpolatorForImage.find(image); - if (iter != s_InterpolatorForImage.end()) - { - return iter->second; - } - else - { - return nullptr; - } -} - -mitk::SliceBasedInterpolationController::SliceBasedInterpolationController() - : m_WorkingImage(nullptr), m_ReferenceImage(nullptr) -{ -} - -mitk::SliceBasedInterpolationController::~SliceBasedInterpolationController() -{ - // remove this from the list of interpolators - for (auto iter = s_InterpolatorForImage.begin(); iter != s_InterpolatorForImage.end(); - ++iter) - { - if (iter->second == this) - { - s_InterpolatorForImage.erase(iter); - break; - } - } -} - -void mitk::SliceBasedInterpolationController::ResetLabelCount() -{ - m_LabelCountInSlice.clear(); - int numberOfLabels = m_WorkingImage->GetNumberOfLabels(0); - m_LabelCountInSlice.resize(m_WorkingImage->GetTimeSteps()); - - for (unsigned int timeStep = 0; timeStep < m_WorkingImage->GetTimeSteps(); ++timeStep) - { - m_LabelCountInSlice[timeStep].resize(3); - for (unsigned int dim = 0; dim < 3; ++dim) - { - m_LabelCountInSlice[timeStep][dim].clear(); - m_LabelCountInSlice[timeStep][dim].resize(m_WorkingImage->GetDimension(dim)); - for (unsigned int slice = 0; slice < m_WorkingImage->GetDimension(dim); ++slice) - { - m_LabelCountInSlice[timeStep][dim][slice].clear(); - m_LabelCountInSlice[timeStep][dim][slice].resize(numberOfLabels); - m_LabelCountInSlice[timeStep][dim][slice].assign(numberOfLabels, 0); - } - } - } -} - -void mitk::SliceBasedInterpolationController::SetWorkingImage(LabelSetImage *newImage) -{ - if (m_WorkingImage != newImage) - { - // delete the current working image from the list of interpolators - auto iter = s_InterpolatorForImage.find(m_WorkingImage); - if (iter != s_InterpolatorForImage.end()) - { - s_InterpolatorForImage.erase(iter); - } - - m_WorkingImage = newImage; - - s_InterpolatorForImage.insert(std::make_pair(m_WorkingImage, this)); - } - - this->ResetLabelCount(); - - AccessFixedDimensionByItk_1(m_WorkingImage, ScanImageITKProcessing, 3, 0); - - // for all timesteps, scan whole image: TODO: enable this again for 3D+time - /* - for (unsigned int timeStep = 0; timeStep < m_WorkingImage->GetTimeSteps(); ++timeStep) - { - ImageTimeSelector::Pointer timeSelector = ImageTimeSelector::New(); - timeSelector->SetInput( m_WorkingImage ); - timeSelector->SetTimeNr( timeStep ); - timeSelector->UpdateLargestPossibleRegion(); - Image::Pointer segmentation3D = timeSelector->GetOutput(); - this->SetChangedVolume( segmentation3D.GetPointer(), timeStep ); - } - */ - // this->Modified(); -} - -void mitk::SliceBasedInterpolationController::SetReferenceImage(Image *newImage) -{ - if (!newImage) - return; - - m_ReferenceImage = newImage; - - // ensure the reference image has the same dimensionality and extents as the segmentation image - if (m_WorkingImage.IsNull() || m_ReferenceImage->GetDimension() != m_WorkingImage->GetDimension() || - m_ReferenceImage->GetPixelType().GetNumberOfComponents() != 1 || - m_WorkingImage->GetPixelType().GetNumberOfComponents() != 1) - { - MITK_WARN << "Segmentation image has different image characteristics than reference image." << std::endl; - m_ReferenceImage = nullptr; - return; - } - - for (unsigned int dim = 0; dim < m_WorkingImage->GetDimension(); ++dim) - { - if (m_ReferenceImage->GetDimension(dim) != m_WorkingImage->GetDimension(dim)) - { - MITK_WARN << "original patient image does not match segmentation (different extent in dimension " << dim - << "), ignoring patient image" << std::endl; - m_ReferenceImage = nullptr; - return; - } - } -} - -void mitk::SliceBasedInterpolationController::SetChangedSlice(const Image *slice, - unsigned int sliceDimension, - unsigned int sliceIndex, - unsigned int timeStep) -{ - if (!slice) - return; - if (slice->GetDimension() != 2) - return; - if (sliceDimension > 2) - return; - if (m_WorkingImage.IsNull()) - return; - - // check if the number of labels has changed - auto numberOfLabels = m_WorkingImage->GetNumberOfLabels(0); - if (m_LabelCountInSlice[0][0][0].size() != numberOfLabels) - return; - - unsigned int dim0(0); - unsigned int dim1(1); - - // determine the other two dimensions - switch (sliceDimension) - { - default: - case 2: - dim0 = 0; - dim1 = 1; - break; - case 1: - dim0 = 0; - dim1 = 2; - break; - case 0: - dim0 = 1; - dim1 = 2; - break; - } - - AccessFixedDimensionByItk_1( - slice, ScanSliceITKProcessing, 2, SetChangedSliceOptions(sliceDimension, sliceIndex, dim0, dim1, timeStep)); - - // this->Modified(); -} - -template <typename PixelType> -void mitk::SliceBasedInterpolationController::ScanSliceITKProcessing(const itk::Image<PixelType, 2> *input, - const SetChangedSliceOptions &options) -{ - unsigned int timeStep = options.timeStep; - unsigned int sliceDimension = options.sliceDimension; - unsigned int sliceIndex = options.sliceIndex; - - if (sliceDimension > 2) - return; - if (sliceIndex >= m_LabelCountInSlice[timeStep][sliceDimension].size()) - return; - - unsigned int dim0(options.dim0); - unsigned int dim1(options.dim1); - - std::vector<int> numberOfPixels; // number of pixels in the current slice that are equal to the active label - unsigned int numberOfLabels = m_WorkingImage->GetNumberOfLabels(m_WorkingImage->GetActiveLayer()); - numberOfPixels.resize(numberOfLabels); - - typedef itk::Image<PixelType, 2> ImageType; - typedef itk::ImageRegionConstIteratorWithIndex<ImageType> IteratorType; - - IteratorType iter(input, input->GetLargestPossibleRegion()); - iter.GoToBegin(); - - typename IteratorType::IndexType index; - - while (!iter.IsAtEnd()) - { - index = iter.GetIndex(); - auto value = static_cast<int>(iter.Get()); - ++m_LabelCountInSlice[timeStep][dim0][index[0]][value]; - ++m_LabelCountInSlice[timeStep][dim1][index[1]][value]; - ++numberOfPixels[value]; - ++iter; - } - - for (unsigned int label = 0; label < numberOfLabels; ++label) - { - m_LabelCountInSlice[timeStep][sliceDimension][sliceIndex][label] = numberOfPixels[label]; - } -} - -template <typename TPixel, unsigned int VImageDimension> -void mitk::SliceBasedInterpolationController::ScanImageITKProcessing(itk::Image<TPixel, VImageDimension> *input, - unsigned int timeStep) -{ - typedef itk::ImageSliceConstIteratorWithIndex<itk::Image<TPixel, VImageDimension>> IteratorType; - - IteratorType iter(input, input->GetLargestPossibleRegion()); - iter.SetFirstDirection(0); - iter.SetSecondDirection(1); - - typename IteratorType::IndexType index; - unsigned int x = 0; - unsigned int y = 0; - unsigned int z = 0; - - std::vector<int> numberOfPixels; // number of pixels per slice that are equal to the active label - unsigned int numberOfLabels = m_WorkingImage->GetNumberOfLabels(m_WorkingImage->GetActiveLayer()); - numberOfPixels.resize(numberOfLabels); - - iter.GoToBegin(); - while (!iter.IsAtEnd()) - { - while (!iter.IsAtEndOfSlice()) - { - while (!iter.IsAtEndOfLine()) - { - index = iter.GetIndex(); - x = index[0]; - y = index[1]; - z = index[2]; - - int value = static_cast<unsigned int>(iter.Get()); - ++m_LabelCountInSlice[timeStep][0][x][value]; - ++m_LabelCountInSlice[timeStep][1][y][value]; - ++numberOfPixels[value]; - - ++iter; - } - iter.NextLine(); - } - - for (unsigned int label = 0; label < numberOfLabels; ++label) - m_LabelCountInSlice[timeStep][2][z][label] += numberOfPixels[label]; - - // clear label counter - numberOfPixels.assign(numberOfLabels, 0); - iter.NextSlice(); - } -} - -mitk::Image::Pointer mitk::SliceBasedInterpolationController::Interpolate(unsigned int sliceDimension, - unsigned int sliceIndex, - const mitk::PlaneGeometry *currentPlane, - unsigned int timeStep) -{ - if (m_WorkingImage.IsNull()) - return nullptr; - if (!currentPlane) - return nullptr; - if (timeStep >= m_LabelCountInSlice.size()) - return nullptr; - if (sliceDimension > 2) - return nullptr; - unsigned int upperLimit = m_LabelCountInSlice[timeStep][sliceDimension].size(); - if (sliceIndex >= upperLimit - 1) - return nullptr; // can't interpolate first and last slice - if (sliceIndex < 1) - return nullptr; - - int pixelValue = m_WorkingImage->GetActiveLabel()->GetValue(); - - // slice contains a segmentation, won't interpolate anything then - if (m_LabelCountInSlice[timeStep][sliceDimension][sliceIndex][pixelValue] > 0) - return nullptr; - - unsigned int lowerBound(0); - unsigned int upperBound(0); - bool bounds(false); - - for (lowerBound = sliceIndex - 1; /*lowerBound >= 0*/; --lowerBound) - { - if (m_LabelCountInSlice[timeStep][sliceDimension][lowerBound][pixelValue] > 0) - { - bounds = true; - break; - } - - if (lowerBound == 0) - break; - } - - if (!bounds) - return nullptr; - - bounds = false; - for (upperBound = sliceIndex + 1; upperBound < upperLimit; ++upperBound) - { - if (m_LabelCountInSlice[timeStep][sliceDimension][upperBound][pixelValue] > 0) - { - bounds = true; - break; - } - } - - if (!bounds) - return nullptr; - - // ok, we have found two neighboring slices with the active label - // (and we made sure that the current slice does NOT contain the active label - // Setting up the ExtractSliceFilter - mitk::ExtractSliceFilter::Pointer extractor = ExtractSliceFilter::New(); - extractor->SetInput(m_WorkingImage); - extractor->SetTimeStep(timeStep); - extractor->SetResliceTransformByGeometry(m_WorkingImage->GetTimeGeometry()->GetGeometryForTimeStep(timeStep)); - extractor->SetVtkOutputRequest(false); - - // Reslicing the current plane - extractor->SetWorldGeometry(currentPlane); - extractor->Modified(); - - try - { - extractor->Update(); - } - catch (const std::exception &e) - { - MITK_ERROR << "Error in 2D interpolation: " << e.what(); - return nullptr; - } - - mitk::Image::Pointer resultImage = extractor->GetOutput(); - resultImage->DisconnectPipeline(); - - // Creating PlaneGeometry for lower slice - mitk::PlaneGeometry::Pointer reslicePlane = currentPlane->Clone(); - - // Transforming the current origin so that it matches the lower slice - mitk::Point3D origin = currentPlane->GetOrigin(); - m_WorkingImage->GetSlicedGeometry()->WorldToIndex(origin, origin); - origin[sliceDimension] = lowerBound; - m_WorkingImage->GetSlicedGeometry()->IndexToWorld(origin, origin); - reslicePlane->SetOrigin(origin); - - // Extract the lower slice - extractor->SetWorldGeometry(reslicePlane); - extractor->Modified(); - - try - { - extractor->Update(); - } - catch (const std::exception &e) - { - MITK_ERROR << "Error in 2D interpolation: " << e.what(); - return nullptr; - } - - mitk::Image::Pointer lowerMITKSlice = extractor->GetOutput(); - lowerMITKSlice->DisconnectPipeline(); - - // Transforming the current origin so that it matches the upper slice - m_WorkingImage->GetSlicedGeometry()->WorldToIndex(origin, origin); - origin[sliceDimension] = upperBound; - m_WorkingImage->GetSlicedGeometry()->IndexToWorld(origin, origin); - reslicePlane->SetOrigin(origin); - - // Extract the upper slice - extractor->SetWorldGeometry(reslicePlane); - extractor->Modified(); - - try - { - extractor->Update(); - } - catch (const std::exception &e) - { - MITK_ERROR << "Error in 2D interpolation: " << e.what(); - return nullptr; - } - - mitk::Image::Pointer upperMITKSlice = extractor->GetOutput(); - upperMITKSlice->DisconnectPipeline(); - - if (lowerMITKSlice.IsNull() || upperMITKSlice.IsNull()) - return nullptr; - - // interpolation algorithm gets some inputs - // two segmentations (guaranteed to be of the same data type, but no special data type guaranteed) - // orientation (sliceDimension) of the segmentations - // position of the two slices (sliceIndices) - // one volume image (original patient image) - // - // interpolation algorithm can use e.g. itk::ImageSliceConstIteratorWithIndex to - // inspect the original patient image at appropriate positions - - mitk::SegmentationInterpolationAlgorithm::Pointer algorithm = - mitk::ShapeBasedInterpolationAlgorithm::New().GetPointer(); - - algorithm->Interpolate( - lowerMITKSlice.GetPointer(), lowerBound, upperMITKSlice.GetPointer(), upperBound, sliceIndex, 0, resultImage); - - return resultImage; -} diff --git a/Modules/Segmentation/Controllers/mitkSliceBasedInterpolationController.h b/Modules/Segmentation/Controllers/mitkSliceBasedInterpolationController.h deleted file mode 100644 index f0fab35c3e..0000000000 --- a/Modules/Segmentation/Controllers/mitkSliceBasedInterpolationController.h +++ /dev/null @@ -1,190 +0,0 @@ -/*============================================================================ - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center (DKFZ) -All rights reserved. - -Use of this source code is governed by a 3-clause BSD license that can be -found in the LICENSE file. - -============================================================================*/ - -#ifndef mitkSliceBasedInterpolationController_h -#define mitkSliceBasedInterpolationController_h - -#include "mitkLabelSetImage.h" -#include <MitkSegmentationExports.h> - -#include <itkImage.h> -#include <itkObjectFactory.h> - -#include <map> -#include <vector> - -namespace mitk -{ - class Image; - - /** - \brief Generates interpolations of 2D slices. - - \sa QmitkSlicesInterpolator - \sa QmitkInteractiveSegmentation - - \ingroup ToolManagerEtAl - - This class keeps track of the contents of a 3D segmentation image. - \attention mitk::SliceBasedInterpolationController assumes that the image contains pixel values of 0 and 1. - - After you set the segmentation image using SetSegmentationVolume(), the whole image is scanned for pixels other than - 0. - SliceBasedInterpolationController registers as an observer to the segmentation image, and repeats the scan whenvever - the - image is modified. - - You can prevent this (time consuming) scan if you do the changes slice-wise and send difference images to - SliceBasedInterpolationController. - For this purpose SetChangedSlice() should be used. mitk::OverwriteImageFilter already does this every time it - changes a - slice of an image. There is a static method InterpolatorForImage(), which can be used to find out if there already - is an interpolator - instance for a specified image. OverwriteImageFilter uses this to get to know its interpolator. - - SliceBasedInterpolationController needs to maintain some information about the image slices (in every dimension). - This information is stored internally in m_SegmentationCountInSlice, which is basically three std::vectors (one for - each dimension). - Each item describes one image dimension, each vector item holds the count of pixels in "its" slice. This is perhaps - better to understand - from the following picture (where red items just mean to symbolize "there is some segmentation" - in reality there - is an integer count). - - $Author$ - */ - class MITKSEGMENTATION_EXPORT SliceBasedInterpolationController : public itk::Object - { - public: - mitkClassMacroItkParent(SliceBasedInterpolationController, itk::Object); - itkFactorylessNewMacro(Self); - itkCloneMacro(Self); - - /** - \brief Find interpolator for a given image. - \return nullptr if there is no interpolator yet. - - This method is useful if several "clients" modify the same image and want to access the interpolations. - Then they can share the same object. - */ - static SliceBasedInterpolationController *InterpolatorForImage(const Image *); - - /** - \brief Initialize with a whole volume. - - Will scan the volume for segmentation pixels (values other than 0) and fill some internal data structures. - You don't have to call this method every time something changes, but only - when several slices at once change. - - When you change a single slice, call SetChangedSlice() instead. - */ - void SetWorkingImage(LabelSetImage *image); - - /** - \brief Set a reference image (original patient image) - optional. - - If this image is set (must exactly match the dimensions of the segmentation), - the interpolation algorithm may consider image content to improve the interpolated - (estimated) segmentation. - */ - void SetReferenceImage(Image *image); - - /** - \brief Update after changing a single slice in the working image. - - \param image is a 2D image with the difference image of the slice determined by sliceDimension and sliceIndex. - The difference is (pixel value in the new slice minus pixel value in the old slice). - - \param sliceDimension Number of the dimension which is constant for all pixels of the meant slice. - - \param sliceIndex Which slice to take, in the direction specified by sliceDimension. Count starts from 0. - - \param timeStep Which time step is changed - */ - void SetChangedSlice(const Image *image, - unsigned int sliceDimension, - unsigned int sliceIndex, - unsigned int timeStep); - - /** - \brief Generates an interpolated image for the given slice. - - \param sliceDimension Number of the dimension which is constant for all pixels of the meant slice. - - \param sliceIndex Which slice to take, in the direction specified by sliceDimension. Count starts from 0. - - \param currentPlane - - \param timeStep Which time step to use - */ - Image::Pointer Interpolate(unsigned int sliceDimension, - unsigned int sliceIndex, - const mitk::PlaneGeometry *currentPlane, - unsigned int timeStep); - - /** - \brief Initializes the internal container with the number of voxels per label. - */ - void ResetLabelCount(); - - protected: - /** - \brief Protected class of mitk::SliceBasedInterpolationController. Don't use (you shouldn't be able to do so)! - */ - class MITKSEGMENTATION_EXPORT SetChangedSliceOptions - { - public: - SetChangedSliceOptions(unsigned int sd, unsigned int si, unsigned int d0, unsigned int d1, unsigned int t) - : sliceDimension(sd), sliceIndex(si), dim0(d0), dim1(d1), timeStep(t) - { - } - - unsigned int sliceDimension; - unsigned int sliceIndex; - unsigned int dim0; - unsigned int dim1; - unsigned int timeStep; - // void* pixelData; - }; - - typedef std::vector<unsigned int> LabelCounterVectorType; - typedef std::vector<LabelCounterVectorType> LabelCounterSliceVectorType; - typedef std::vector<std::vector<LabelCounterSliceVectorType>> LabelCounterSliceTimeVectorType; - typedef std::map<const Image *, SliceBasedInterpolationController *> InterpolatorMapType; - - SliceBasedInterpolationController(); // purposely hidden - ~SliceBasedInterpolationController() override; - - /// internal scan of a single slice - template <typename PixelType> - void ScanSliceITKProcessing(const itk::Image<PixelType, 2> *, const SetChangedSliceOptions &options); - - /// internal scan of the whole image - template <typename TPixel, unsigned int VImageDimension> - void ScanImageITKProcessing(itk::Image<TPixel, VImageDimension> *, unsigned int timeStep); - - /** - An array that of flags. One for each dimension of the image. A flag is set, when a slice in a certain dimension - has at least one pixel that is not 0 (which would mean that it has to be considered by the interpolation - algorithm). - E.g. flags for axial slices are stored in m_SegmentationCountInSlice[0][index]. - Enhanced with time steps it is now m_SegmentationCountInSlice[timeStep][0][index] - */ - LabelCounterSliceTimeVectorType m_LabelCountInSlice; - - static InterpolatorMapType s_InterpolatorForImage; - - LabelSetImage::Pointer m_WorkingImage; - Image::Pointer m_ReferenceImage; - }; -} // namespace - -#endif diff --git a/Modules/Segmentation/files.cmake b/Modules/Segmentation/files.cmake index 5a57291852..60ecdb6613 100644 --- a/Modules/Segmentation/files.cmake +++ b/Modules/Segmentation/files.cmake @@ -1,120 +1,118 @@ set(CPP_FILES Algorithms/mitkCalculateSegmentationVolume.cpp Algorithms/mitkContourModelSetToImageFilter.cpp Algorithms/mitkContourSetToPointSetFilter.cpp Algorithms/mitkContourUtils.cpp Algorithms/mitkCorrectorAlgorithm.cpp Algorithms/mitkDiffImageApplier.cpp Algorithms/mitkDiffSliceOperation.cpp Algorithms/mitkDiffSliceOperationApplier.cpp Algorithms/mitkFeatureBasedEdgeDetectionFilter.cpp Algorithms/mitkGrowCutSegmentationFilter.cpp Algorithms/mitkImageLiveWireContourModelFilter.cpp Algorithms/mitkImageToContourFilter.cpp - #Algorithms/mitkImageToContourModelFilter.cpp Algorithms/mitkImageToLiveWireContourFilter.cpp Algorithms/mitkManualSegmentationToSurfaceFilter.cpp Algorithms/mitkOtsuSegmentationFilter.cpp Algorithms/mitkSegmentationHelper.cpp Algorithms/mitkSegmentationObjectFactory.cpp Algorithms/mitkShapeBasedInterpolationAlgorithm.cpp Algorithms/mitkShowSegmentationAsSmoothedSurface.cpp Algorithms/mitkShowSegmentationAsSurface.cpp Algorithms/mitkVtkImageOverwrite.cpp Controllers/mitkSegmentationInterpolationController.cpp Controllers/mitkToolManager.cpp Controllers/mitkSegmentationModuleActivator.cpp Controllers/mitkToolManagerProvider.cpp DataManagement/mitkContour.cpp DataManagement/mitkContourSet.cpp DataManagement/mitkExtrudedContour.cpp Interactions/mitkAddContourTool.cpp Interactions/mitkAutoCropTool.cpp Interactions/mitkSegWithPreviewTool.cpp Interactions/mitkBinaryThresholdBaseTool.cpp Interactions/mitkBinaryThresholdTool.cpp Interactions/mitkBinaryThresholdULTool.cpp Interactions/mitkCloseRegionTool.cpp Interactions/mitkContourModelInteractor.cpp Interactions/mitkContourModelLiveWireInteractor.cpp Interactions/mitkEditableContourTool.cpp Interactions/mitkLiveWireTool2D.cpp Interactions/mitkLassoTool.cpp Interactions/mitkContourTool.cpp Interactions/mitkDrawPaintbrushTool.cpp Interactions/mitkErasePaintbrushTool.cpp Interactions/mitkEraseRegionTool.cpp Interactions/mitkFeedbackContourTool.cpp Interactions/mitkFillRegionBaseTool.cpp Interactions/mitkFillRegionTool.cpp Interactions/mitkGrowCutTool.cpp Interactions/mitkOtsuTool3D.cpp Interactions/mitkPaintbrushTool.cpp Interactions/mitkRegionGrowingTool.cpp Interactions/mitkSegmentationsProcessingTool.cpp Interactions/mitkSegTool2D.cpp Interactions/mitkSubtractContourTool.cpp Interactions/mitkTool.cpp Interactions/mitkToolCommand.cpp Interactions/mitkPickingTool.cpp Interactions/mitknnUnetTool.cpp Interactions/mitkProcessExecutor.cpp Interactions/mitkSegmentAnythingProcessExecutor.cpp Interactions/mitkTotalSegmentatorTool.cpp Interactions/mitkSegmentAnythingTool.cpp Interactions/mitkSegmentAnythingPythonService.cpp Rendering/mitkContourMapper2D.cpp Rendering/mitkContourSetMapper2D.cpp Rendering/mitkContourSetVtkMapper3D.cpp Rendering/mitkContourVtkMapper3D.cpp SegmentationUtilities/BooleanOperations/mitkBooleanOperation.cpp SegmentationUtilities/MorphologicalOperations/mitkMorphologicalOperations.cpp #Added from ML - Controllers/mitkSliceBasedInterpolationController.cpp Algorithms/mitkSurfaceStampImageFilter.cpp ) set(RESOURCE_FILES Add.svg Add_Cursor.svg AI.svg AI_Cursor.svg Close.svg Close_Cursor.svg Erase.svg Erase_Cursor.svg Fill.svg Fill_Cursor.svg LiveWire.svg LiveWire_Cursor.svg Lasso.svg GrowCut.svg Lasso_Cursor.svg Otsu.svg Paint.svg Paint_Cursor.svg Picking.svg RegionGrowing.svg RegionGrowing_Cursor.svg Subtract.svg Subtract_Cursor.svg Threshold.svg ULThreshold.svg Wipe.svg Wipe_Cursor.svg Interactions/dummy.xml Interactions/EditableContourTool.xml Interactions/PickingTool.xml Interactions/MouseReleaseOnly.xml Interactions/PressMoveRelease.xml Interactions/PressMoveReleaseAndPointSetting.xml Interactions/PressMoveReleaseWithCTRLInversion.xml Interactions/PressMoveReleaseWithCTRLInversionAllMouseMoves.xml Interactions/SegmentationConfig.xml Interactions/SegmentationInteraction.xml Interactions/SegmentationToolsConfig.xml Interactions/ContourModelModificationConfig.xml Interactions/ContourModelModificationInteractor.xml )