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{};
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{};
auto size = ImageType::SizeType::Filled(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 also
BinaryGeneratorImagFilter
See also
UnaryFunctorImageFilter TernaryFunctorImageFilter
