Pixel Division of Two Images#

Synopsis#

Pixel-wise division of two images.

Results#

PixelDivisionOfTwoImages.png

PixelDivisionOfTwoImages.png#

Code#

C++#

#include "itkDivideImageFilter.h"
#include "itkImage.h"
#include "itkImageFileWriter.h"

using ImageType = itk::Image<unsigned char, 2>;

void
CreateImage1(ImageType::Pointer image);
void
CreateImage2(ImageType::Pointer image);

int
main()
{
  auto image1 = ImageType::New();
  CreateImage1(image1);

  auto image2 = ImageType::New();
  CreateImage2(image2);

  using DivideImageFilterType = itk::DivideImageFilter<ImageType, ImageType, ImageType>;

  auto divideImageFilter = DivideImageFilterType::New();
  divideImageFilter->SetInput1(image1);
  divideImageFilter->SetInput2(image2);
  divideImageFilter->Update();

  itk::WriteImage(divideImageFilter->GetOutput(), "test.png");

  return EXIT_SUCCESS;
}

void
CreateImage1(ImageType::Pointer image)
{
  // Create an image with 2 connected components
  ImageType::RegionType region;
  ImageType::IndexType  start;
  start[0] = 0;
  start[1] = 0;

  ImageType::SizeType size;
  unsigned int        NumRows = 200;
  unsigned int        NumCols = 300;
  size[0] = NumRows;
  size[1] = NumCols;

  region.SetSize(size);
  region.SetIndex(start);

  image->SetRegions(region);
  image->Allocate();

  // Make a square
  for (unsigned int r = 20; r < 80; ++r)
  {
    for (unsigned int c = 20; c < 80; ++c)
    {
      ImageType::IndexType pixelIndex;
      pixelIndex[0] = r;
      pixelIndex[1] = c;

      image->SetPixel(pixelIndex, 15);
    }
  }
}


void
CreateImage2(ImageType::Pointer image)
{
  // Create an image with 2 connected components
  ImageType::RegionType region;
  ImageType::IndexType  start;
  start[0] = 0;
  start[1] = 0;

  ImageType::SizeType size;
  unsigned int        NumRows = 200;
  unsigned int        NumCols = 300;
  size[0] = NumRows;
  size[1] = NumCols;

  region.SetSize(size);
  region.SetIndex(start);

  image->SetRegions(region);
  image->Allocate();

  // Make another square
  for (unsigned int r = 40; r < 100; ++r)
  {
    for (unsigned int c = 40; c < 100; ++c)
    {
      ImageType::IndexType pixelIndex;
      pixelIndex[0] = r;
      pixelIndex[1] = c;

      image->SetPixel(pixelIndex, 15);
    }
  }
}

Classes demonstrated#

template<typename TInputImage1, typename TInputImage2, typename TOutputImage>
class DivideImageFilter : public itk::BinaryGeneratorImageFilter<TInputImage1, TInputImage2, TOutputImage>

Pixel-wise division of two images.

This class is templated over the types of the two input images and the type of the output image. When the divisor is zero, the division result is set to the maximum number that can be represented by default to avoid exception. Numeric conversions (castings) are done by the C++ defaults.

ITK Sphinx Examples:

See itk::DivideImageFilter for additional documentation.