Overlay Label Map on Top of an Image#
Synopsis#
Apply a colormap to a label map and superimpose it on an image
Results#
Code#
Python#
#!/usr/bin/env python
import sys
import itk
import argparse
parser = argparse.ArgumentParser(description="Overlay Label Map On Top Of An Image.")
parser.add_argument("input_image")
parser.add_argument("label_map")
parser.add_argument("output_image")
args = parser.parse_args()
PixelType = itk.ctype("unsigned char")
Dimension = 2
ImageType = itk.Image[PixelType, Dimension]
reader = itk.ImageFileReader[ImageType].New()
reader.SetFileName(args.input_image)
labelReader = itk.ImageFileReader[ImageType].New()
labelReader.SetFileName(args.label_map)
LabelType = itk.ctype("unsigned long")
LabelObjectType = itk.StatisticsLabelObject[LabelType, Dimension]
LabelMapType = itk.LabelMap[LabelObjectType]
converter = itk.LabelImageToLabelMapFilter[ImageType, LabelMapType].New()
converter.SetInput(labelReader)
RGBImageType = itk.Image[itk.RGBPixel[PixelType], Dimension]
overlayFilter = itk.LabelMapOverlayImageFilter[
LabelMapType, ImageType, RGBImageType
].New()
overlayFilter.SetInput(converter.GetOutput())
overlayFilter.SetFeatureImage(reader.GetOutput())
overlayFilter.SetOpacity(0.5)
itk.imwrite(overlayFilter.GetOutput(), args.output_image)
C++#
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkLabelObject.h"
#include "itkLabelMap.h"
#include "itkLabelImageToLabelMapFilter.h"
#include "itkLabelMapOverlayImageFilter.h"
int
main(int argc, char * argv[])
{
if (argc != 4)
{
std::cerr << "Usage: " << std::endl;
std::cerr << argv[0];
std::cerr << " <InputFileName> <LabelMap> <OutputFileName>";
std::cerr << std::endl;
return EXIT_FAILURE;
}
const char * inputFileName = argv[1];
const char * labelFileName = argv[2];
const char * outputFileName = argv[3];
constexpr unsigned int Dimension = 2;
using PixelType = unsigned char;
using ImageType = itk::Image<PixelType, Dimension>;
const auto input = itk::ReadImage<ImageType>(inputFileName);
const auto label = itk::ReadImage<ImageType>(labelFileName);
using LabelType = PixelType;
using LabelObjectType = itk::LabelObject<LabelType, Dimension>;
using LabelMapType = itk::LabelMap<LabelObjectType>;
using ConverterType = itk::LabelImageToLabelMapFilter<ImageType, LabelMapType>;
auto converter = ConverterType::New();
converter->SetInput(label);
using FilterType = itk::LabelMapOverlayImageFilter<LabelMapType, ImageType>;
auto filter = FilterType::New();
filter->SetInput(converter->GetOutput());
filter->SetFeatureImage(input);
filter->SetOpacity(0.5);
try
{
itk::WriteImage(filter->GetOutput(), outputFileName);
}
catch (const itk::ExceptionObject & error)
{
std::cerr << "Error: " << error << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
Classes demonstrated#
-
template<typename TLabelMap, typename TFeatureImage, typename TOutputImage = Image<RGBPixel<typename TFeatureImage::PixelType>, TFeatureImage::ImageDimension>>
class LabelMapOverlayImageFilter : public itk::LabelMapFilter<TLabelMap, TOutputImage> Apply a colormap to a label map and superimpose it on an image.
Apply a colormap to a label map and put it on top of the feature image. The feature image is typically the image from which the labeling was produced. Use the SetInput function to set the LabelMap, and the SetFeatureImage function to set the feature image.
The set of colors is a good selection of distinct colors. The opacity of the label map can be defined by the user. A background label produce a gray pixel with the same intensity than the input one.
This implementation was taken from the Insight Journal paper:
https://www.insight-journal.org/browse/publication/176- Author
Gaetan Lehmann. Biologie du Developpement et de la Reproduction, INRA de Jouy-en-Josas, France.
- See
LabelOverlayImageFilter, LabelOverlayFunctor
- See
LabelMapToRGBImageFilter, LabelMapToBinaryImageFilter, LabelMapToLabelImageFilter
- ITK Sphinx Examples: