27 #include <vtkTransform.h> 28 #include <vtkTransformPolyDataFilter.h> 30 #include <itkImageRegionIterator.h> 31 #include <itkQuadEdgeMesh.h> 32 #include <itkTriangleMeshToBinaryImageFilter.h> 35 #include <itkCommand.h> 37 template <
typename TPixel,
unsigned int VDimensions>
38 void SetToZero(itk::Image<TPixel, VDimensions> *source)
40 source->FillBuffer(0);
43 template <
unsigned int VImageDimension = 3>
49 std::size_t numberOfPixels = 1;
50 for (
int dim = 0; dim < static_cast<int>(VImageDimension); ++dim)
51 numberOfPixels *= static_cast<std::size_t>(readAccessor.
GetDimension(dim));
53 auto src = readAccessor.
GetData();
54 auto dest = writeAccessor.
GetData();
56 for (std::size_t i = 0; i < numberOfPixels; ++i)
58 if (index == *(src + i))
64 :
mitk::
Image(), m_ActiveLayer(0), m_activeLayerInvalid(false), m_ExteriorLabel(nullptr)
89 mitk::LabelSet::Pointer lsClone = other.
GetLabelSet(i)->Clone();
91 itk::SimpleMemberCommand<Self>::Pointer command = itk::SimpleMemberCommand<Self>::New();
93 lsClone->AddObserver(itk::ModifiedEvent(), command);
107 Superclass::Modified();
127 mitk::PixelType pixelType(mitk::MakeScalarPixelType<LabelSetImage::PixelType>());
131 Superclass::Initialize(pixelType, 3, dimensions);
190 if (layerToDelete != 0)
204 if (layerToDelete == 0)
221 if (newImage->GetDimension() < 4)
230 unsigned int newLabelSetId = this->
AddLayer(newImage, lset);
232 return newLabelSetId;
240 mitk::LabelSet::Pointer
ls;
241 if (lset.IsNotNull())
249 ls->SetActiveLabel(0 );
252 ls->SetLayer(newLabelSetId);
263 itk::SimpleMemberCommand<Self>::Pointer command = itk::SimpleMemberCommand<Self>::New();
265 ls->AddObserver(itk::ModifiedEvent(), command);
270 return newLabelSetId;
277 mitkThrow() <<
"Trying to add labelSet to non-existing layer.";
290 defaultLabelSet->SetActiveLabel(0 );
345 catch (itk::ExceptionObject &e)
356 if ((otherDims[0] != thisDims[0]) || (otherDims[1] != thisDims[1]) || (otherDims[2] != thisDims[2]))
357 mitkThrow() <<
"Dimensions do not match.";
362 for (
int layer = 0; layer < numberOfLayers; ++layer)
378 catch (itk::ExceptionObject &e)
392 catch (itk::ExceptionObject &e)
423 catch (itk::ExceptionObject &e)
435 for (
unsigned int idx = 0; idx < vectorOfSourcePixelValues.size(); idx++)
440 catch (itk::ExceptionObject &e)
450 for (
unsigned int idx = 0; idx < VectorOfLabelPixelValues.size(); idx++)
453 EraseLabel(VectorOfLabelPixelValues[idx], layer);
459 for (
unsigned int i = 0; i < VectorOfLabelPixelValues.size(); i++)
461 this->
EraseLabel(VectorOfLabelPixelValues[i], layer);
471 catch (itk::ExceptionObject &e)
537 unsigned int totalLabels(0);
540 totalLabels += (*layerIter)->GetNumberOfLabels();
549 padImageFilter->SetInput(0, mask);
550 padImageFilter->SetInput(1,
this);
551 padImageFilter->SetPadConstant(0);
552 padImageFilter->SetBinaryFilter(
false);
553 padImageFilter->SetLowerThreshold(0);
554 padImageFilter->SetUpperThreshold(1);
556 padImageFilter->Update();
560 if (paddedMask.IsNull())
567 mitkThrow() <<
"Could not stamp the provided mask on the selected label.";
578 mask->Initialize(
this);
581 for (
unsigned int dim = 0; dim <
mask->GetDimension(); ++dim)
582 byteSize *=
mask->GetDimension(dim);
586 memset(accessor.
GetData(), 0, byteSize);
594 ::CreateLabelMaskProcessing<4>(
this,
mask, index);
610 mitkThrow() <<
"Could not create a mask out of the selected label.";
621 if (image.IsNull() || image->IsEmpty() || !image->IsInitialized())
629 for (
unsigned int dim = 0; dim < image->GetDimension(); ++dim)
631 byteSize *= image->GetDimension(dim);
635 memset(accessor->
GetData(), 0, byteSize);
638 auto geometry = image->GetTimeGeometry()->Clone();
641 if (image->GetDimension() == 3)
645 else if (image->GetDimension() == 4)
651 mitkThrow() << image->GetDimension() <<
"-dimensional label set images not yet supported";
656 mitkThrow() <<
"Could not intialize by provided labeled image.";
661 template <
typename LabelSetImageType,
typename ImageType>
664 typedef itk::ImageRegionConstIteratorWithIndex<ImageType> SourceIteratorType;
665 typedef itk::ImageRegionIterator<LabelSetImageType> TargetIteratorType;
667 TargetIteratorType targetIter(labelSetImage, labelSetImage->GetRequestedRegion());
668 targetIter.GoToBegin();
670 SourceIteratorType sourceIter(image, image->GetRequestedRegion());
671 sourceIter.GoToBegin();
673 while (!sourceIter.IsAtEnd())
675 auto sourceValue =
static_cast<PixelType>(sourceIter.Get());
676 targetIter.Set(sourceValue);
680 std::stringstream name;
681 name <<
"object-" << sourceValue;
687 color.SetRed(rgba[0]);
688 color.SetGreen(rgba[1]);
689 color.SetBlue(rgba[2]);
692 label->SetName(name.str().c_str());
693 label->SetColor(color);
694 label->SetOpacity(rgba[3]);
695 label->SetValue(sourceValue);
709 template <
typename ImageType>
712 typename ImageType::Pointer itkMask;
715 typedef itk::ImageRegionConstIterator<ImageType> SourceIteratorType;
716 typedef itk::ImageRegionIterator<ImageType> TargetIteratorType;
718 SourceIteratorType sourceIter(itkMask, itkMask->GetLargestPossibleRegion());
719 sourceIter.GoToBegin();
721 TargetIteratorType targetIter(itkImage, itkImage->GetLargestPossibleRegion());
722 targetIter.GoToBegin();
726 while (!sourceIter.IsAtEnd())
728 PixelType sourceValue = sourceIter.Get();
729 PixelType targetValue = targetIter.Get();
731 if ((sourceValue != 0) &&
732 (forceOverwrite || !this->
GetLabel(targetValue)->GetLocked()))
734 targetIter.Set(activeLabel);
743 template <
typename ImageType>
747 typedef itk::ImageRegionConstIterator<ImageType> IteratorType;
748 IteratorType iter(itkImage, itkImage->GetLargestPossibleRegion());
751 std::vector<typename ImageType::IndexType> indexVector;
753 while (!iter.IsAtEnd())
756 if (iter.Get() == pixelValue)
758 indexVector.push_back(iter.GetIndex());
766 if (!indexVector.empty())
768 typename itk::ImageRegionConstIteratorWithIndex<ImageType>::IndexType centerIndex;
769 centerIndex = indexVector.at(indexVector.size() / 2);
770 if (centerIndex.GetIndexDimension() == 3)
772 pos[0] = centerIndex[0];
773 pos[1] = centerIndex[1];
774 pos[2] = centerIndex[2];
785 template <
typename ImageType>
788 itkImage->FillBuffer(0);
792 template <
typename ImageType>
795 typename ImageType::Pointer itkSource = ImageType::New();
798 typedef itk::ImageRegionConstIterator<ImageType> ConstIteratorType;
799 typedef itk::ImageRegionIterator<ImageType> IteratorType;
801 ConstIteratorType sourceIter(itkSource, itkSource->GetLargestPossibleRegion());
802 IteratorType targetIter(itkTarget, itkTarget->GetLargestPossibleRegion());
805 sourceIter.GoToBegin();
806 targetIter.GoToBegin();
808 while (!sourceIter.IsAtEnd())
810 PixelType sourceValue = sourceIter.Get();
811 PixelType targetValue = targetIter.Get();
812 if ((sourceValue != 0) && !this->
GetLabel(targetValue)->GetLocked())
814 targetIter.Set(sourceValue + numberOfTargetLabels);
821 template <
typename TPixel,
unsigned int VImageDimension>
825 typedef itk::Image<TPixel, VImageDimension>
ImageType;
826 typename ImageType::Pointer itkSource;
828 itkSource = ImageToItkImage<TPixel, VImageDimension>(
m_LayerContainer[layer]);
829 typedef itk::ImageRegionConstIterator<ImageType> SourceIteratorType;
830 typedef itk::ImageRegionIterator<ImageType> TargetIteratorType;
832 SourceIteratorType sourceIter(itkSource, itkSource->GetLargestPossibleRegion());
833 sourceIter.GoToBegin();
835 TargetIteratorType targetIter(target, target->GetLargestPossibleRegion());
836 targetIter.GoToBegin();
838 while (!sourceIter.IsAtEnd())
840 targetIter.Set(sourceIter.Get());
846 template <
typename TPixel,
unsigned int VImageDimension>
848 unsigned int layer)
const 850 typedef itk::Image<TPixel, VImageDimension>
ImageType;
851 typename ImageType::Pointer itkTarget;
853 itkTarget = ImageToItkImage<TPixel, VImageDimension>(
m_LayerContainer[layer]);
855 typedef itk::ImageRegionConstIterator<ImageType> SourceIteratorType;
856 typedef itk::ImageRegionIterator<ImageType> TargetIteratorType;
858 SourceIteratorType sourceIter(source, source->GetLargestPossibleRegion());
859 sourceIter.GoToBegin();
861 TargetIteratorType targetIter(itkTarget, itkTarget->GetLargestPossibleRegion());
862 targetIter.GoToBegin();
864 while (!sourceIter.IsAtEnd())
866 targetIter.Set(sourceIter.Get());
872 template <
typename ImageType>
875 typedef itk::ImageRegionIterator<ImageType> IteratorType;
877 IteratorType iter(itkImage, itkImage->GetLargestPossibleRegion());
880 while (!iter.IsAtEnd())
884 if (value == pixelValue)
892 template <
typename ImageType>
895 typedef itk::ImageRegionIterator<ImageType> IteratorType;
897 IteratorType iter(itkImage, itkImage->GetLargestPossibleRegion());
900 while (!iter.IsAtEnd())
902 if (iter.Get() == index)
904 iter.Set(pixelValue);
915 bool returnValue =
true;
919 MITK_INFO(verbose) <<
"--- LabelSetImage Equal ---";
925 MITK_INFO(verbose) <<
"Number of layers not equal.";
933 MITK_INFO(verbose) <<
"Total number of labels not equal.";
941 MITK_INFO(verbose) <<
"Active layer not equal.";
947 MITK_INFO(verbose) <<
"Can not compare image data for 4D images - skipping check.";
955 MITK_INFO(verbose) <<
"Working image data not equal.";
960 for (
unsigned int layerIndex = 0; layerIndex < leftHandSide.
GetNumberOfLayers(); layerIndex++)
964 MITK_INFO(verbose) <<
"Can not compare image data for 4D images - skipping check.";
973 MITK_INFO(verbose) <<
"Layer image data not equal.";
983 MITK_INFO(verbose) <<
"Layer labelset data not equal.";
void CreateLabelMaskProcessing(mitk::Image *layerImage, mitk::Image *mask, mitk::LabelSet::PixelType index)
LabelContainerConstIteratorType IteratorConstBegin() const
Returns a const iterator poiting to the begining of the container.
unsigned int GetNumberOfLabels(unsigned int layer=0) const
Get the number of all existing mitk::Labels for a given layer.
Gives locked and index-based write access for a particular image part. The class provides several set...
unsigned int GetActiveLayer() const
Gets the ID of the currently active layer.
void IndexToWorld(const mitk::Vector3D &vec_units, mitk::Vector3D &vec_mm) const
Convert (continuous or discrete) index coordinates of a vector vec_units to world coordinates (in mm)...
void LayerContainerToImageProcessing(itk::Image< TPixel, VImageDimension > *source, unsigned int layer)
Gives locked and index-based read access for a particular image part. The class provides several set-...
void ClearBufferProcessing(ImageType *input)
LabelContainerConstIteratorType IteratorConstEnd() const
Returns a const iterator pointing to the end of the container.
mitk::Image::Pointer CreateLabelMask(PixelType index, bool useActiveLayer=true, unsigned int layer=0)
void InitializeByLabeledImageProcessing(LabelSetImageType *input, ImageType *other)
void Concatenate(mitk::LabelSetImage *image)
#define AccessFixedDimensionByItk(mitkImage, itkImageTypeFunction, dimension)
Access a mitk-image with known dimension by an itk-image.
const mitk::PixelType GetPixelType(int n=0) const
Returns the PixelType of channel n.
itk::Image< unsigned char, 3 > ImageType
void Initialize() override
unsigned int * GetDimensions() const
Get the sizes of all dimensions as an integer-array.
void InitializeByLabeledImage(mitk::Image::Pointer image)
Initialize a new mitk::LabelSetImage by an given image. For all distinct pixel values of the paramete...
#define AccessFixedDimensionByItk_n(mitkImage, itkImageTypeFunction, dimension, va_tuple)
Access a mitk-image with known dimension by an itk-image with one or more parameters.
void OnLabelSetModified()
virtual void SetTimeGeometry(TimeGeometry *geometry)
Set the TimeGeometry of the data, which will be referenced (not copied!).
Message BeforeChangeLayerEvent
BeforeChangeLayerEvent (e.g. used for GUI integration) As soon as active labelset should be changed...
void RemoveLayer()
Removes the active layer and the respective mitk::LabelSet and image information. The new active laye...
DataCollection - Class to facilitate loading/accessing structured data.
void MergeLabel(PixelType pixelValue, PixelType sourcePixelValue, unsigned int layer=0)
Merges the mitk::Label with a given target value with the active label.
A data structure describing a label.
void CalculateCenterOfMassProcessing(ImageType *input, PixelType index, unsigned int layer)
void * GetData()
Gives full data access.
Constants for most interaction classes, due to the generic StateMachines.
void EraseLabel(PixelType pixelValue, unsigned int layer=0)
Erases the label with the given value in the given layer from the underlying image. The label itself will not be erased from the respective mitk::LabelSet. In order to remove the label itself use mitk::LabelSetImage::RemoveLabels()
mitk::Label * GetExteriorLabel()
Gets the mitk::Label which is used as default exterior label.
#define AccessByItk_1(mitkImage, itkImageTypeFunction, arg1)
void AddLabelSetToLayer(const unsigned int layerIdx, const mitk::LabelSet::Pointer labelSet)
Add a LabelSet to an existing layer.
void AddLabel(mitk::Label *label)
mitk::Label::Pointer m_ExteriorLabel
std::vector< Image::Pointer > m_LayerContainer
void RemoveLabels(std::vector< PixelType > &VectorOfLabelPixelValues, unsigned int layer=0)
Removes labels from the mitk::LabelSet of given layer. Calls mitk::LabelSetImage::EraseLabels() which...
bool ExistLabelSet(unsigned int layer) const
Returns true if the labelset exists.
void MaskStampProcessing(ImageType *input, mitk::Image *mask, bool forceOverwrite)
const mitk::TimeGeometry * GetTimeGeometry() const
Return the TimeGeometry of the data as const pointer.
unsigned int GetNumberOfLayers() const
void SetExteriorLabel(mitk::Label *label)
Sets the label which is used as default exterior label when creating a new layer. ...
unsigned int GetNumberOfChannels() const
Get the number of channels.
~LabelSetImage() override
unsigned int GetDimension() const
Get dimension of the image.
unsigned int GetTotalNumberOfLabels() const
Returns the number of all labels summed up across all layers.
#define AccessFixedDimensionByItk_2(mitkImage, itkImageTypeFunction, dimension, arg1, arg2)
void MergeLabels(PixelType pixelValue, std::vector< PixelType > &vectorOfSourcePixelValues, unsigned int layer=0)
Merges a list of mitk::Labels with the mitk::Label that has a specific value.
static void DeriveDICOMSourceProperties(const BaseData *sourceDICOMImage, BaseData *derivedDICOMImage)
void EraseLabels(std::vector< PixelType > &VectorOfLabelPixelValues, unsigned int layer=0)
Similar to mitk::LabelSetImage::EraseLabel() this funtion erase a list of labels from the image...
static const PixelType MAX_LABEL_VALUE
The maximum value a label can get: Since the value is of type unsigned short MAX_LABEL_VALUE = 65535...
unsigned int AddLayer(mitk::LabelSet::Pointer layer=nullptr)
Adds a new layer to the LabelSetImage. The new layer will be set as the active one.
mitk::LabelSet * GetActiveLabelSet()
Returns the currently active mitk::LabelSet.
Image class for storing images.
void ImageToLayerContainerProcessing(itk::Image< TPixel, VImageDimension > *source, unsigned int layer) const
const TPixel * GetData() const
Gives const access to the data.
SlicedGeometry3D * GetSlicedGeometry(unsigned int t=0) const
Convenience access method for the geometry, which is of type SlicedGeometry3D (or a sub-class of it)...
void ConcatenateProcessing(ImageType *input, mitk::LabelSetImage *other)
mitk::Image * GetLayerImage(unsigned int layer)
mitk::Label * GetActiveLabel(unsigned int layer=0)
Returns the active label of a specific layer.
#define AccessByItk(mitkImage, itkImageTypeFunction)
Access a MITK image by an ITK image.
mitk::Label::PixelType PixelType
void SetCenterOfMassCoordinates(const mitk::Point3D ¢er)
bool ExistLabel(PixelType pixelValue) const
Returns true if the value exists in one of the labelsets.
mitk::Image::Pointer image
PixelType GetValue() const
itk::RGBPixel< float > Color
Color Standard RGB color typedef (float)
void SetCenterOfMassIndex(const mitk::Point3D ¢er)
void SetActiveLayer(unsigned int layer)
void SetToZero(itk::Image< TPixel, VDimensions > *source)
void UpdateCenterOfMass(PixelType pixelValue, unsigned int layer=0)
MITKNEWMODULE_EXPORT bool Equal(mitk::ExampleDataStructure *leftHandSide, mitk::ExampleDataStructure *rightHandSide, mitk::ScalarType eps, bool verbose)
Returns true if the example data structures are considered equal.
void MITKCORE_EXPORT CastToItkImage(const mitk::Image *mitkImage, itk::SmartPointer< ItkOutputImageType > &itkOutputImage)
Cast an mitk::Image to an itk::Image with a specific type.
int GetDimension(int i) const
LabelSetImage class for handling labels and layers in a segmentation session.
void SetActiveLabel(PixelType)
bool m_activeLayerInvalid
void MaskStamp(mitk::Image *mask, bool forceOverwrite)
MITKCORE_EXPORT const ScalarType eps
#define AccessTwoImagesFixedDimensionByItk(mitkImage1, mitkImage2, itkImageTypeFunction, dimension)
Access two mitk-images with known dimension by itk-images.
virtual TPixel * GetData() const
Gives full data access.
mitk::Image::Pointer mask
ImageWriteAccessor class to get locked write-access for a particular image part.
mitk::Label * GetLabel(PixelType pixelValue, unsigned int layer=0) const
Returns the mitk::Label with the given pixelValue and for the given layer.
static void DeriveDICOMSegmentationProperties(LabelSetImage *dicomSegImage)
#define AccessByItk_2(mitkImage, itkImageTypeFunction, arg1, arg2)
mitk::Label::PixelType PixelType
ImageDescriptor::Pointer GetImageDescriptor() const
mitk::LabelSet * GetLabelSet(unsigned int layer=0)
Gets the mitk::LabelSet for the given layer.
Label * GetLabel(PixelType pixelValue)
void RemoveLabel(PixelType)
void MergeLabelProcessing(ImageType *input, PixelType pixelValue, PixelType index)
std::vector< LabelSet::Pointer > m_LabelSetContainer
Class for defining the data type of pixels.
Message AfterChangeLayerEvent
AfterchangeLayerEvent (e.g. used for GUI integration) As soon as active labelset was changed...
void EraseLabelProcessing(ImageType *input, PixelType index, unsigned int layer)