Crop Image by Specifying Region#

Synopsis#

Crop an image by specifying the region to throw away.

Results#

../../../../_images/CropImageBySpecifyingRegion2.png

Output In VTK Window#

Code#

C++#

#include "itkImage.h"
#include "itkImageFileWriter.h"
#include "itkImageFileReader.h"
#include "itkCropImageFilter.h"

#include "itksys/SystemTools.hxx"

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

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

static void
CreateImage(ImageType::Pointer image);

int
main(int argc, char * argv[])
{
  auto                image = ImageType::New();
  ImageType::SizeType cropSize;
  std::stringstream   desc;

  if (argc > 1)
  {
    image = itk::ReadImage<ImageType>(argv[1]);
    if (argc > 2)
    {
      cropSize[0] = std::stoi(argv[2]);
      cropSize[1] = std::stoi(argv[3]);
    }
    desc << itksys::SystemTools::GetFilenameName(argv[1]);
  }
  else
  {
    CreateImage(image);
    cropSize[0] = 10;
    cropSize[1] = 14;
    desc << "Synthetic image";
  }

  using CropImageFilterType = itk::CropImageFilter<ImageType, ImageType>;

  auto cropFilter = CropImageFilterType::New();
  cropFilter->SetInput(image);
  // The SetBoundaryCropSize( cropSize ) method specifies the size of
  // the boundary to be cropped at both the uppper & lower ends of the
  // image eg. cropSize pixels will be removed at both upper & lower
  // extents

  cropFilter->SetBoundaryCropSize(cropSize);

  // The below two lines are equivalent to the above line:
  // cropFilter->SetUpperBoundaryCropSize(cropSize);
  // cropFilter->SetLowerBoundaryCropSize(cropSize);

#ifdef ENABLE_QUICKVIEW
  QuickView viewer;
  viewer.AddRGBImage(image.GetPointer(), true, desc.str());

  std::stringstream desc2;
  desc2 << "CropImageFilter, crop size = {" << cropSize[0] << ", " << cropSize[1] << "}";
  viewer.AddRGBImage(cropFilter->GetOutput(), true, desc2.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();
  image->FillBuffer(itk::NumericTraits<ImageType::PixelType>::ZeroValue());

  PixelType rgbPixel;
  rgbPixel[0] = 200;
  rgbPixel[1] = 200;
  rgbPixel[2] = 200;

  // Make a rectangle, centered at (100,150) with sides 160 & 240
  // This provides a 20 x 30 border around the square for the crop filter to remove
  for (unsigned int r = 20; r < 180; ++r)
  {
    for (unsigned int c = 30; c < 270; ++c)
    {
      ImageType::IndexType pixelIndex;
      pixelIndex[0] = r;
      pixelIndex[1] = c;

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

Classes demonstrated#

template<typename TInputImage, typename TOutputImage>
class CropImageFilter : public itk::ExtractImageFilter<TInputImage, TOutputImage>

Decrease the image size by cropping the image by an itk::Size at both the upper and lower bounds of the largest possible region.

CropImageFilter changes the image boundary of an image by removing pixels outside the target region. The target region is not specified in advance, but calculated in BeforeThreadedGenerateData().

This filter uses ExtractImageFilter to perform the cropping.

ITK Sphinx Examples:

See itk::CropImageFilter for additional documentation.