Label Contours of Connect Components#

Synopsis#

Label the contours of connected components.

Results#

../../../../_images/LabelContoursOfConnectComponents.png

Generated Output.

Code#

C++#

#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkLabelContourImageFilter.h"
#include "itkConnectedComponentImageFilter.h"
#include "itkScalarToRGBColormapImageFilter.h"

#include "itksys/SystemTools.hxx"
#include <sstream>

#ifdef ENABLE_QUICKVIEW
#  include "QuickView.h"
#endif

namespace
{
using PixelType = unsigned char;
using RGBPixelType = itk::RGBPixel<unsigned char>;
using ImageType = itk::Image<PixelType, 2>;
using RGBImageType = itk::Image<RGBPixelType, 2>;
} // namespace

static void
CreateImage(ImageType::Pointer image);

int
main(int argc, char * argv[])
{
  // Create or read an image
  ImageType::Pointer image;
  if (argc < 2)
  {
    image = ImageType::New();
    CreateImage(image.GetPointer());
  }
  else
  {
    image = itk::ReadImage<ImageType>(argv[1]);
  }

  // Generate connected components
  using ConnectedComponentImageFilterType = itk::ConnectedComponentImageFilter<ImageType, ImageType>;
  auto connectedComponentImageFilter = ConnectedComponentImageFilterType::New();
  connectedComponentImageFilter->SetInput(image);

  // Generate contours for each component
  using LabelContourImageFilterType = itk::LabelContourImageFilter<ImageType, ImageType>;
  auto labelContourImageFilter = LabelContourImageFilterType::New();
  labelContourImageFilter->SetInput(connectedComponentImageFilter->GetOutput());

  using RGBFilterType = itk::ScalarToRGBColormapImageFilter<ImageType, RGBImageType>;
  auto rgbFilter = RGBFilterType::New();
  rgbFilter->SetInput(labelContourImageFilter->GetOutput());
  rgbFilter->SetColormap(itk::ScalarToRGBColormapImageFilterEnums::RGBColormapFilter::Jet);

#ifdef ENABLE_QUICKVIEW
  QuickView viewer;
  viewer.AddImage(
    image.GetPointer(), true, argc > 1 ? itksys::SystemTools::GetFilenameName(argv[1]) : "Generated image");

  std::stringstream desc;
  desc << "LabelContourImageFilter";
  viewer.AddRGBImage(rgbFilter->GetOutput(), true, desc.str());

  viewer.Visualize();
#endif
  return EXIT_SUCCESS;
}

void
CreateImage(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 = 30; c < 100; ++c)
    {
      ImageType::IndexType pixelIndex;
      pixelIndex[0] = r;
      pixelIndex[1] = c;

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

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

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

Classes demonstrated#

template<typename TInputImage, typename TOutputImage>
class LabelContourImageFilter : public itk::InPlaceImageFilter<TInputImage, TOutputImage>, protected itk::ScanlineFilterCommon<TInputImage, TOutputImage>

Labels the pixels on the border of the objects in a labeled image.

LabelContourImageFilter takes a labeled image as input, where the pixels in the objects are the pixels with a value different of the BackgroundValue. Only the pixels on the contours of the objects are kept. The pixels not on the border are changed to BackgroundValue. The labels of the object are the same in the input and in the output image.

The connectivity can be changed to minimum or maximum connectivity with SetFullyConnected(). Full connectivity produces thicker contours.

https://www.insight-journal.org/browse/publication/217

Author

Gaetan Lehmann. Biologie du Developpement et de la Reproduction, INRA de Jouy-en-Josas, France.

See

BinaryContourImageFilter

ITK Sphinx Examples:

See itk::LabelContourImageFilter for additional documentation.