Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions Documentation/ITK5MigrationGuide.md
Original file line number Diff line number Diff line change
Expand Up @@ -402,9 +402,19 @@ b40f74e07d74614c75be4aceac63b87e80e589d1 on 2018-11-14.

`itk::Barrier` has been moved to `ITKDeprecated` module.


`FixedArray` member functions `rBegin()` and `rEnd()` are replaced by `rbegin()` and `rend()`,
which return a `reverse_iterator`, compatible with the Standard C++ Library.

`itk::ImageTransformer` has been moved to `ITKDeprecated` module. The new `itk::ImageSink` filter can be used in its place.

`itk::StatisticsImageFilter`, `itk::LabelStatisticsImageFilter` and
`itk::MinimumMaximumImageFilter` no longer produce an image as their
primary output, as it was a shallow copy of the primary
input. Additionally, minor API changes have occoured related to the
decorated output methods to conform to ITK conventions.


Python changes
--------------

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ namespace itk
* ProcessObject::ReleaseDataBeforeUpdateFlagOn(). A user may want to
* set this flag to limit peak memory usage during a pipeline update.
*
* \ingroup ITKCommon
* \ingroup ITKDeprecated
*/
template< typename TInputImage >
class ITK_TEMPLATE_EXPORT ImageTransformer:public ProcessObject
Expand Down
1 change: 1 addition & 0 deletions Modules/Core/Common/ITKKWStyleOverwrite.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ itkVectorImage\.h Template Disable
itkSparseImageTest\.cxx InternalVariables Disable
itkSmartPointer\.h IfNDefDefine Disable
itkImageToImageFilter.\h InternalVariables Disable
itkImageSink.\h InternalVariables Disable
itkTimeStamp\.cxx Namespace Disable
itkObjectFactoryBase\.cxx Namespace Disable
itkNeighborhood\.hxx SemicolonSpace Disable
Expand Down
190 changes: 190 additions & 0 deletions Modules/Core/Common/include/itkImageSink.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
/*=========================================================================
*
* Copyright Insight Software Consortium
*
* 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
*
* http://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 itkImageSink_h
#define itkImageSink_h

#include "itkStreamingProcessObject.h"
#include "itkImage.h"
#include "itkImageRegionSplitterBase.h"
#include "itkImageRegionSplitterSlowDimension.h"
#include "itkImageToImageFilterCommon.h"

namespace itk
{

/** \class ImageSink
*
* ImageSink is the base class for process objects which consume image
* data. This class defaults to having at least one input of the
* templated image type. The framework enables derived algorithms to
* stream the input image as it's being consumed by the algorithm.
*
* The framework provides multi-threading of the streamed image regions.
* The input image's pipeline is updated multiple times with the
* streaming requested regions, then the fulfilled requested region
* are split again for multi-threading.
*
Comment thread
blowekamp marked this conversation as resolved.
* By default, the NumberOfStreamDivisions is 1 (no streaming).
* Derived implementations must change the access specification for
* this method to be public to expose the streaming feature.
*
*
* \ingroup ITKSystemObjects
* \ingroup DataProcessing
*
* \ingroup ITKCommon
**/
template <class TInputImage >
class ImageSink
: public StreamingProcessObject,
private ImageToImageFilterCommon
{
public:
ITK_DISALLOW_COPY_AND_ASSIGN(ImageSink);

/** Standard class type aliases. */
using Self = ImageSink;
using Superclass = StreamingProcessObject;
using Pointer = SmartPointer< Self >;
using ConstPointer = SmartPointer< const Self >;

/** Run-time type information (and related methods). */
itkTypeMacro( ImageSink, StreamingProcessObject );

/** Smart Pointer type to a DataObject. */
using DataObjectPointer = DataObject::Pointer;

/** Some convenient type alias. */
using InputImageType = TInputImage;
using InputImagePointer = typename InputImageType::Pointer;
using InputImageRegionType = typename InputImageType::RegionType;
using InputImagePixelType = typename InputImageType::PixelType;

/** SmartPointer to a region splitting object */
using SplitterType = ImageRegionSplitterBase;
using RegionSplitterPointer = typename SplitterType::Pointer;

using DataObjectIdentifierType = typename Superclass::DataObjectIdentifierType;

/** Dimension of input images. */
itkStaticConstMacro(InputImageDimension, unsigned int,
InputImageType::ImageDimension);


using Superclass::SetInput;
/** Set/Get the image input of this process object. */
virtual void SetInput(const InputImageType *input);

virtual const InputImageType * GetInput(void) const;

virtual const InputImageType *GetInput(unsigned int idx) const;

virtual const InputImageType *GetInput(const DataObjectIdentifierType & key) const;

virtual void Update( ) override;


/** get/set the Coordinate tolerance
* This tolerance is used when comparing the space defined
* by the input images. ITK has a requirement that multiple input
* images be congruent in space by default.
*/
itkSetMacro(CoordinateTolerance,double);
itkGetConstMacro(CoordinateTolerance,double);

/** get/set the direction tolerance
* This tolerance is used to make sure that all input
* images are oriented the same before performing the filter's
* transformations.
*/
itkSetMacro(DirectionTolerance,double);
itkGetConstMacro(DirectionTolerance,double);

/** get/set the global default direction tolerance
*
* This value is used to initialize the DirectionTolerance upon
* class construction of \b any Image filters. This has no
* effect on currently constructed classes.
*/
using ImageToImageFilterCommon::SetGlobalDefaultDirectionTolerance;
using ImageToImageFilterCommon::GetGlobalDefaultDirectionTolerance;


/** get/set the global default coordinate tolerance
*
* This value is used to initialize the CoordinateTolerance upon
* class construction of \b any ImageToImage filter. This has no
* effect on currently constructed classes.
*/
using ImageToImageFilterCommon::SetGlobalDefaultCoordinateTolerance;
using ImageToImageFilterCommon::GetGlobalDefaultCoordinateTolerance;

protected:
ImageSink();
~ImageSink() = default;

virtual void PrintSelf(std::ostream & os, Indent indent) const override;

virtual unsigned int GetNumberOfInputRequestedRegions () override;

virtual void GenerateNthInputRequestedRegion (unsigned int inputRequestedRegionNumber) override;

virtual void AllocateOutputs( ) {}

void VerifyInputInformation() ITKv5_CONST override;

void BeforeStreamedGenerateData( ) override {this->AllocateOutputs();}

virtual void StreamedGenerateData( unsigned int inputRequestedRegionNumber) override;

virtual void ThreadedStreamedGenerateData( const InputImageRegionType &inputRegionForChunk ) = 0;


/** Set the number of pieces to divide the input. The upstream pipeline
* will be executed this many times. */
itkSetMacro(NumberOfStreamDivisions, unsigned int);

/** Get the number of pieces to divide the input. The upstream pipeline
* will be executed this many times. */
itkGetConstMacro(NumberOfStreamDivisions, unsigned int);

/** Set/Get Helper class for dividing the input into regions for
* streaming */
itkSetObjectMacro(RegionSplitter, SplitterType);
itkGetObjectMacro(RegionSplitter, SplitterType);


private:

unsigned int m_NumberOfStreamDivisions;
RegionSplitterPointer m_RegionSplitter;
InputImageRegionType m_CurrentInputRegion;

/**
* Tolerances for checking whether input images are defined to
* occupy the same physical space.
*/
double m_CoordinateTolerance;
double m_DirectionTolerance;
};

}

#include "itkImageSink.hxx"

#endif // itkImageSink_h
Loading