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 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244
|
/*=========================================================================
Program: Insight Segmentation & Registration Toolkit
Module: $RCSfile: itkChangeInformationImageFilter.h,v $
Language: C++
Date: $Date: 2005-04-18 18:14:58 $
Version: $Revision: 1.9 $
Copyright (c) Insight Software Consortium. All rights reserved.
See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef __itkChangeInformationImageFilter_h
#define __itkChangeInformationImageFilter_h
#include "itkImageToImageFilter.h"
#include "itkFixedArray.h"
namespace itk
{
/** \class ChangeInformationImageFilter
* \brief Change the origin, spacing and/or region of an Image.
*
* Change the origin, spacing, direction and/or buffered region of an itkImage. This
* "Information" along with an Image's container comprise the
* itkImage. By default, the output's information is set to the
* input's information. The methods ChangeSpacingOn/Off,
* ChangeOriginOn/Off, ChangeDirectionOn/Off and ChangeRegionOn/Off
* control whether the default origin, spacing, direction or buffered
* region should be changed. If On, the associated information will be
* replaced with either the ReferenceImage information (if
* UseReferenceImage is true) or the ivars OutputSpacing,
* OutputOrigin, OutputDirection, OutputOffset.
*
* In addition, the method CenterImageOn will recompute the output image
* origin (using the selected output spacing) the align the center of the
* image with the coordinate 0.
*
* \ingroup GeometricTransforms
*
*/
template <class TInputImage>
class ITK_EXPORT ChangeInformationImageFilter:
public ImageToImageFilter<TInputImage,TInputImage>
{
public:
/** Standard class typedefs. */
typedef ChangeInformationImageFilter Self;
typedef ImageToImageFilter<TInputImage,TInputImage> Superclass;
typedef SmartPointer<Self> Pointer;
typedef SmartPointer<const Self> ConstPointer;
/** Method for creation through the object factory. */
itkNewMacro(Self);
/** Typedef to describe the output and input image region types. */
typedef typename TInputImage::RegionType OutputImageRegionType;
typedef typename TInputImage::RegionType InputImageRegionType;
/** Typedef to describe the pointer to the input. */
typedef typename TInputImage::Pointer InputImagePointer;
/** Typedef to describe the type of pixel. */
typedef typename TInputImage::PixelType OutputImagePixelType;
typedef typename TInputImage::PixelType InputImagePixelType;
/** Typedef to describe the output and input image index and size types. */
typedef typename TInputImage::IndexType OutputImageIndexType;
typedef typename TInputImage::IndexType InputImageIndexType;
typedef typename TInputImage::SizeType OutputImageSizeType;
typedef typename TInputImage::SizeType InputImageSizeType;
typedef typename TInputImage::OffsetType OutputImageOffsetType;
typedef typename TInputImage::OffsetType InputImageOffsetType;
typedef typename TInputImage::DirectionType OutputImageDirectionType;
typedef typename TInputImage::DirectionType InputImageDirectionType;
/** Image related typedefs. */
itkStaticConstMacro(ImageDimension, unsigned int,
TInputImage::ImageDimension);
/** Image spacing, origin and direction typedefs */
typedef typename TInputImage::SpacingType SpacingType;
typedef typename TInputImage::PointType PointType;
typedef typename TInputImage::DirectionType DirectionType;
/** Run-time type information (and related methods). */
itkTypeMacro(ChangeInformationImageFilter, ImageToImageFilter);
/** Copy the information from another Image. By default,
* the information is copied from the input image. */
void SetReferenceImage (TInputImage *image)
{
if (image != m_ReferenceImage)
{
m_ReferenceImage = image;
this->ProcessObject::SetNthInput(1, image);
this->Modified();
}
}
itkGetObjectMacro(ReferenceImage, TInputImage);
itkSetMacro(UseReferenceImage, bool);
itkBooleanMacro(UseReferenceImage);
itkGetMacro(UseReferenceImage, bool);
/** Specify a new data spacing explicitly. The default is to
* use the spacing of the Input, or of the ReferenceImage
* if UseReferenceImage is set. */
itkSetMacro(OutputSpacing, SpacingType);
itkGetConstReferenceMacro(OutputSpacing, SpacingType);
/** Specify a new data origin explicitly. The default is to
* use the origin of the Input, or of the ReferenceImage
* if UseReferenceImage is true. */
itkSetMacro(OutputOrigin, PointType);
itkGetConstReferenceMacro(OutputOrigin, PointType);
/** Specify a new direciton cosine matrix explicitly. The default is to
* use the direction of the Input, or of the ReferenceImage
* if UseReferenceImage is true. */
itkSetMacro(OutputDirection, DirectionType);
itkGetConstReferenceMacro(OutputDirection, DirectionType);
/** Specify an offset for the buffered region. The default is to
* use the same buffered region as the input or an Offset computed from
* the ReferenceImage's buffered region (if UseReferenceImage is true.)
* NOTE: Changing the buffered region should not be done without a
* corresponding change in the requested region. Of course, the pipeline
* controls the requested region. Therefore, changing the buffered region
* may mean the filter cannot produce the requested region.
*/
itkSetVectorMacro(OutputOffset, long, ImageDimension);
itkGetVectorMacro(OutputOffset, const long, ImageDimension);
/** Change the origin, spacing and region of the output image. */
void ChangeAll()
{
this->ChangeSpacingOn();
this->ChangeOriginOn();
this->ChangeDirectionOn();
this->ChangeRegionOn();
}
/** Do not change the origin, spacing, direction or region of the
* output image. */
void ChangeNone()
{
this->ChangeSpacingOff();
this->ChangeOriginOff();
this->ChangeDirectionOff();
this->ChangeRegionOff();
}
/** Change the Spacing of the output image. If false, the output
* image spacing will be set to the input image spacing. If true, the
* output image spacing will be set to:
* the ReferenceImage spacing (if UseReferenceImage is true) or
* OutputSpacing. */
itkSetMacro(ChangeSpacing, bool);
itkBooleanMacro(ChangeSpacing);
itkGetMacro(ChangeSpacing, bool);
/** Change the Origin of the output image. If false, the output
* image origin will be set to the input image origin. If true, the
* output image origin will be set to:
* the ReferenceImage origin (if UseReferenceImage is true) or
* OutputOrigin. */
itkSetMacro(ChangeOrigin, bool);
itkBooleanMacro(ChangeOrigin);
itkGetMacro(ChangeOrigin, bool);
/** Change the direction of the output image. If false, the output
* image direction will be set to the input image direction. If true, the
* output image direction will be set to:
* the ReferenceImage direction (if UseReferenceImage is true) or
* OutputDirection. */
itkSetMacro(ChangeDirection, bool);
itkBooleanMacro(ChangeDirection);
itkGetMacro(ChangeDirection, bool);
/** Change the BufferedRegion of the output image. */
itkSetMacro(ChangeRegion, bool);
itkBooleanMacro(ChangeRegion);
itkGetMacro(ChangeRegion, bool);
/** Set the Origin of the output so that image coordinate (0,0,0)
* lies at the Center of the Image. This will override
* SetOutputOrigin. */
itkSetMacro(CenterImage, bool);
itkBooleanMacro(CenterImage);
itkGetMacro(CenterImage, bool);
/** Apply changes to the output image information. */
virtual void GenerateOutputInformation();
/** Apply changes to the input image requested region. */
virtual void GenerateInputRequestedRegion();
/** Copy the input buffer. */
void GenerateData();
protected:
ChangeInformationImageFilter();
~ChangeInformationImageFilter() {};
void PrintSelf(std::ostream& os, Indent indent) const;
private:
ChangeInformationImageFilter(const Self&); //purposely not implemented
void operator=(const Self&); //purposely not implemented
InputImagePointer m_ReferenceImage;
bool m_CenterImage;
bool m_ChangeSpacing;
bool m_ChangeOrigin;
bool m_ChangeDirection;
bool m_ChangeRegion;
bool m_UseReferenceImage;
SpacingType m_OutputSpacing;
PointType m_OutputOrigin;
DirectionType m_OutputDirection;
long m_OutputOffset[ImageDimension];
OutputImageOffsetType m_Shift;
};
} // end namespace itk
#ifndef ITK_MANUAL_INSTANTIATION
#include "itkChangeInformationImageFilter.txx"
#endif
#endif
|