18 #ifndef itkLabelGeometryImageFilter_h
19 #define itkLabelGeometryImageFilter_h
27 #include "vnl/algo/vnl_symmetric_eigensystem.h"
28 #include "vnl/vnl_det.h"
78 template <
typename TLabelImage,
typename TIntensityImage = TLabelImage>
114 static constexpr
unsigned int ImageDimension = TLabelImage::ImageDimension;
165 const unsigned int imageDimension = Self::ImageDimension;
168 for (
unsigned int i = 0; i < imageDimension * 2; i += 2)
174 m_BoundingBoxVolume = 0;
175 m_BoundingBoxSize.Fill(0);
176 m_PixelIndices.clear();
178 m_WeightedCentroid.Fill(0);
179 m_ZeroOrderMoment = 0;
180 m_FirstOrderRawMoments.Fill(0);
181 m_FirstOrderWeightedRawMoments.Fill(0);
182 m_Eigenvalues.resize(ImageDimension);
183 m_Eigenvalues.clear();
184 m_Eigenvectors.set_size(ImageDimension, ImageDimension);
185 m_Eigenvectors.fill(0);
186 m_AxesLength.Fill(0);
192 unsigned int numberOfVertices = 1 << ImageDimension;
193 m_OrientedBoundingBoxVertices.resize(numberOfVertices, emptyPoint);
194 m_OrientedBoundingBoxVolume = 0;
195 m_OrientedBoundingBoxSize.Fill(0);
198 m_OrientedBoundingBoxOrigin.Fill(0);
199 m_RotationMatrix.set_size(ImageDimension, ImageDimension);
200 m_RotationMatrix.fill(0.0);
202 m_SecondOrderRawMoments.set_size(ImageDimension, ImageDimension);
203 m_SecondOrderCentralMoments.set_size(ImageDimension, ImageDimension);
204 for (
unsigned int i = 0; i < ImageDimension; ++i)
206 for (
unsigned int j = 0; j < ImageDimension; ++j)
208 m_SecondOrderRawMoments(i, j) = 0;
209 m_SecondOrderCentralMoments(i, j) = 0;
246 using MapType = std::map<LabelPixelType, LabelGeometry>;
247 using MapIterator =
typename std::map<LabelPixelType, LabelGeometry>::iterator;
251 itkGetMacro(CalculatePixelIndices,
bool);
252 itkBooleanMacro(CalculatePixelIndices);
263 if ((this->m_CalculateOrientedBoundingBox) || (this->m_CalculateOrientedLabelRegions) ||
264 (this->m_CalculateOrientedIntensityRegions))
271 if (this->m_CalculatePixelIndices != value)
273 this->m_CalculatePixelIndices = value;
278 itkGetMacro(CalculateOrientedBoundingBox,
bool);
279 itkBooleanMacro(CalculateOrientedBoundingBox);
283 if (this->m_CalculateOrientedBoundingBox != value)
285 this->m_CalculateOrientedBoundingBox = value;
293 this->SetCalculatePixelIndices(
true);
297 itkGetMacro(CalculateOrientedLabelRegions,
bool);
298 itkBooleanMacro(CalculateOrientedLabelRegions);
302 if (this->m_CalculateOrientedLabelRegions != value)
304 this->m_CalculateOrientedLabelRegions = value;
311 SetCalculateOrientedBoundingBox(
true);
316 itkGetMacro(CalculateOrientedIntensityRegions,
bool);
317 itkBooleanMacro(CalculateOrientedIntensityRegions);
321 if (this->m_CalculateOrientedIntensityRegions != value)
323 this->m_CalculateOrientedIntensityRegions = value;
330 this->SetCalculateOrientedBoundingBox(
true);
340 this->SetNthInput(1, const_cast<TIntensityImage *>(input));
344 const TIntensityImage *
355 return m_LabelGeometryMapper.find(label) != m_LabelGeometryMapper.end();
362 return m_LabelGeometryMapper.size();
368 return this->GetNumberOfObjects();
372 std::vector<LabelPixelType>
380 GetPixelIndices(LabelPixelType label)
const;
385 GetVolume(LabelPixelType label)
const;
389 GetIntegratedIntensity(LabelPixelType label)
const;
393 GetCentroid(LabelPixelType label)
const;
397 GetWeightedCentroid(LabelPixelType label)
const;
401 GetEigenvalues(LabelPixelType label)
const;
405 GetEigenvectors(LabelPixelType label)
const;
409 GetAxesLength(LabelPixelType label)
const;
414 GetMinorAxisLength(LabelPixelType label)
const;
419 GetMajorAxisLength(LabelPixelType label)
const;
423 GetEccentricity(LabelPixelType label)
const;
428 GetElongation(LabelPixelType label)
const;
432 GetOrientation(LabelPixelType label)
const;
438 GetBoundingBox(LabelPixelType label)
const;
442 GetBoundingBoxVolume(LabelPixelType label)
const;
446 GetBoundingBoxSize(LabelPixelType label)
const;
454 BoundingBoxVerticesType
455 GetOrientedBoundingBoxVertices(LabelPixelType label)
const;
459 GetOrientedBoundingBoxVolume(LabelPixelType label)
const;
463 GetOrientedBoundingBoxSize(LabelPixelType label)
const;
467 GetOrientedBoundingBoxOrigin(LabelPixelType label)
const;
472 GetRotationMatrix(LabelPixelType label)
const;
476 GetRegion(LabelPixelType label)
const;
480 GetOrientedLabelImage(LabelPixelType label)
const;
485 GetOrientedIntensityImage(LabelPixelType label)
const;
487 #ifdef ITK_USE_CONCEPT_CHECKING
497 PrintSelf(std::ostream & os,
Indent indent)
const override;
500 GenerateData()
override;
504 CalculateOrientedBoundingBoxVertices(vnl_symmetric_eigensystem<double> eig, LabelGeometry & m_LabelGeometry);
506 bool m_CalculatePixelIndices{};
507 bool m_CalculateOrientedBoundingBox{};
508 bool m_CalculateOrientedLabelRegions{};
509 bool m_CalculateOrientedIntensityRegions{};
518 #ifndef ITK_MANUAL_INSTANTIATION
519 # include "itkLabelGeometryImageFilter.hxx"