Extract Inner and Outer Boundaries of Blobs in Binary Image#
Synopsis#
Extract the inner and outer boundaries of blobs in a binary image.
Results#
Code#
C++#
#include "itkImage.h"
#include "itkInvertIntensityImageFilter.h"
#include "itkBinaryContourImageFilter.h"
#include "itkRescaleIntensityImageFilter.h"
#ifdef ENABLE_QUICKVIEW
# include "QuickView.h"
#endif
using ImageType = itk::Image<unsigned char, 2>;
static void
CreateImage(ImageType::Pointer image);
int
main()
{
auto image = ImageType::New();
CreateImage(image);
using binaryContourImageFilterType = itk::BinaryContourImageFilter<ImageType, ImageType>;
// Outer boundary
auto binaryContourFilter = binaryContourImageFilterType::New();
binaryContourFilter->SetInput(image);
binaryContourFilter->SetForegroundValue(0);
binaryContourFilter->SetBackgroundValue(255);
binaryContourFilter->Update();
// Invert the result
using InvertIntensityImageFilterType = itk::InvertIntensityImageFilter<ImageType>;
auto invertIntensityFilter = InvertIntensityImageFilterType::New();
invertIntensityFilter->SetInput(binaryContourFilter->GetOutput());
invertIntensityFilter->Update();
auto outerBoundary = ImageType::New();
outerBoundary->Graft(invertIntensityFilter->GetOutput());
// Inner boundary
binaryContourFilter->SetForegroundValue(255);
binaryContourFilter->SetBackgroundValue(0);
binaryContourFilter->Update();
#ifdef ENABLE_QUICKVIEW
QuickView viewer;
viewer.AddImage(image.GetPointer());
viewer.AddImage(outerBoundary.GetPointer());
viewer.AddImage(binaryContourFilter->GetOutput());
viewer.Visualize();
#endif
return EXIT_SUCCESS;
}
void
CreateImage(ImageType::Pointer image)
{
ImageType::IndexType start;
start.Fill(0);
ImageType::SizeType size;
size.Fill(20);
ImageType::RegionType region(start, size);
image->SetRegions(region);
image->Allocate();
image->FillBuffer(0);
// Make a square
for (unsigned int r = 5; r < 10; ++r)
{
for (unsigned int c = 5; c < 10; ++c)
{
ImageType::IndexType pixelIndex;
pixelIndex[0] = r;
pixelIndex[1] = c;
image->SetPixel(pixelIndex, 255);
}
}
}
Classes demonstrated#
-
template<typename TInputImage, typename TOutputImage>
class BinaryContourImageFilter : public itk::InPlaceImageFilter<TInputImage, TOutputImage>, protected itk::ScanlineFilterCommon<TInputImage, TOutputImage> Labels the pixels on the border of the objects in a binary image.
BinaryContourImageFilter takes a binary image as input, where the pixels in the objects are the pixels with a value equal to ForegroundValue. Only the pixels on the contours of the objects are kept. The pixels not on the border are changed to BackgroundValue.
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
LabelContourImageFilter BinaryErodeImageFilter SimpleContourExtractorImageFilter
- ITK Sphinx Examples: