Medical Imaging Interaction Toolkit  2024.06.00
Medical Imaging Interaction Toolkit
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
mitkLabelSetImage.h
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 
13 #ifndef mitkLabelSetImage_h
14 #define mitkLabelSetImage_h
15 
16 #include <shared_mutex>
17 #include <mitkImage.h>
18 #include <mitkLabel.h>
19 #include <mitkLookupTable.h>
20 #include <mitkMultiLabelEvents.h>
21 #include <mitkMessage.h>
23 
24 #include <MitkMultilabelExports.h>
25 
26 namespace mitk
27 {
44  {
45  public:
52 
59 
62  // FUTURE MultiLabelSegmentation:
63  // Section that already contains declarations used in the new class.
64  // So this part of the interface will stay after refactoring towards
65  // the new MultiLabelSegmentation class (see T28524). This section was introduced
66  // because some of the planned features are already urgently needed.
70  itkNewMacro(Self);
71 
73 
74  using GroupIndexType = std::size_t;
78  using LabelValueVectorType = std::vector<LabelValueType>;
79 
81 
98  mitk::Label* AddLabel(Label* label, GroupIndexType groupID, bool addAsClone = true, bool correctLabelValue = true);
99 
120  mitk::Label* AddLabelWithContent(Label* label, const Image* labelContent, GroupIndexType groupID, LabelValueType contentLabelValue, bool addAsClone = true, bool correctLabelValue = true);
121 
129  mitk::Label* AddLabel(const std::string& name, const Color& color, GroupIndexType groupID);
130 
137  void RenameLabel(LabelValueType labelValue, const std::string& name, const Color& color);
138 
146  void RemoveLabel(LabelValueType labelValue);
147 
155  void RemoveLabels(const LabelValueVectorType& vectorOfLabelPixelValues);
156 
164  void EraseLabel(LabelValueType labelValue);
165 
172  void EraseLabels(const LabelValueVectorType& labelValues);
173 
182  void RemoveGroup(GroupIndexType group);
183 
185  bool ExistLabel(LabelValueType value) const;
186 
193  bool ExistLabel(LabelValueType value, GroupIndexType groupIndex) const;
194 
200  bool ExistGroup(GroupIndexType index) const;
201 
205  GroupIndexType GetGroupIndexOfLabel(LabelValueType value) const;
206 
217  mitk::Label::ConstPointer GetLabel(LabelValueType value) const;
218  mitk::Label::Pointer GetLabel(LabelValueType value);
219 
222  const ConstLabelVectorType GetLabels() const;
223  const LabelVectorType GetLabels();
224 
227  const LabelValueVectorType GetAllLabelValues() const;
228 
235  const LabelVectorType GetLabelsByValue(const LabelValueVectorType& labelValues, bool ignoreMissing = true);
236 
241  const ConstLabelVectorType GetConstLabelsByValue(const LabelValueVectorType& labelValues, bool ignoreMissing = false) const;
242 
244  static LabelValueVectorType ExtractLabelValuesFromLabelVector(const ConstLabelVectorType& labels);
246  static LabelValueVectorType ExtractLabelValuesFromLabelVector(const LabelVectorType& labels);
247 
249  static ConstLabelVectorType ConvertLabelVectorConst(const LabelVectorType& labels);
250 
258  const LabelValueVectorType GetLabelValuesByGroup(GroupIndexType index) const;
259 
268  const LabelValueVectorType GetLabelValuesByName(GroupIndexType index, const std::string_view name) const;
269 
273  std::vector<std::string> GetLabelClassNames() const;
274 
279  std::vector<std::string> GetLabelClassNamesByGroup(GroupIndexType index) const;
280 
285  LabelValueType GetUnusedLabelValue() const;
286 
287  itkGetConstMacro(UnlabeledLabelLock, bool);
288  itkSetMacro(UnlabeledLabelLock, bool);
289  itkBooleanMacro(UnlabeledLabelLock);
290 
293  void SetAllLabelsVisible(bool visible);
294 
298  void SetAllLabelsVisibleByGroup(GroupIndexType group, bool visible);
299 
304  void SetAllLabelsVisibleByName(GroupIndexType group, const std::string_view name, bool visible);
305 
308  bool IsLabelLocked(LabelValueType value) const;
309 
312  void SetAllLabelsLocked(bool locked);
313 
317  void SetAllLabelsLockedByGroup(GroupIndexType group, bool locked);
318 
323  void SetAllLabelsLockedByName(GroupIndexType group, const std::string_view name, bool locked);
324 
336  void ReplaceGroupLabels(const GroupIndexType groupID, const ConstLabelVectorType& newLabels);
337 
338  void ReplaceGroupLabels(const GroupIndexType groupID, const LabelVectorType& newLabels);
339 
342  mitk::Image* GetGroupImage(GroupIndexType groupID);
343 
346  const mitk::Image* GetGroupImage(GroupIndexType groupID) const;
347 
352  const std::string& GetGroupName(GroupIndexType groupID) const;
353 
356  void SetGroupName(GroupIndexType groupID, const std::string& name);
357 
358  itkGetModifiableObjectMacro(LookupTable, mitk::LookupTable);
359  void SetLookupTable(LookupTable* lut);
363  void UpdateLookupTable(PixelType pixelValue);
364 
365  protected:
366 
367  void OnLabelModified(const Object* sender, const itk::EventObject&);
368 
370  void AddLabelToMap(LabelValueType labelValue, Label* label, GroupIndexType groupID);
371  void RemoveLabelFromMap(LabelValueType labelValue);
373  void RegisterLabel(Label* label);
375  void ReleaseLabel(Label* label);
376 
379  void ApplyToLabels(const LabelValueVectorType& values, std::function<void(Label*)>&& lambda);
383  void VisitLabels(const LabelValueVectorType& values, std::function<void(const Label*)>&& lambda) const;
384 
386 
387  private:
388  using LabelMapType = std::map<LabelValueType, Label::Pointer>;
390  LabelMapType m_LabelMap;
391 
392  using GroupNameVectorType = std::vector<std::string>;
394  GroupNameVectorType m_Groups;
395 
398  using GroupToLabelMapType = std::vector<LabelValueVectorType>;
399  /* Dictionary that maps between group id (key) and label values in the group (vector of label value).*/
400  GroupToLabelMapType m_GroupToLabelMap;
401  using LabelToGroupMapType = std::map<LabelValueType, GroupIndexType>;
402  /* Dictionary that maps between label value (key) and group id (value)*/
403  LabelToGroupMapType m_LabelToGroupMap;
404 
405  using LabelEventGuardMapType = std::map<LabelValueType, ITKEventObserverGuard>;
406  LabelEventGuardMapType m_LabelModEventGuardMap;
407 
408  LookupTable::Pointer m_LookupTable;
409 
411  bool m_UnlabeledLabelLock;
412 
414  std::shared_mutex m_LabelNGroupMapsMutex;
415 
416  public:
417 
418 
421  // END FUTURE MultiLabelSegmentation
424 
429  const mitk::Image* GetGroupImageWorkaround(GroupIndexType groupID) const;
430 
433  void UpdateCenterOfMass(PixelType pixelValue);
434 
441  void Initialize(const mitk::Image *image) override;
442 
445  void ClearBuffer();
446 
453  void MergeLabel(PixelType pixelValue, PixelType sourcePixelValue);
454 
461  void MergeLabels(PixelType pixelValue, const std::vector<PixelType>& vectorOfSourcePixelValues);
462 
468  unsigned int GetActiveLayer() const;
469 
470  Label* GetActiveLabel();
471 
472  const Label* GetActiveLabel() const;
473 
479  unsigned int GetNumberOfLabels(unsigned int layer) const;
480 
485  unsigned int GetTotalNumberOfLabels() const;
486 
493  void InitializeByLabeledImage(mitk::Image::Pointer image);
494 
495  void MaskStamp(mitk::Image *mask, bool forceOverwrite);
496 
497  void SetActiveLayer(unsigned int layer);
498  void SetActiveLabel(LabelValueType label);
499 
500  unsigned int GetNumberOfLayers() const;
501 
507  GroupIndexType AddLayer(ConstLabelVector labels = {});
508 
518  GroupIndexType AddLayer(mitk::Image* layerImage, ConstLabelVector labels = {});
519 
520  protected:
521  mitkCloneMacro(Self);
522 
523  LabelSetImage();
524  LabelSetImage(const LabelSetImage &other);
525  ~LabelSetImage() override;
526 
527  template <typename TPixel, unsigned int VImageDimension>
528  void LayerContainerToImageProcessing(itk::Image<TPixel, VImageDimension> *source, unsigned int layer);
529 
530  template <typename TPixel, unsigned int VImageDimension>
531  void ImageToLayerContainerProcessing(const itk::Image<TPixel, VImageDimension> *source, unsigned int layer) const;
532 
533  template <typename ImageType>
534  void CalculateCenterOfMassProcessing(ImageType *input, LabelValueType index);
535 
536  template <typename ImageType>
537  void EraseLabelProcessing(ImageType *input, PixelType index);
538 
539  template <typename ImageType>
540  void MergeLabelProcessing(ImageType *input, PixelType pixelValue, PixelType index);
541 
542  template <typename ImageType>
543  void MaskStampProcessing(ImageType *input, mitk::Image *mask, bool forceOverwrite);
544 
545  template <typename LabelSetImageType, typename ImageType>
546  void InitializeByLabeledImageProcessing(LabelSetImageType *input, ImageType *other);
547 
550  LabelValueVectorType GetUsedLabelValues() const;
551 
552  std::vector<Image::Pointer> m_LayerContainer;
553 
556  };
557 
575  MITKMULTILABEL_EXPORT bool Equal(const mitk::LabelSetImage &leftHandSide,
576  const mitk::LabelSetImage &rightHandSide,
577  ScalarType eps,
578  bool verbose);
579 
595  const mitk::LabelSetImage::ConstLabelVectorType& rightHandSide,
596  ScalarType eps,
597  bool verbose);
598 
599 
603  namespace MultiLabelSegmentation
604  {
605  enum class MergeStyle
606  {
607  Replace, //The old label content of a label value will be replaced by its new label content.
608  //Therefore pixels that are labeled might become unlabeled again.
609  //(This means that a lock of the value is also ignored).
610  Merge //The union of old and new label content will be generated.
611  };
612 
613  enum class OverwriteStyle
614  {
615  RegardLocks, //Locked labels in the same spatial group will not be overwritten/changed.
616  IgnoreLocks //Label locks in the same spatial group will be ignored, so these labels might be changed.
617  };
618  }
619 
620  using LabelValueMappingVector = std::vector < std::pair<Label::PixelType, Label::PixelType> >;
621 
647  MITKMULTILABEL_EXPORT void TransferLabelContentAtTimeStep(const LabelSetImage* sourceImage, LabelSetImage* destinationImage,
648  const TimeStepType timeStep, LabelValueMappingVector labelMapping = { {1,1} },
651 
656  MITKMULTILABEL_EXPORT void TransferLabelContent(const LabelSetImage* sourceImage, LabelSetImage* destinationImage, LabelValueMappingVector labelMapping = { {1,1} },
659 
660 
689  MITKMULTILABEL_EXPORT void TransferLabelContentAtTimeStep(const Image* sourceImage, Image* destinationImage, const mitk::ConstLabelVector& destinationLabelVector,
690  const TimeStepType timeStep, mitk::Label::PixelType sourceBackground = LabelSetImage::UNLABELED_VALUE,
692  bool destinationBackgroundLocked = false,
693  LabelValueMappingVector labelMapping = { {1,1} },
696 
701  MITKMULTILABEL_EXPORT void TransferLabelContent(const Image* sourceImage, Image* destinationImage, const mitk::ConstLabelVector& destinationLabelVector,
704  bool destinationBackgroundLocked = false,
705  LabelValueMappingVector labelMapping = { {1,1} },
708 
709 } // namespace mitk
710 
711 #endif
mitk::eps
const MITKCORE_EXPORT ScalarType eps
mitk::MultiLabelSegmentation::OverwriteStyle::IgnoreLocks
@ IgnoreLocks
MITKMULTILABEL_EXPORT
#define MITKMULTILABEL_EXPORT
Definition: MitkMultilabelExports.h:15
mitk::LabelSetImage::BeforeChangeLayerEvent
Message BeforeChangeLayerEvent
BeforeChangeLayerEvent (e.g. used for GUI integration) As soon as active labelset should be changed,...
Definition: mitkLabelSetImage.h:51
mitk::ConstLabelVector
std::vector< Label::ConstPointer > ConstLabelVector
Definition: mitkLabel.h:92
mitkLabel.h
mitkImage.h
mitk::MultiLabelSegmentation::OverwriteStyle::RegardLocks
@ RegardLocks
mitk::TransferLabelContentAtTimeStep
MITKMULTILABEL_EXPORT void TransferLabelContentAtTimeStep(const LabelSetImage *sourceImage, LabelSetImage *destinationImage, const TimeStepType timeStep, LabelValueMappingVector labelMapping={ {1, 1} }, MultiLabelSegmentation::MergeStyle mergeStyle=MultiLabelSegmentation::MergeStyle::Replace, MultiLabelSegmentation::OverwriteStyle overwriteStlye=MultiLabelSegmentation::OverwriteStyle::RegardLocks)
mitk::LabelSetImage::LabelVectorType
LabelVector LabelVectorType
Definition: mitkLabelSetImage.h:77
mitk::Color
itk::RGBPixel< float > Color
Color Standard RGB color typedef (float)
Definition: mitkColorProperty.h:38
mitk::Image
Image class for storing images.
Definition: mitkImage.h:69
mitk::Equal
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.
mitk::LabelSetImage::m_activeLayerInvalid
bool m_activeLayerInvalid
Definition: mitkLabelSetImage.h:555
itk::SmartPointer< const Self >
mitk::LookupTable
The LookupTable class mitk wrapper for a vtkLookupTable.
Definition: mitkLookupTable.h:42
mitk::LabelSetImage::AfterChangeLayerEvent
Message AfterChangeLayerEvent
AfterchangeLayerEvent (e.g. used for GUI integration) As soon as active labelset was changed,...
Definition: mitkLabelSetImage.h:58
mitk::Label::PixelType
unsigned short PixelType
Definition: mitkLabel.h:34
mitk
Find image slices visible on a given plane.
Definition: RenderingTests.dox:1
mitkLookupTable.h
mitk::Label
A data structure describing a label.
Definition: mitkLabel.h:29
mitk::MultiLabelSegmentation::MergeStyle::Replace
@ Replace
mitkMessage.h
mitk::MultiLabelSegmentation::MergeStyle
MergeStyle
Definition: mitkLabelSetImage.h:605
mitk::LabelSetImage::m_ActiveLayer
int m_ActiveLayer
Definition: mitkLabelSetImage.h:554
mitk::LabelSetImage::m_LayerContainer
std::vector< Image::Pointer > m_LayerContainer
Definition: mitkLabelSetImage.h:552
mitk::LabelSetImage::UNLABELED_VALUE
const static LabelValueType UNLABELED_VALUE
Definition: mitkLabelSetImage.h:80
mitk::BaseData
Base of all data objects.
Definition: mitkBaseData.h:42
mitk::LabelVector
std::vector< Label::Pointer > LabelVector
Definition: mitkLabel.h:91
mitk::MultiLabelSegmentation::OverwriteStyle
OverwriteStyle
Definition: mitkLabelSetImage.h:613
mitk::MultiLabelSegmentation::MergeStyle::Merge
@ Merge
mitk::TransferLabelContent
MITKMULTILABEL_EXPORT void TransferLabelContent(const LabelSetImage *sourceImage, LabelSetImage *destinationImage, LabelValueMappingVector labelMapping={ {1, 1} }, MultiLabelSegmentation::MergeStyle mergeStyle=MultiLabelSegmentation::MergeStyle::Replace, MultiLabelSegmentation::OverwriteStyle overwriteStlye=MultiLabelSegmentation::OverwriteStyle::RegardLocks)
mitk::TimeStepType
std::size_t TimeStepType
Definition: mitkTimeGeometry.h:27
mitkCloneMacro
#define mitkCloneMacro(classname)
Definition: mitkCommon.h:154
mitkClassMacro
#define mitkClassMacro(className, SuperClassName)
Definition: mitkCommon.h:36
itk::Image
class ITK_EXPORT Image
Definition: mitkGeometryClipImageFilter.h:25
mitk::Image::Initialize
void Initialize() override
mitk::LabelSetImage::m_ActiveLabelValue
LabelValueType m_ActiveLabelValue
Definition: mitkLabelSetImage.h:385
mitkMultiLabelEvents.h
mitk::LabelValueMappingVector
std::vector< std::pair< Label::PixelType, Label::PixelType > > LabelValueMappingVector
Definition: mitkLabelSetImage.h:620
mitk::LabelSetImage::PixelType
mitk::Label::PixelType PixelType
Definition: mitkLabelSetImage.h:70
mitkITKEventObserverGuard.h
mitk::LabelSetImage::GroupIndexType
std::size_t GroupIndexType
Definition: mitkLabelSetImage.h:74
mitk::LabelSetImage::LabelValueVectorType
std::vector< LabelValueType > LabelValueVectorType
Definition: mitkLabelSetImage.h:78
mitk::Message
Event/message/notification class.
Definition: mitkMessage.h:452
mitk::LabelSetImage
LabelSetImage class for handling labels and layers in a segmentation session.
Definition: mitkLabelSetImage.h:43
mitk::LabelSetImage::ConstLabelVectorType
ConstLabelVector ConstLabelVectorType
Definition: mitkLabelSetImage.h:76
mitk::ScalarType
double ScalarType
Definition: mitkNumericConstants.h:20
mitk::LabelSetImage::LabelValueType
mitk::Label::PixelType LabelValueType
Definition: mitkLabelSetImage.h:75
MitkMultilabelExports.h