Compute Edge Potential#

Note

Wish List Still needs additional work to finish proper creation of example.

Synopsis#

Compute edge potential.

Results#

Note

Help Wanted Implementation of Results for sphinx examples containing this message. Reconfiguration of CMakeList.txt may be necessary. Write An Example <https://itk.org/ITKExamples/Documentation/Contribute/WriteANewExample.html>

Code#

C++#

#include "itkCovariantVector.h"
#include "itkEdgePotentialImageFilter.h"
#include "itkGradientImageFilter.h"
#include "itkImage.h"
#include "itkImageFileWriter.h"
#include "itkRescaleIntensityImageFilter.h"

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

static void
CreateImage(UnsignedCharImageType::Pointer image);

int
main(int /*argc*/, char * /*argv*/[])
{
  // Setup types
  using FloatImageType = itk::Image<float, 2>;
  using VectorImageType = itk::Image<itk::CovariantVector<float, 2>, 2>;

  auto image = UnsignedCharImageType::New();
  CreateImage(image);

  // Create and setup a gradient filter
  using GradientFilterType = itk::GradientImageFilter<UnsignedCharImageType, float>;
  auto gradientFilter = GradientFilterType::New();
  gradientFilter->SetInput(image);
  gradientFilter->Update();

  // Create and setup an edge potential filter
  using EdgePotentialImageFilterType = itk::EdgePotentialImageFilter<VectorImageType, FloatImageType>;
  auto edgePotentialImageFilter = EdgePotentialImageFilterType::New();
  edgePotentialImageFilter->SetInput(gradientFilter->GetOutput());
  edgePotentialImageFilter->Update();

  // Scale so we can write to a PNG
  using RescaleFilterType = itk::RescaleIntensityImageFilter<FloatImageType, UnsignedCharImageType>;
  auto rescaleFilter = RescaleFilterType::New();
  rescaleFilter->SetInput(edgePotentialImageFilter->GetOutput());
  rescaleFilter->SetOutputMinimum(0);
  rescaleFilter->SetOutputMaximum(255);
  rescaleFilter->Update();

  itk::WriteImage(rescaleFilter->GetOutput(), "output.png");

  return EXIT_SUCCESS;
}


void
CreateImage(UnsignedCharImageType::Pointer image)
{
  // Create a black image with 2 white regions

  UnsignedCharImageType::IndexType start;
  start.Fill(0);

  UnsignedCharImageType::SizeType size;
  size.Fill(200);

  UnsignedCharImageType::RegionType region(start, size);
  image->SetRegions(region);
  image->Allocate();
  image->FillBuffer(0);

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

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

Classes demonstrated#

template<typename TInputImage, typename TOutputImage>
class EdgePotentialImageFilter : public itk::UnaryGeneratorImageFilter<TInputImage, TOutputImage>

Computes the edge potential of an image from the image gradient.

Input to this filter should be a CovariantVector image representing the image gradient.

The filter expect both the input and output images to have the same number of dimensions, and the output to be of a scalar image type.

ITK Sphinx Examples:

See itk::EdgePotentialImageFilter for additional documentation.