ITK  5.4.0
Insight Toolkit
itkMatrixOffsetTransformBase.h
Go to the documentation of this file.
1 /*=========================================================================
2  *
3  * Copyright NumFOCUS
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * https://www.apache.org/licenses/LICENSE-2.0.txt
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *=========================================================================*/
18 #ifndef itkMatrixOffsetTransformBase_h
19 #define itkMatrixOffsetTransformBase_h
20 
21 
22 #include "itkMacro.h"
23 #include "itkMatrix.h"
24 #include "itkTransform.h"
25 
26 #include <iostream>
27 
28 namespace itk
29 {
30 
31 /* MatrixOrthogonalityTolerance is a utility to
32  * allow setting the tolerance limits used for
33  * checking if a matrix meet the orthogonality
34  * constraints of being a rigid rotation matrix.
35  * The tolerance needs to be different for
36  * matrices of type float vs. double.
37  */
38 template <typename T>
40 
41 template <>
42 class ITK_TEMPLATE_EXPORT MatrixOrthogonalityTolerance<double>
43 {
44 public:
45  static double
47  {
48  return 1e-10;
49  }
50 };
51 
52 template <>
53 class ITK_TEMPLATE_EXPORT MatrixOrthogonalityTolerance<float>
54 {
55 public:
56  static float
58  {
59  return 1e-5f;
60  }
61 };
62 
105 template <typename TParametersValueType = double, unsigned int VInputDimension = 3, unsigned int VOutputDimension = 3>
106 class ITK_TEMPLATE_EXPORT MatrixOffsetTransformBase
107  : public Transform<TParametersValueType, VInputDimension, VOutputDimension>
108 {
109 public:
110  ITK_DISALLOW_COPY_AND_MOVE(MatrixOffsetTransformBase);
111 
115 
118 
120  itkOverrideGetNameOfClassMacro(MatrixOffsetTransformBase);
121 
123  itkNewMacro(Self);
124 
126  static constexpr unsigned int InputSpaceDimension = VInputDimension;
127  static constexpr unsigned int OutputSpaceDimension = VOutputDimension;
128  static constexpr unsigned int ParametersDimension = VOutputDimension * (VInputDimension + 1);
129 
131  using typename Superclass::FixedParametersType;
132  using typename Superclass::FixedParametersValueType;
133  using typename Superclass::ParametersType;
134  using typename Superclass::ParametersValueType;
135 
137  using typename Superclass::JacobianType;
138  using typename Superclass::JacobianPositionType;
139  using typename Superclass::InverseJacobianPositionType;
140 
142  using typename Superclass::TransformCategoryEnum;
143 
145  using typename Superclass::ScalarType;
146 
151 
155 
156  using typename Superclass::InputVectorPixelType;
157  using typename Superclass::OutputVectorPixelType;
158 
160  using typename Superclass::InputDiffusionTensor3DType;
161  using typename Superclass::OutputDiffusionTensor3DType;
162 
164  using typename Superclass::InputSymmetricSecondRankTensorType;
165  using typename Superclass::OutputSymmetricSecondRankTensorType;
166 
168 
170  using InputVnlVectorType = vnl_vector_fixed<TParametersValueType, Self::InputSpaceDimension>;
171  using OutputVnlVectorType = vnl_vector_fixed<TParametersValueType, Self::OutputSpaceDimension>;
172 
178 
182 
185 
187 
190 
192 
194 
197  using InverseTransformBaseType = typename Superclass::InverseTransformBaseType;
199 
203  friend class MatrixOffsetTransformBase<TParametersValueType, VOutputDimension, VInputDimension>;
204 
208  virtual void
209  SetIdentity();
210 
215  GetTransformCategory() const override
216  {
217  return Self::TransformCategoryEnum::Linear;
218  }
219 
231  virtual void
232  SetMatrix(const MatrixType & matrix)
233  {
234  m_Matrix = matrix;
235  this->ComputeOffset();
236  this->ComputeMatrixParameters();
237  m_MatrixMTime.Modified();
238  this->Modified();
239  return;
240  }
250  virtual const MatrixType &
251  GetMatrix() const
252  {
253  return m_Matrix;
254  }
255 
264  void
265  SetOffset(const OutputVectorType & offset)
266  {
267  m_Offset = offset;
268  this->ComputeTranslation();
269  this->Modified();
270  return;
271  }
279  const OutputVectorType &
280  GetOffset() const
281  {
282  return m_Offset;
283  }
284 
307  void
308  SetCenter(const InputPointType & center)
309  {
310  m_Center = center;
311  this->ComputeOffset();
312  this->Modified();
313  return;
314  }
323  const InputPointType &
324  GetCenter() const
325  {
326  return m_Center;
327  }
328 
335  void
336  SetTranslation(const OutputVectorType & translation)
337  {
338  m_Translation = translation;
339  this->ComputeOffset();
340  this->Modified();
341  return;
342  }
351  const OutputVectorType &
353  {
354  return m_Translation;
355  }
356 
361  void
362  SetParameters(const ParametersType & parameters) override;
363 
365  const ParametersType &
366  GetParameters() const override;
367 
369  void
370  SetFixedParameters(const FixedParametersType &) override;
371 
373  const FixedParametersType &
374  GetFixedParameters() const override;
375 
387  void
388  Compose(const Self * other, bool pre = false);
389 
398  OutputPointType
399  TransformPoint(const InputPointType & point) const override;
400 
401  using Superclass::TransformVector;
402 
403  OutputVectorType
404  TransformVector(const InputVectorType & vect) const override;
405 
406  OutputVnlVectorType
407  TransformVector(const InputVnlVectorType & vect) const override;
408 
409  OutputVectorPixelType
410  TransformVector(const InputVectorPixelType & vect) const override;
411 
412  using Superclass::TransformCovariantVector;
413 
414  OutputCovariantVectorType
415  TransformCovariantVector(const InputCovariantVectorType & vec) const override;
416 
417  OutputVectorPixelType
418  TransformCovariantVector(const InputVectorPixelType & vect) const override;
419 
420  using Superclass::TransformDiffusionTensor3D;
421 
422  OutputDiffusionTensor3DType
423  TransformDiffusionTensor3D(const InputDiffusionTensor3DType & tensor) const override;
424 
425  OutputVectorPixelType
426  TransformDiffusionTensor3D(const InputVectorPixelType & tensor) const override;
427 
428  using Superclass::TransformSymmetricSecondRankTensor;
429  OutputSymmetricSecondRankTensorType
430  TransformSymmetricSecondRankTensor(const InputSymmetricSecondRankTensorType & inputTensor) const override;
431 
432  OutputVectorPixelType
433  TransformSymmetricSecondRankTensor(const InputVectorPixelType & inputTensor) const override;
434 
435 
445  void
446  ComputeJacobianWithRespectToParameters(const InputPointType & p, JacobianType & jacobian) const override;
447 
448 
452  void
453  ComputeJacobianWithRespectToPosition(const InputPointType & x, JacobianPositionType & jac) const override;
454  using Superclass::ComputeJacobianWithRespectToPosition;
455 
459  void
460  ComputeInverseJacobianWithRespectToPosition(const InputPointType & x,
461  InverseJacobianPositionType & jac) const override;
462  using Superclass::ComputeInverseJacobianWithRespectToPosition;
463 
482  bool
483  GetInverse(InverseTransformType * inverse) const;
487  InverseTransformBasePointer
488  GetInverseTransform() const override;
489 
495  bool
496  IsLinear() const override
497  {
498  return true;
499  }
500 
501 protected:
504  const InverseMatrixType &
505  GetInverseMatrix() const;
506 
507 protected:
515  MatrixOffsetTransformBase(const MatrixType & matrix, const OutputVectorType & offset);
516  explicit MatrixOffsetTransformBase(unsigned int paramDims = ParametersDimension);
520  ~MatrixOffsetTransformBase() override = default;
521 
523  void
524  PrintSelf(std::ostream & os, Indent indent) const override;
525 
526  const InverseMatrixType &
528  {
529  return m_InverseMatrix;
530  }
531  void
533  {
534  m_InverseMatrix = matrix;
535  m_InverseMatrixMTime.Modified();
536  }
537  bool
539  {
540  if (m_MatrixMTime != m_InverseMatrixMTime)
541  {
542  return true;
543  }
544  else
545  {
546  return false;
547  }
548  }
549 
550  virtual void
551  ComputeMatrixParameters();
552 
553  virtual void
554  ComputeMatrix();
555 
556  void
557  SetVarMatrix(const MatrixType & matrix)
558  {
559  m_Matrix = matrix;
560  m_MatrixMTime.Modified();
561  }
562 
563  virtual void
564  ComputeTranslation();
565 
566  void
567  SetVarTranslation(const OutputVectorType & translation)
568  {
569  m_Translation = translation;
570  }
571 
572  virtual void
573  ComputeOffset();
574 
575  void
577  {
578  m_Offset = offset;
579  }
580 
581  void
582  SetVarCenter(const InputPointType & center)
583  {
584  m_Center = center;
585  }
586 
587  itkGetConstMacro(Singular, bool);
588 
589 private:
590  MatrixType m_Matrix{ MatrixType::GetIdentity() }; // Matrix of the transformation
591  OutputVectorType m_Offset{}; // Offset of the transformation
592  mutable InverseMatrixType m_InverseMatrix{ InverseMatrixType::GetIdentity() }; // Inverse of the matrix
593  mutable bool m_Singular{ false }; // Is m_Inverse singular?
594 
595  InputPointType m_Center{};
596  OutputVectorType m_Translation{};
597 
599  TimeStamp m_MatrixMTime{};
600  mutable TimeStamp m_InverseMatrixMTime{};
601 }; // class MatrixOffsetTransformBase
602 } // namespace itk
603 
604 #ifndef ITK_MANUAL_INSTANTIATION
605 # include "itkMatrixOffsetTransformBase.hxx"
606 #endif
607 
608 #endif /* itkMatrixOffsetTransformBase_h */
Pointer
SmartPointer< Self > Pointer
Definition: itkAddImageFilter.h:93
itk::MatrixOffsetTransformBase::GetMatrix
virtual const MatrixType & GetMatrix() const
Definition: itkMatrixOffsetTransformBase.h:251
itk::MatrixOffsetTransformBase::SetVarTranslation
void SetVarTranslation(const OutputVectorType &translation)
Definition: itkMatrixOffsetTransformBase.h:567
itk::MatrixOffsetTransformBase::GetTransformCategory
TransformCategoryEnum GetTransformCategory() const override
Definition: itkMatrixOffsetTransformBase.h:215
itk::MatrixOffsetTransformBase::SetVarCenter
void SetVarCenter(const InputPointType &center)
Definition: itkMatrixOffsetTransformBase.h:582
itk::MatrixOffsetTransformBase::InverseMatrixIsOld
bool InverseMatrixIsOld() const
Definition: itkMatrixOffsetTransformBase.h:538
itk::MatrixOffsetTransformBase::IsLinear
bool IsLinear() const override
Definition: itkMatrixOffsetTransformBase.h:496
itkMatrix.h
itk::Transform::OutputVnlVectorType
vnl_vector_fixed< TParametersValueType, VOutputDimension > OutputVnlVectorType
Definition: itkTransform.h:171
itk::Transform::InverseTransformBasePointer
typename InverseTransformBaseType::Pointer InverseTransformBasePointer
Definition: itkTransform.h:181
itk::MatrixOffsetTransformBase::SetCenter
void SetCenter(const InputPointType &center)
Definition: itkMatrixOffsetTransformBase.h:308
itk::MatrixOffsetTransformBase< TParametersValueType, VDimension, VDimension >::OutputPointValueType
typename OutputPointType::ValueType OutputPointValueType
Definition: itkMatrixOffsetTransformBase.h:177
itk::Vector
A templated class holding a n-Dimensional vector.
Definition: itkVector.h:62
itk::MatrixOffsetTransformBase< TParametersValueType, VDimension, VDimension >::MatrixValueType
typename MatrixType::ValueType MatrixValueType
Definition: itkMatrixOffsetTransformBase.h:181
itk::MatrixOffsetTransformBase
Matrix and Offset transformation of a vector space (e.g. space coordinates)
Definition: itkMatrixOffsetTransformBase.h:106
itk::Point::ValueType
TCoordRep ValueType
Definition: itkPoint.h:63
itk::SmartPointer< Self >
itk::Indent
Control indentation during Print() invocation.
Definition: itkIndent.h:49
itk::MatrixOffsetTransformBase::SetVarOffset
void SetVarOffset(const OutputVectorType &offset)
Definition: itkMatrixOffsetTransformBase.h:576
itk::MatrixOffsetTransformBase::GetCenter
const InputPointType & GetCenter() const
Definition: itkMatrixOffsetTransformBase.h:324
itk::MatrixOffsetTransformBase::GetVarInverseMatrix
const InverseMatrixType & GetVarInverseMatrix() const
Definition: itkMatrixOffsetTransformBase.h:527
itk::Matrix< TParametersValueType, Self::OutputSpaceDimension, Self::InputSpaceDimension >::ValueType
TParametersValueType ValueType
Definition: itkMatrix.h:59
itk::Vector::ValueType
T ValueType
Definition: itkVector.h:71
itk::MatrixOrthogonalityTolerance< float >::GetTolerance
static float GetTolerance()
Definition: itkMatrixOffsetTransformBase.h:57
itk::LightObject
Light weight base class for most itk classes.
Definition: itkLightObject.h:55
itk::MatrixOffsetTransformBase::SetMatrix
virtual void SetMatrix(const MatrixType &matrix)
Definition: itkMatrixOffsetTransformBase.h:232
itk::MatrixOffsetTransformBase< TParametersValueType, VDimension, VDimension >::OutputVectorValueType
typename OutputVectorType::ValueType OutputVectorValueType
Definition: itkMatrixOffsetTransformBase.h:150
itkMacro.h
itk::point
*par Constraints *The filter requires an image with at least two dimensions and a vector *length of at least The theory supports extension to scalar but *the implementation of the itk vector classes do not **The template parameter TRealType must be floating point(float or double) or *a user-defined "real" numerical type with arithmetic operations defined *sufficient to compute derivatives. **\par Performance *This filter will automatically multithread if run with *SetUsePrincipleComponents
itk::MatrixOffsetTransformBase::SetVarInverseMatrix
void SetVarInverseMatrix(const InverseMatrixType &matrix) const
Definition: itkMatrixOffsetTransformBase.h:532
itk::MatrixOffsetTransformBase< TParametersValueType, VDimension, VDimension >::TranslationValueType
typename TranslationType::ValueType TranslationValueType
Definition: itkMatrixOffsetTransformBase.h:193
itk::TimeStamp
Generate a unique, increasing time value.
Definition: itkTimeStamp.h:60
itk::MatrixOffsetTransformBase::GetOffset
const OutputVectorType & GetOffset() const
Definition: itkMatrixOffsetTransformBase.h:280
itk::TransformBaseTemplateEnums::TransformCategory
TransformCategory
Definition: itkTransformBase.h:45
itk::MatrixOffsetTransformBase< TParametersValueType, VDimension, VDimension >::OffsetValueType
typename OffsetType::ValueType OffsetValueType
Definition: itkMatrixOffsetTransformBase.h:189
itk::MatrixOffsetTransformBase< TParametersValueType, VDimension, VDimension >::InputPointValueType
typename InputPointType::ValueType InputPointValueType
Definition: itkMatrixOffsetTransformBase.h:175
itk::Matrix< TParametersValueType, Self::OutputSpaceDimension, Self::InputSpaceDimension >
itk::MatrixOffsetTransformBase::SetOffset
void SetOffset(const OutputVectorType &offset)
Definition: itkMatrixOffsetTransformBase.h:265
itk::CovariantVector
A templated class holding a n-Dimensional covariant vector.
Definition: itkCovariantVector.h:70
itk
The "itk" namespace contains all Insight Segmentation and Registration Toolkit (ITK) classes....
Definition: itkAnnulusOperator.h:24
itk::MatrixOffsetTransformBase::SetVarMatrix
void SetVarMatrix(const MatrixType &matrix)
Definition: itkMatrixOffsetTransformBase.h:557
itk::MatrixOrthogonalityTolerance< double >::GetTolerance
static double GetTolerance()
Definition: itkMatrixOffsetTransformBase.h:46
itk::MatrixOrthogonalityTolerance
Definition: itkMatrixOffsetTransformBase.h:39
itk::Math::e
static constexpr double e
Definition: itkMath.h:56
itk::Point
A templated class holding a geometric point in n-Dimensional space.
Definition: itkPoint.h:53
itk::Transform
Transform points and vectors from an input space to an output space.
Definition: itkTransform.h:83
AddImageFilter
Definition: itkAddImageFilter.h:81
itkTransform.h
itk::MatrixOffsetTransformBase::GetTranslation
const OutputVectorType & GetTranslation() const
Definition: itkMatrixOffsetTransformBase.h:352
itk::MatrixOffsetTransformBase::SetTranslation
void SetTranslation(const OutputVectorType &translation)
Definition: itkMatrixOffsetTransformBase.h:336
itk::Transform::InputVnlVectorType
vnl_vector_fixed< TParametersValueType, VInputDimension > InputVnlVectorType
Definition: itkTransform.h:170