Custom Operation to Corresponding Pixels in Two Images#

Synopsis#

Apply a predefined operation to corresponding pixels in two images.

Results#

Output:

pixel1 was = 2
pixel2 was = 5
output is = 9

Code#

C++#

#include "itkVectorImage.h"
#include "itkVector.h"
#include "itkVariableLengthVector.h"
#include "itkRigid2DTransform.h"
#include "itkBinaryFunctorImageFilter.h"

using ImageType = itk::Image<float, 2>;
static void
CreateImage(ImageType::Pointer image);

namespace Functor
{
template <class TPixel>
class MySquaredDifference
{
public:
  MySquaredDifference() = default;
  ~MySquaredDifference() = default;
  bool
  operator!=(const MySquaredDifference &) const
  {
    return false;
  }

  bool
  operator==(const MySquaredDifference & other) const
  {
    return !(*this != other);
  }

  inline TPixel
  operator()(const TPixel & A, const TPixel & B) const
  {
    const auto   dA = static_cast<double>(A);
    const auto   dB = static_cast<double>(B);
    const double diff = dA - dB;

    return static_cast<TPixel>(diff * diff);
  }
};
} // namespace Functor

int
main()
{
  auto image1 = ImageType::New();
  CreateImage(image1);
  image1->FillBuffer(2);

  auto image2 = ImageType::New();
  CreateImage(image2);
  image2->FillBuffer(5);

  using FilterType =
    itk::BinaryFunctorImageFilter<ImageType, ImageType, ImageType, Functor::MySquaredDifference<ImageType::PixelType>>;

  auto filter = FilterType::New();
  filter->SetInput1(image1);
  filter->SetInput2(image2);
  filter->Update();

  itk::Index<2> pixelIndex;
  pixelIndex.Fill(0);

  ImageType::PixelType input1PixelValue = image1->GetPixel(pixelIndex);
  ImageType::PixelType input2PixelValue = image2->GetPixel(pixelIndex);
  ImageType::PixelType outputPixelValue = filter->GetOutput()->GetPixel(pixelIndex);

  std::cout << "pixel1 was = " << input1PixelValue << std::endl;
  std::cout << "pixel2 was = " << input2PixelValue << std::endl;
  std::cout << "output is = " << outputPixelValue << std::endl;

  return EXIT_SUCCESS;
}

void
CreateImage(ImageType::Pointer image)
{
  ImageType::IndexType start;
  start.Fill(0);

  ImageType::SizeType size;
  size.Fill(10);

  ImageType::RegionType region(start, size);
  image->SetRegions(region);
  image->Allocate();
}

Classes demonstrated#

template<typename TInputImage1, typename TInputImage2, typename TOutputImage, typename TFunction>
class BinaryFunctorImageFilter : public itk::InPlaceImageFilter<TInputImage1, TOutputImage>

Implements pixel-wise generic operation of two images, or of an image and a constant.

This class is parameterized over the types of the two input images and the type of the output image. It is also parameterized by the operation to be applied. A Functor style is used.

The constant must be of the same type than the pixel type of the corresponding image. It is wrapped in a SimpleDataObjectDecorator so it can be updated through the pipeline. The SetConstant() and GetConstant() methods are provided as shortcuts to set or get the constant value without manipulating the decorator.

See

BinaryGeneratorImagFilter

See

UnaryFunctorImageFilter TernaryFunctorImageFilter

ITK Sphinx Examples:

See itk::BinaryFunctorImageFilter for additional documentation.