18 #ifndef itkLabelGeometryImageFilter_h
19 #define itkLabelGeometryImageFilter_h
27 #include "vnl/algo/vnl_symmetric_eigensystem.h"
28 #include "vnl/vnl_det.h"
80 template <
typename TLabelImage,
typename TIntensityImage = TLabelImage>
81 class ITK_TEMPLATE_EXPORT [[deprecated(
118 static constexpr
unsigned int ImageDimension = TLabelImage::ImageDimension;
169 const unsigned int imageDimension = Self::ImageDimension;
172 for (
unsigned int i = 0; i < imageDimension * 2; i += 2)
178 m_BoundingBoxVolume = 0;
179 m_BoundingBoxSize.Fill(0);
180 m_PixelIndices.clear();
182 m_WeightedCentroid.Fill(0);
183 m_ZeroOrderMoment = 0;
184 m_FirstOrderRawMoments.Fill(0);
185 m_FirstOrderWeightedRawMoments.Fill(0);
186 m_Eigenvalues.resize(ImageDimension);
187 m_Eigenvalues.clear();
188 m_Eigenvectors.set_size(ImageDimension, ImageDimension);
189 m_Eigenvectors.fill(0);
190 m_AxesLength.Fill(0);
196 unsigned int numberOfVertices = 1 << ImageDimension;
197 m_OrientedBoundingBoxVertices.resize(numberOfVertices, emptyPoint);
198 m_OrientedBoundingBoxVolume = 0;
199 m_OrientedBoundingBoxSize.Fill(0);
202 m_OrientedBoundingBoxOrigin.Fill(0);
203 m_RotationMatrix.set_size(ImageDimension, ImageDimension);
204 m_RotationMatrix.fill(0.0);
206 m_SecondOrderRawMoments.set_size(ImageDimension, ImageDimension);
207 m_SecondOrderCentralMoments.set_size(ImageDimension, ImageDimension);
208 for (
unsigned int i = 0; i < ImageDimension; ++i)
210 for (
unsigned int j = 0; j < ImageDimension; ++j)
212 m_SecondOrderRawMoments(i, j) = 0;
213 m_SecondOrderCentralMoments(i, j) = 0;
250 using MapType = std::map<LabelPixelType, LabelGeometry>;
251 using MapIterator =
typename std::map<LabelPixelType, LabelGeometry>::iterator;
255 itkGetMacro(CalculatePixelIndices,
bool);
256 itkBooleanMacro(CalculatePixelIndices);
266 if ((this->m_CalculateOrientedBoundingBox) || (this->m_CalculateOrientedLabelRegions) ||
267 (this->m_CalculateOrientedIntensityRegions))
274 if (this->m_CalculatePixelIndices != value)
276 this->m_CalculatePixelIndices = value;
281 itkGetMacro(CalculateOrientedBoundingBox,
bool);
282 itkBooleanMacro(CalculateOrientedBoundingBox);
285 if (this->m_CalculateOrientedBoundingBox != value)
287 this->m_CalculateOrientedBoundingBox = value;
295 this->SetCalculatePixelIndices(
true);
299 itkGetMacro(CalculateOrientedLabelRegions,
bool);
300 itkBooleanMacro(CalculateOrientedLabelRegions);
303 if (this->m_CalculateOrientedLabelRegions != value)
305 this->m_CalculateOrientedLabelRegions = value;
312 SetCalculateOrientedBoundingBox(
true);
317 itkGetMacro(CalculateOrientedIntensityRegions,
bool);
318 itkBooleanMacro(CalculateOrientedIntensityRegions);
321 if (this->m_CalculateOrientedIntensityRegions != value)
323 this->m_CalculateOrientedIntensityRegions = value;
330 this->SetCalculateOrientedBoundingBox(
true);
339 this->SetNthInput(1, const_cast<TIntensityImage *>(input));
358 std::vector<LabelPixelType>
GetLabels()
const {
return m_AllLabels; }
361 LabelIndicesType GetPixelIndices(LabelPixelType label)
const;
368 RealType GetIntegratedIntensity(LabelPixelType label)
const;
371 LabelPointType GetCentroid(LabelPixelType label)
const;
374 LabelPointType GetWeightedCentroid(LabelPixelType label)
const;
377 VectorType GetEigenvalues(LabelPixelType label)
const;
380 MatrixType GetEigenvectors(LabelPixelType label)
const;
383 AxesLengthType GetAxesLength(LabelPixelType label)
const;
387 RealType GetMinorAxisLength(LabelPixelType label)
const;
391 RealType GetMajorAxisLength(LabelPixelType label)
const;
394 RealType GetEccentricity(LabelPixelType label)
const;
398 RealType GetElongation(LabelPixelType label)
const;
401 RealType GetOrientation(LabelPixelType label)
const;
406 BoundingBoxType GetBoundingBox(LabelPixelType label)
const;
409 RealType GetBoundingBoxVolume(LabelPixelType label)
const;
412 LabelSizeType GetBoundingBoxSize(LabelPixelType label)
const;
420 BoundingBoxVerticesType GetOrientedBoundingBoxVertices(LabelPixelType label)
const;
423 RealType GetOrientedBoundingBoxVolume(LabelPixelType label)
const;
426 LabelPointType GetOrientedBoundingBoxSize(LabelPixelType label)
const;
429 LabelPointType GetOrientedBoundingBoxOrigin(LabelPixelType label)
const;
433 MatrixType GetRotationMatrix(LabelPixelType label)
const;
436 RegionType GetRegion(LabelPixelType label)
const;
439 TLabelImage * GetOrientedLabelImage(LabelPixelType label)
const;
443 TIntensityImage * GetOrientedIntensityImage(LabelPixelType label)
const;
445 #ifdef ITK_USE_CONCEPT_CHECKING
454 void PrintSelf(std::ostream & os,
Indent indent)
const override;
456 void GenerateData()
override;
459 bool CalculateOrientedBoundingBoxVertices(vnl_symmetric_eigensystem<double> eig, LabelGeometry & m_LabelGeometry);
461 bool m_CalculatePixelIndices{};
462 bool m_CalculateOrientedBoundingBox{};
463 bool m_CalculateOrientedLabelRegions{};
464 bool m_CalculateOrientedIntensityRegions{};
473 #ifndef ITK_MANUAL_INSTANTIATION
474 # include "itkLabelGeometryImageFilter.hxx"