ITK  5.3.0
Insight Toolkit
itkImageAdaptor.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 itkImageAdaptor_h
19 #define itkImageAdaptor_h
20 
21 #include "itkImage.h"
22 
23 namespace itk
24 {
25 
26 template <typename TPixelType, unsigned int VImageDimension>
27 class VectorImage;
28 
55 template <typename TImage, typename TAccessor>
56 class ITK_TEMPLATE_EXPORT ImageAdaptor : public ImageBase<TImage::ImageDimension>
57 {
58 public:
59  ITK_DISALLOW_COPY_AND_MOVE(ImageAdaptor);
60 
65  static constexpr unsigned int ImageDimension = TImage::ImageDimension;
66 
68  using Self = ImageAdaptor;
73 
75  itkTypeMacro(ImageAdaptor, ImageBase);
76 
78  using InternalImageType = TImage;
79 
81  itkNewMacro(Self);
82 
85  using PixelType = typename TAccessor::ExternalType;
86 
89  using InternalPixelType = typename TAccessor::InternalType;
90 
92 
95  using AccessorType = TAccessor;
96 
99  using AccessorFunctorType = typename InternalImageType::AccessorFunctorType::template Rebind<Self>::Type;
100 
102  using typename Superclass::IndexType;
104 
106  using typename Superclass::SizeType;
108 
110  using typename Superclass::OffsetType;
112 
115  using typename Superclass::RegionType;
116 
119  using typename Superclass::SpacingType;
120 
123  using typename Superclass::PointType;
124 
128  using typename Superclass::DirectionType;
129 
130 
137  template <typename UPixelType, unsigned int UImageDimension = TImage::ImageDimension>
138  struct Rebind
139  {
141  };
142 
143  template <typename UPixelType, unsigned int VUImageDimension = TImage::ImageDimension>
145 
146 
153  void
154  SetLargestPossibleRegion(const RegionType & region) override;
155 
159  void
160  SetBufferedRegion(const RegionType & region) override;
161 
165  void
166  SetRequestedRegion(const RegionType & region) override;
167 
172  void
173  SetRequestedRegion(const DataObject * data) override;
174 
181  const RegionType &
182  GetRequestedRegion() const override;
183 
192  const RegionType &
193  GetLargestPossibleRegion() const override;
194 
200  const RegionType &
201  GetBufferedRegion() const override;
202 
204  void
205  Allocate(bool initialize = false) override;
206 
209  void
210  Initialize() override;
211 
213  void
214  SetPixel(const IndexType & index, const PixelType & value)
215  {
216  m_PixelAccessor.Set(m_Image->GetPixel(index), value);
217  }
218 
220  PixelType
221  GetPixel(const IndexType & index) const
222  {
223  return m_PixelAccessor.Get(m_Image->GetPixel(index));
224  }
225 
227  PixelType operator[](const IndexType & index) const { return m_PixelAccessor.Get(m_Image->GetPixel(index)); }
228 
230  const OffsetValueType *
231  GetOffsetTable() const;
232 
234  IndexType
235  ComputeIndex(OffsetValueType offset) const;
236 
239  using PixelContainer = typename TImage::PixelContainer;
240  using PixelContainerPointer = typename TImage::PixelContainerPointer;
241  using PixelContainerConstPointer = typename TImage::PixelContainerConstPointer;
242 
246  {
247  return m_Image->GetPixelContainer();
248  }
249 
250  const PixelContainer *
252  {
253  return m_Image->GetPixelContainer();
254  }
255 
258  void
259  SetPixelContainer(PixelContainer * container);
260 
271  virtual void
272  Graft(const Self * imgData);
273 
276 
280  GetBufferPointer();
281 
282  const InternalPixelType *
283  GetBufferPointer() const;
284 
286  void
287  SetSpacing(const SpacingType & spacing) override;
288 
289  void
290  SetSpacing(const double * spacing /*[ImageDimension]*/) override;
291 
292  void
293  SetSpacing(const float * spacing /*[ImageDimension]*/) override;
294 
298  const SpacingType &
299  GetSpacing() const override;
300 
304  const PointType &
305  GetOrigin() const override;
306 
308  void
309  SetOrigin(const PointType origin) override;
310 
311  void
312  SetOrigin(const double * origin /*[ImageDimension]*/) override;
313 
314  void
315  SetOrigin(const float * origin /*[ImageDimension]*/) override;
316 
318  void
319  SetDirection(const DirectionType & direction) override;
320 
324  const DirectionType &
325  GetDirection() const override;
326 
328  virtual void
329  SetImage(TImage *);
330 
332  void
333  Modified() const override;
334 
337  GetMTime() const override;
338 
340  AccessorType &
342  {
343  return m_PixelAccessor;
344  }
345 
347  const AccessorType &
349  {
350  return m_PixelAccessor;
351  }
352 
354  void
355  SetPixelAccessor(const AccessorType & accessor)
356  {
357  m_PixelAccessor = accessor;
358  }
359 
361  void
362  Update() override;
363 
364  void
365  CopyInformation(const DataObject * data) override;
366 
369  void
370  UpdateOutputInformation() override;
371 
372  void
373  SetRequestedRegionToLargestPossibleRegion() override;
374 
375  void
376  PropagateRequestedRegion() override;
377 
378  void
379  UpdateOutputData() override;
380 
381  bool
382  VerifyRequestedRegion() override;
383 
385  template <typename TIndexRep, typename TCoordRep>
388  {
389  return m_Image->template TransformPhysicalPointToContinuousIndex<TIndexRep>(point);
390  }
391 
396  template <typename TCoordRep>
397  bool
400  {
401  return m_Image->TransformPhysicalPointToContinuousIndex(point, index);
402  }
403 
405  template <typename TCoordRep>
406  IndexType
408  {
409  return m_Image->TransformPhysicalPointToIndex(point);
410  }
411 
416  template <typename TCoordRep>
417  bool
419  {
420  return m_Image->TransformPhysicalPointToIndex(point, index);
421  }
422 
427  template <typename TCoordRep>
428  void
431  {
432  m_Image->TransformContinuousIndexToPhysicalPoint(index, point);
433  }
434 
436  template <typename TCoordRep, typename TIndexRep>
439  {
440  return m_Image->template TransformContinuousIndexToPhysicalPoint<TIndexRep>(index);
441  }
442 
448  template <typename TCoordRep>
449  void
451  {
452  m_Image->TransformIndexToPhysicalPoint(index, point);
453  }
454 
456  template <typename TCoordRep>
459  {
460  return m_Image->template TransformIndexToPhysicalPoint<TCoordRep>(index);
461  }
462 
463  template <typename TCoordRep>
464  void
466  FixedArray<TCoordRep, Self::ImageDimension> & outputGradient) const
467  {
468  m_Image->TransformLocalVectorToPhysicalVector(inputGradient, outputGradient);
469  }
470 
471  template <typename TVector>
472  TVector
473  TransformLocalVectorToPhysicalVector(const TVector & inputGradient) const
474  {
475  TVector outputGradient;
476  TransformLocalVectorToPhysicalVector(inputGradient, outputGradient);
477  return outputGradient;
478  }
479 
480  template <typename TCoordRep>
481  void
483  FixedArray<TCoordRep, Self::ImageDimension> & outputGradient) const
484  {
485  m_Image->TransformPhysicalVectorToLocalVector(inputGradient, outputGradient);
486  }
487 
488  template <typename TVector>
489  TVector
490  TransformPhysicalVectorToLocalVector(const TVector & inputGradient) const
491  {
492  TVector outputGradient;
493  TransformPhysicalVectorToLocalVector(inputGradient, outputGradient);
494  return outputGradient;
495  }
496 
497 protected:
498  ImageAdaptor();
499  ~ImageAdaptor() override = default;
500  void
501  PrintSelf(std::ostream & os, Indent indent) const override;
502  void
503  Graft(const DataObject * data) override;
504  using Superclass::Graft;
505 
506 private:
507  // a specialized method to update PixelAccessors for VectorImages,
508  // to have the correct vector length of the image.
509  template <typename TPixelType>
510  void
512  {
513  this->m_PixelAccessor.SetVectorLength(this->m_Image->GetNumberOfComponentsPerPixel());
514  }
515 
516  // The other image types don't expect an accessor which needs any updates
517  template <typename T>
518  void
519  UpdateAccessor(T * itkNotUsed(dummy))
520  {}
521 
522  // Adapted image, most of the calls to ImageAdaptor
523  // will be delegated to this image
525 
526  // Data accessor object,
527  // it converts the presentation of a pixel
529 };
530 } // end namespace itk
531 
532 #ifndef ITK_MANUAL_INSTANTIATION
533 # include "itkImageAdaptor.hxx"
534 #endif
535 
536 #endif
itk::ImageAdaptor::GetPixel
PixelType GetPixel(const IndexType &index) const
Definition: itkImageAdaptor.h:221
itk::ImageBase< TImage::ImageDimension >::OffsetValueType
typename OffsetType::OffsetValueType OffsetValueType
Definition: itkImageBase.h:138
itk::ImageAdaptor< TImage, Accessor::AddPixelAccessor< TImage::PixelType > >::PixelContainerConstPointer
typename TImage::PixelContainerConstPointer PixelContainerConstPointer
Definition: itkImageAdaptor.h:241
Pointer
SmartPointer< Self > Pointer
Definition: itkAddImageFilter.h:92
itk::Index< VImageDimension >
itk::ImageAdaptor< TImage, Accessor::AddPixelAccessor< TImage::PixelType > >::InternalImageType
TImage InternalImageType
Definition: itkImageAdaptor.h:78
itk::GTest::TypedefsAndConstructors::Dimension2::DirectionType
ImageBaseType::DirectionType DirectionType
Definition: itkGTestTypedefsAndConstructors.h:52
itk::ModifiedTimeType
SizeValueType ModifiedTimeType
Definition: itkIntTypes.h:102
itk::ImageAdaptor< TImage, Accessor::AddPixelAccessor< TImage::PixelType > >::PixelContainer
typename TImage::PixelContainer PixelContainer
Definition: itkImageAdaptor.h:239
itk::ImageBase
Base class for templated image classes.
Definition: itkImageBase.h:105
itk::ImageAdaptor::m_PixelAccessor
AccessorType m_PixelAccessor
Definition: itkImageAdaptor.h:528
itk::ImageAdaptor::m_Image
TImage::Pointer m_Image
Definition: itkImageAdaptor.h:524
itk::ImageRegion
An image region represents a structured region of data.
Definition: itkImageRegion.h:69
itk::ImageAdaptor::TransformLocalVectorToPhysicalVector
TVector TransformLocalVectorToPhysicalVector(const TVector &inputGradient) const
Definition: itkImageAdaptor.h:473
itk::ImageBase< TImage::ImageDimension >::SizeValueType
typename SizeType::SizeValueType SizeValueType
Definition: itkImageBase.h:142
itk::ImageAdaptor< TImage, Accessor::AddPixelAccessor< TImage::PixelType > >::InternalPixelType
typename Accessor::AddPixelAccessor< TImage::PixelType > ::InternalType InternalPixelType
Definition: itkImageAdaptor.h:89
itk::VectorImage
Templated n-dimensional vector image class.
Definition: itkImageAlgorithm.h:29
itk::GTest::TypedefsAndConstructors::Dimension2::PointType
ImageBaseType::PointType PointType
Definition: itkGTestTypedefsAndConstructors.h:51
itk::Vector< SpacingValueType, VImageDimension >
itk::GTest::TypedefsAndConstructors::Dimension2::SizeType
ImageBaseType::SizeType SizeType
Definition: itkGTestTypedefsAndConstructors.h:49
itk::ImageAdaptor::TransformPhysicalPointToIndex
bool TransformPhysicalPointToIndex(const Point< TCoordRep, Self::ImageDimension > &point, IndexType &index) const
Definition: itkImageAdaptor.h:418
itkImage.h
itk::ImageAdaptor::UpdateAccessor
void UpdateAccessor(T *)
Definition: itkImageAdaptor.h:519
itk::ImageAdaptor::TransformLocalVectorToPhysicalVector
void TransformLocalVectorToPhysicalVector(const FixedArray< TCoordRep, Self::ImageDimension > &inputGradient, FixedArray< TCoordRep, Self::ImageDimension > &outputGradient) const
Definition: itkImageAdaptor.h:465
itk::ImageAdaptor< TImage, Accessor::AddPixelAccessor< TImage::PixelType > >::InternalPixelPointerType
InternalPixelType * InternalPixelPointerType
Definition: itkImageAdaptor.h:275
itk::SmartPointer< Self >
itk::Indent
Control indentation during Print() invocation.
Definition: itkIndent.h:49
itk::ImageAdaptor::GetPixelContainer
const PixelContainer * GetPixelContainer() const
Definition: itkImageAdaptor.h:251
itk::ImageBase< TImage::ImageDimension >::IndexValueType
typename IndexType::IndexValueType IndexValueType
Definition: itkImageBase.h:133
itk::ImageAdaptor::operator[]
PixelType operator[](const IndexType &index) const
Definition: itkImageAdaptor.h:227
itk::IndexValueType
long IndexValueType
Definition: itkIntTypes.h:90
itk::ImageAdaptor
Give access to partial aspects of voxels from an Image.
Definition: itkImageAdaptor.h:56
itk::GTest::TypedefsAndConstructors::Dimension2::IndexType
ImageBaseType::IndexType IndexType
Definition: itkGTestTypedefsAndConstructors.h:50
itk::ImageAdaptor::TransformPhysicalPointToContinuousIndex
ContinuousIndex< TIndexRep, TImage::ImageDimension > TransformPhysicalPointToContinuousIndex(const Point< TCoordRep, TImage::ImageDimension > &point) const
Definition: itkImageAdaptor.h:387
itk::ImageAdaptor::TransformPhysicalPointToIndex
IndexType TransformPhysicalPointToIndex(const Point< TCoordRep, Self::ImageDimension > &point) const
Definition: itkImageAdaptor.h:407
itk::ImageAdaptor::UpdateAccessor
void UpdateAccessor(typename itk::VectorImage< TPixelType, ImageDimension > *)
Definition: itkImageAdaptor.h:511
itk::ImageAdaptor::Rebind
Definition: itkImageAdaptor.h:138
itk::ImageAdaptor::TransformPhysicalVectorToLocalVector
TVector TransformPhysicalVectorToLocalVector(const TVector &inputGradient) const
Definition: itkImageAdaptor.h:490
itk::ImageAdaptor::TransformPhysicalPointToContinuousIndex
bool TransformPhysicalPointToContinuousIndex(const Point< TCoordRep, Self::ImageDimension > &point, ContinuousIndex< TCoordRep, Self::ImageDimension > &index) const
Get the continuous index from a physical point.
Definition: itkImageAdaptor.h:398
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::GTest::TypedefsAndConstructors::Dimension2::RegionType
ImageBaseType::RegionType RegionType
Definition: itkGTestTypedefsAndConstructors.h:54
itk::ImageAdaptor< TImage, Accessor::AddPixelAccessor< TImage::PixelType > >::AccessorFunctorType
typename InternalImageType::AccessorFunctorType::template Rebind< Self >::Type AccessorFunctorType
Definition: itkImageAdaptor.h:99
itk::ImageAdaptor::SetPixelAccessor
void SetPixelAccessor(const AccessorType &accessor)
Definition: itkImageAdaptor.h:355
itk::ImageAdaptor::TransformIndexToPhysicalPoint
void TransformIndexToPhysicalPoint(const IndexType &index, Point< TCoordRep, Self::ImageDimension > &point) const
Definition: itkImageAdaptor.h:450
itk::OffsetValueType
long OffsetValueType
Definition: itkIntTypes.h:94
itk::FixedArray
Simulate a standard C array with copy semantics.
Definition: itkFixedArray.h:53
itk::Matrix< SpacePrecisionType, VImageDimension, VImageDimension >
itk::ImageAdaptor< TImage, Accessor::AddPixelAccessor< TImage::PixelType > >::PixelContainerPointer
typename TImage::PixelContainerPointer PixelContainerPointer
Definition: itkImageAdaptor.h:240
itk::ImageAdaptor< TImage, Accessor::AddPixelAccessor< TImage::PixelType > >::PixelType
typename Accessor::AddPixelAccessor< TImage::PixelType > ::ExternalType PixelType
Definition: itkImageAdaptor.h:85
itk::ImageAdaptor::TransformPhysicalVectorToLocalVector
void TransformPhysicalVectorToLocalVector(const FixedArray< TCoordRep, Self::ImageDimension > &inputGradient, FixedArray< TCoordRep, Self::ImageDimension > &outputGradient) const
Definition: itkImageAdaptor.h:482
itk::WeakPointer
Implements a weak reference to an object.
Definition: itkWeakPointer.h:44
itk::ImageAdaptor::TransformIndexToPhysicalPoint
Point< TCoordRep, Self::ImageDimension > TransformIndexToPhysicalPoint(const IndexType &index) const
Definition: itkImageAdaptor.h:458
itk::ImageAdaptor::TransformContinuousIndexToPhysicalPoint
void TransformContinuousIndexToPhysicalPoint(const ContinuousIndex< TCoordRep, Self::ImageDimension > &index, Point< TCoordRep, Self::ImageDimension > &point) const
Definition: itkImageAdaptor.h:429
itk
The "itk" namespace contains all Insight Segmentation and Registration Toolkit (ITK) classes....
Definition: itkAnnulusOperator.h:24
itk::ContinuousIndex
A templated class holding a point in n-Dimensional image space.
Definition: itkContinuousIndex.h:46
itk::Object
Base class for most ITK classes.
Definition: itkObject.h:61
itk::ImageAdaptor::SetPixel
void SetPixel(const IndexType &index, const PixelType &value)
Definition: itkImageAdaptor.h:214
itk::Point< PointValueType, VImageDimension >
itk::Image
Templated n-dimensional image class.
Definition: itkImage.h:88
itk::Accessor::AddPixelAccessor< TImage::PixelType >
AddImageFilter
Definition: itkAddImageFilter.h:80
itk::ImageAdaptor::GetPixelAccessor
AccessorType & GetPixelAccessor()
Definition: itkImageAdaptor.h:341
itk::ImageAdaptor::GetPixelAccessor
const AccessorType & GetPixelAccessor() const
Definition: itkImageAdaptor.h:348
itk::ImageAdaptor::GetPixelContainer
PixelContainerPointer GetPixelContainer()
Definition: itkImageAdaptor.h:245
itk::SizeValueType
unsigned long SizeValueType
Definition: itkIntTypes.h:83
itk::ImageAdaptor< TImage, Accessor::AddPixelAccessor< TImage::PixelType > >::IOPixelType
PixelType IOPixelType
Definition: itkImageAdaptor.h:91
itk::DataObject
Base class for all data objects in ITK.
Definition: itkDataObject.h:293
itk::ImageAdaptor::TransformContinuousIndexToPhysicalPoint
Point< TCoordRep, TImage::ImageDimension > TransformContinuousIndexToPhysicalPoint(const ContinuousIndex< TIndexRep, Self::ImageDimension > &index) const
Definition: itkImageAdaptor.h:438