Remove Labels From Label Map#


Remove the labels from a LabelMap.



There are 10 objects.
There are originally 10 objects.
Removing 5 objects.
There are 5 objects remaining.



#include "itkImage.h"
#include "itkImageRegionIterator.h"
#include "itkBinaryImageToLabelMapFilter.h"

using ImageType = itk::Image<unsigned char, 2>;
static void
CreateImage(ImageType::Pointer image);

  auto image = ImageType::New();

  using BinaryImageToLabelMapFilterType = itk::BinaryImageToLabelMapFilter<ImageType>;
  auto binaryImageToLabelMapFilter = BinaryImageToLabelMapFilterType::New();

  // The output of this filter is an itk::LabelMap, which contains itk::LabelObject's
  std::cout << "There are " << binaryImageToLabelMapFilter->GetOutput()->GetNumberOfLabelObjects() << " objects."
            << std::endl;

  std::vector<unsigned long> labelsToRemove;

  std::cout << "There are originally " << binaryImageToLabelMapFilter->GetOutput()->GetNumberOfLabelObjects()
            << " objects." << std::endl;

  // Note: do NOT remove the labels inside the loop! The IDs are stored such that they will change when one is deleted.
  // Instead, mark all of the labels to be removed first and then remove them all together.
  for (unsigned int i = 0; i < binaryImageToLabelMapFilter->GetOutput()->GetNumberOfLabelObjects(); ++i)
    // Get the ith region
    BinaryImageToLabelMapFilterType::OutputImageType::LabelObjectType * labelObject =
    // std::cout << "Region " << i << " has " << labelObject->Size() << " pixels." << std::endl;

    // Mark every other label to be removed
    if (i % 2 == 0)

  std::cout << "Removing " << labelsToRemove.size() << " objects." << std::endl;
  // Remove all regions that were marked for removal.
  for (unsigned long i : labelsToRemove)

  std::cout << "There are " << binaryImageToLabelMapFilter->GetOutput()->GetNumberOfLabelObjects()
            << " objects remaining." << std::endl;

  return EXIT_SUCCESS;

CreateImage(ImageType::Pointer image)
  // Create a black image with a white square
  ImageType::IndexType start;

  ImageType::SizeType size;

  ImageType::RegionType region(start, size);

  // Make line of non-touching diagonal pixels
  for (unsigned int i = 0; i < 20; i += 2)
    itk::Index<2> pixel;
    pixel[0] = i;
    pixel[1] = i;
    image->SetPixel(pixel, 255);

Classes demonstrated#

template<typename TLabelObject>
class LabelMap : public itk::ImageBase<TLabelObject::ImageDimension>

Templated n-dimensional image to store labeled objects.

LabelMap is an image class specialized in storing the labeled images. It represent the image in a different way than itk::Image. Instead of storing the content of the image in an array of pixels values, it store the a collection of labeled objects, and a background value. This way of storing the content of the image allow an easy and efficient manipulation of the objects in the image.

The LabelMap shares a lot of methods with the itk::Image class. it make it usable as input or output of the itk::ImageToImageFilter for example. However the methods don’t have the same complexity in the 2 classes, because of the different way to store the data. GetPixel() is run in constant time for example in itk::Image, but have a worst case complexity of O(L), where L is the number of lines in the image (imageSize[1] * imageSize[2] for a 3D image).

To iterate over the LabelObjects in the map, use:

for(unsigned int i = 0; i < filter->GetOutput()->GetNumberOfLabelObjects(); ++i)
  FilterType::OutputImageType::LabelObjectType* labelObject =

This implementation was taken from the Insight Journal paper:

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

ITK Sphinx Examples:

See itk::LabelMap for additional documentation.