18 #ifndef itkLabelGeometryImageFilter_h
19 #define itkLabelGeometryImageFilter_h
27 #include "vnl/algo/vnl_symmetric_eigensystem.h"
28 #include "vnl/vnl_det.h"
76 template <
typename TLabelImage,
typename TIntensityImage = TLabelImage>
112 static constexpr
unsigned int ImageDimension = TLabelImage::ImageDimension;
163 const unsigned int imageDimension = Self::ImageDimension;
166 for (
unsigned int i = 0; i < imageDimension * 2; i += 2)
172 m_BoundingBoxVolume = 0;
173 m_BoundingBoxSize.Fill(0);
174 m_PixelIndices.clear();
176 m_WeightedCentroid.Fill(0);
177 m_ZeroOrderMoment = 0;
178 m_FirstOrderRawMoments.Fill(0);
179 m_FirstOrderWeightedRawMoments.Fill(0);
180 m_Eigenvalues.resize(ImageDimension);
181 m_Eigenvalues.clear();
182 m_Eigenvectors.set_size(ImageDimension, ImageDimension);
183 m_Eigenvectors.fill(0);
184 m_AxesLength.Fill(0);
190 unsigned int numberOfVertices = 1 << ImageDimension;
191 m_OrientedBoundingBoxVertices.resize(numberOfVertices, emptyPoint);
192 m_OrientedBoundingBoxVolume = 0;
193 m_OrientedBoundingBoxSize.Fill(0);
194 m_OrientedLabelImage = LabelImageType::New();
195 m_OrientedIntensityImage = IntensityImageType::New();
196 m_OrientedBoundingBoxOrigin.Fill(0);
197 m_RotationMatrix.set_size(ImageDimension, ImageDimension);
198 m_RotationMatrix.fill(0.0);
200 m_SecondOrderRawMoments.set_size(ImageDimension, ImageDimension);
201 m_SecondOrderCentralMoments.set_size(ImageDimension, ImageDimension);
202 for (
unsigned int i = 0; i < ImageDimension; i++)
204 for (
unsigned int j = 0; j < ImageDimension; j++)
206 m_SecondOrderRawMoments(i, j) = 0;
207 m_SecondOrderCentralMoments(i, j) = 0;
244 using MapType = std::map<LabelPixelType, LabelGeometry>;
245 using MapIterator =
typename std::map<LabelPixelType, LabelGeometry>::iterator;
249 itkGetMacro(CalculatePixelIndices,
bool);
250 itkBooleanMacro(CalculatePixelIndices);
261 if ((this->m_CalculateOrientedBoundingBox ==
true) || (this->m_CalculateOrientedLabelRegions ==
true) ||
262 (this->m_CalculateOrientedIntensityRegions ==
true))
269 if (this->m_CalculatePixelIndices != value)
271 this->m_CalculatePixelIndices = value;
276 itkGetMacro(CalculateOrientedBoundingBox,
bool);
277 itkBooleanMacro(CalculateOrientedBoundingBox);
281 if (this->m_CalculateOrientedBoundingBox != value)
283 this->m_CalculateOrientedBoundingBox = value;
291 this->SetCalculatePixelIndices(
true);
295 itkGetMacro(CalculateOrientedLabelRegions,
bool);
296 itkBooleanMacro(CalculateOrientedLabelRegions);
300 if (this->m_CalculateOrientedLabelRegions != value)
302 this->m_CalculateOrientedLabelRegions = value;
309 SetCalculateOrientedBoundingBox(
true);
314 itkGetMacro(CalculateOrientedIntensityRegions,
bool);
315 itkBooleanMacro(CalculateOrientedIntensityRegions);
319 if (this->m_CalculateOrientedIntensityRegions != value)
321 this->m_CalculateOrientedIntensityRegions = value;
328 this->SetCalculateOrientedBoundingBox(
true);
338 this->SetNthInput(1, const_cast<TIntensityImage *>(input));
342 const TIntensityImage *
353 return m_LabelGeometryMapper.find(label) != m_LabelGeometryMapper.end();
360 return m_LabelGeometryMapper.size();
366 return this->GetNumberOfObjects();
370 std::vector<LabelPixelType>
378 GetPixelIndices(LabelPixelType label)
const;
383 GetVolume(LabelPixelType label)
const;
390 GetIntegratedIntensity(LabelPixelType label)
const;
394 GetCentroid(LabelPixelType label)
const;
398 GetWeightedCentroid(LabelPixelType label)
const;
402 GetEigenvalues(LabelPixelType label)
const;
406 GetEigenvectors(LabelPixelType label)
const;
410 GetAxesLength(LabelPixelType label)
const;
415 GetMinorAxisLength(LabelPixelType label)
const;
420 GetMajorAxisLength(LabelPixelType label)
const;
424 GetEccentricity(LabelPixelType label)
const;
429 GetElongation(LabelPixelType label)
const;
433 GetOrientation(LabelPixelType label)
const;
439 GetBoundingBox(LabelPixelType label)
const;
443 GetBoundingBoxVolume(LabelPixelType label)
const;
447 GetBoundingBoxSize(LabelPixelType label)
const;
455 BoundingBoxVerticesType
456 GetOrientedBoundingBoxVertices(LabelPixelType label)
const;
460 GetOrientedBoundingBoxVolume(LabelPixelType label)
const;
464 GetOrientedBoundingBoxSize(LabelPixelType label)
const;
468 GetOrientedBoundingBoxOrigin(LabelPixelType label)
const;
473 GetRotationMatrix(LabelPixelType label)
const;
477 GetRegion(LabelPixelType label)
const;
481 GetOrientedLabelImage(LabelPixelType label)
const;
486 GetOrientedIntensityImage(LabelPixelType label)
const;
488 #ifdef ITK_USE_CONCEPT_CHECKING
498 PrintSelf(std::ostream & os,
Indent indent)
const override;
501 GenerateData()
override;
505 CalculateOrientedBoundingBoxVertices(vnl_symmetric_eigensystem<double> eig, LabelGeometry & m_LabelGeometry);
519 #ifndef ITK_MANUAL_INSTANTIATION
520 # include "itkLabelGeometryImageFilter.hxx"