Regional Minimal

Synopsis

Regional minimal image filter.

Results

input.png

input.png

output.png

output.png

Code

C++

#include "itkImage.h"
#include "itkImageFileWriter.h"
#include "itkRegionalMinimaImageFilter.h"

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

static void
CreateImage(ImageType::Pointer image);

int
main(int, char *[])
{
  ImageType::Pointer image = ImageType::New();
  CreateImage(image);

  using RegionalMinimaImageFilterType = itk::RegionalMinimaImageFilter<ImageType, ImageType>;
  RegionalMinimaImageFilterType::Pointer regionalMinimaImageFilter = RegionalMinimaImageFilterType::New();
  regionalMinimaImageFilter->SetInput(image);
  regionalMinimaImageFilter->Update();

  using WriterType = itk::ImageFileWriter<ImageType>;
  WriterType::Pointer writer = WriterType::New();
  writer->SetFileName("input.png");
  writer->SetInput(image);
  writer->Update();

  writer->SetFileName("output.png");
  writer->SetInput(regionalMinimaImageFilter->GetOutput());
  writer->Update();

  return EXIT_SUCCESS;
}

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

  ImageType::SizeType size;
  size[0] = 200;
  size[1] = 300;

  ImageType::RegionType region(start, size);

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

  // Make two intensity blobs
  for (unsigned int r = 0; r < size[1]; r++)
  {
    for (unsigned int c = 0; c < size[0]; c++)
    {
      ImageType::IndexType pixelIndex;
      pixelIndex[0] = c;
      pixelIndex[1] = r;

      double c1 = c - 100.0;
      double c2 = c - 200.0;

      double rr = r - 100.0;

      // purposely use 270,257 since it is > 255
      double v1 = 270.0 - std::sqrt(rr * rr + c1 * c1);
      double v2 = 257.0 - std::sqrt(rr * rr + c2 * c2);

      double maxv = v1;
      if (maxv < v2)
        maxv = v2;

      double val = maxv;

      // Clip
      if (val < 0.0)
        val = 0.0;
      if (val > 255.0)
        val = 255.0;

      image->SetPixel(pixelIndex, static_cast<unsigned char>(val));
    }
  }
}

Classes demonstrated

template<typename TInputImage, typename TOutputImage>
class RegionalMinimaImageFilter : public itk::ImageToImageFilter<TInputImage, TOutputImage>

Produce a binary image where foreground is the regional minima of the input image.

Regional minima are flat zones surrounded by pixels of greater value.

If the input image is constant, the entire image can be considered as a minima or not. The SetFlatIsMinima() method let the user choose which behavior to use.

This class was contributed to the Insight Journal by

Author

Gaetan Lehmann. Biologie du Developpement et de la Reproduction, INRA de Jouy-en-Josas, France. https://www.insight-journal.org/browse/publication/65

See

RegionalMaximaImageFilter

See

ValuedRegionalMinimaImageFilter

See

HConcaveImageFilter

ITK Sphinx Examples:

See itk::RegionalMinimaImageFilter for additional documentation.