1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
/*=========================================================================
*
* Copyright NumFOCUS
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*=========================================================================*/
#ifndef itkImageDuplicator_h
#define itkImageDuplicator_h
#include "itkObject.h"
#include "itkImage.h"
namespace itk
{
/** \class ImageDuplicator
* \brief A helper class which creates an image which is perfect copy of the input image.
*
* This class is NOT a filter. Although it has an API similar to a filter, this class
* is not intended to be used in a pipeline. Instead, the typical use will be like
* it is illustrated in the following code:
*
\code
medianFilter->Update();
ImageType::Pointer image = medianFilter->GetOutput();
using DuplicatorType = itk::ImageDuplicator< ImageType >;
auto duplicator = DuplicatorType::New();
duplicator->SetInputImage(image);
duplicator->Update();
ImageType::Pointer clonedImage = duplicator->GetOutput();
\endcode
*
* Note that the Update() method must be called explicitly in the filter
* that provides the input to the ImageDuplicator object. This is needed
* because the ImageDuplicator is not a pipeline filter.
*
* \ingroup ITKCommon
*
* \sphinx
* \sphinxexample{Core/Common/DuplicateAnImage,Duplicate An Image}
* \endsphinx
*/
template <typename TInputImage>
class ITK_TEMPLATE_EXPORT ImageDuplicator : public Object
{
public:
ITK_DISALLOW_COPY_AND_MOVE(ImageDuplicator);
/** Standard class type aliases. */
using Self = ImageDuplicator;
using Superclass = Object;
using Pointer = SmartPointer<Self>;
using ConstPointer = SmartPointer<const Self>;
/** Method for creation through the object factory. */
itkNewMacro(Self);
/** \see LightObject::GetNameOfClass() */
itkOverrideGetNameOfClassMacro(ImageDuplicator);
/** Type definitions for the input image. */
using ImageType = TInputImage;
using ImagePointer = typename TInputImage::Pointer;
using ImageConstPointer = typename TInputImage::ConstPointer;
using PixelType = typename TInputImage::PixelType;
using IndexType = typename TInputImage::IndexType;
static constexpr unsigned int ImageDimension = ImageType::ImageDimension;
itkSetConstObjectMacro(InputImage, ImageType);
/**
* Provide an interface to match that
* of other ProcessObjects
* for this source generation object
* by returning a non-const pointer
* for the generated Object.
*/
// NOTE: The m_DuplicateImage is only
// exposed via the Source generation interface
// by the GetOutput() method that mimics
// a process object.
virtual const ImageType *
GetOutput() const
{
return this->m_DuplicateImage.GetPointer();
}
virtual ImageType *
GetOutput()
{
return this->m_DuplicateImage.GetPointer();
}
#if !defined(ITK_LEGACY_REMOVE)
// This interface was exposed in ITKv4 when the itkGetModifiableObjectMacro was used
virtual ImageType *
GetModifiableOutput()
{
return this->m_DuplicateImage.GetPointer();
}
#endif
/** Compute of the input image. */
void
Update();
protected:
ImageDuplicator() = default;
~ImageDuplicator() override = default;
void
PrintSelf(std::ostream & os, Indent indent) const override;
private:
ImageConstPointer m_InputImage{};
ImagePointer m_DuplicateImage{};
ModifiedTimeType m_InternalImageTime{};
};
} // end namespace itk
#ifndef ITK_MANUAL_INSTANTIATION
# include "itkImageDuplicator.hxx"
#endif
#endif /* itkImageDuplicator_h */
|