ITK  5.0.0
Insight Segmentation and Registration Toolkit
WikiExamples/ImageProcessing/UnaryFunctorImageFilter.cxx
#include "itkVectorImage.h"
#include "itkVector.h"
#include "vnl/vnl_math.h"
template< class TInput, class TOutput>
class RotateVectors
{
public:
RotateVectors() {};
~RotateVectors() {};
bool operator!=( const RotateVectors & ) const
{
return false;
}
bool operator==( const RotateVectors & other ) const
{
return !(*this != other);
}
inline TOutput operator()( const TInput & A ) const
{
v[0] = A[0];
v[1] = A[1];
using TransformType = itk::Rigid2DTransform< float >;
TransformType::Pointer transform = TransformType::New();
transform->SetAngle(vnl_math::pi/2.0);
VectorType outputV = transform->TransformVector(v);
TOutput transformedVector;
transformedVector.SetSize(2);
transformedVector[0] = outputV[0];
transformedVector[1] = outputV[1];
return transformedVector;
}
};
int main(int, char *[])
{
using ImageType = itk::VectorImage<float, 2>;
start[0] = 0;
start[1] = 0;
size[0] = 2;
size[1] = 3;
region.SetSize(size);
region.SetIndex(start);
ImageType::Pointer image = ImageType::New();
image->SetRegions(region);
image->SetVectorLength(2);
image->Allocate();
pixelIndex[0] = 1;
pixelIndex[1] = 1;
v.SetSize(2);
v[0] = 1;
v[1] = 0;
image->SetPixel(pixelIndex, v);
using FilterType = itk::UnaryFunctorImageFilter<ImageType,ImageType,
RotateVectors<
ImageType::PixelType,
ImageType::PixelType> >;
FilterType::Pointer filter = FilterType::New();
filter->SetInput(image);
filter->Update();
ImageType::PixelType inputPixelValue = image->GetPixel(pixelIndex);
ImageType::PixelType outputPixelValue = filter->GetOutput()->GetPixel(pixelIndex);
std::cout << "pixel (1,1) was = " << inputPixelValue << std::endl;
std::cout << "pixel (1,1) now = " << outputPixelValue << std::endl;
return EXIT_SUCCESS;
}