int
main(int argc, char * argv[])
{
  if (argc < 4)
  {
    std::cerr << "Usage: " << std::endl;
    std::cerr << argv[0] << "  inputImageFile  ";
    std::cerr << " outputImageFile radius " << std::endl;
    return EXIT_FAILURE;
  }
 
  
  
  
  
  constexpr unsigned int Dimension = 2;
 
  using PixelType = unsigned char;
  using WritePixelType = unsigned char;
 
  
 
  
  using StructuringElementType =
  
  using OpeningFilterType =
                                                  ImageType,
                                                  StructuringElementType>;
  using ClosingFilterType =
                                                  ImageType,
                                                  StructuringElementType>;
  
  using AdditionFilterType =
  using SubtractionFilterType = itk::
    ConstrainedValueDifferenceImageFilter<ImageType, ImageType, ImageType>;
  
  using RescaleFilterType =
 
  
  StructuringElementType structuringElement;
  
  structuringElement.
SetRadius(std::stoi(argv[3]));
  structuringElement.CreateStructuringElement();
 
  
  auto reader = ReaderType::New();
  reader->SetFileName(argv[1]);
  auto writer = WriterType::New();
  writer->SetFileName(argv[2]);
 
  
  try
  {
    reader->Update();
  }
  {
    std::cout << "Problems reading input image" << std::endl;
    std::cerr << "ExceptionObject caught !" << std::endl;
    std::cerr << err << std::endl;
    return EXIT_FAILURE;
  }
 
  
  auto opening = OpeningFilterType::New();
  auto closing = ClosingFilterType::New();
  
  opening->SetKernel(structuringElement);
  closing->SetKernel(structuringElement);
  
  auto rescaleFilter = RescaleFilterType::New();
  rescaleFilter->SetOutputMinimum(0);
  rescaleFilter->SetOutputMaximum(255);
  
  
  opening->SetInput(reader->GetOutput());
  closing->SetInput(reader->GetOutput());
  auto topHat = SubtractionFilterType::New();
  topHat->SetInput1(reader->GetOutput());
  topHat->SetInput2(opening->GetOutput());
  auto bottomHat = SubtractionFilterType::New();
  bottomHat->SetInput1(closing->GetOutput());
  bottomHat->SetInput2(reader->GetOutput());
  auto internalAddition = AdditionFilterType::New();
  internalAddition->SetInput1(reader->GetOutput());
  internalAddition->SetInput2(topHat->GetOutput());
 
  auto imageEnhancement = SubtractionFilterType::New();
  imageEnhancement->SetInput1(internalAddition->GetOutput());
  imageEnhancement->SetInput2(bottomHat->GetOutput());
  rescaleFilter->SetInput(imageEnhancement->GetOutput());
  writer->SetInput(rescaleFilter->GetOutput());
  try
  {
    writer->Update();
  }
  {
    std::cout << "ExceptionObject caught !" << std::endl;
    std::cout << err << std::endl;
    return EXIT_FAILURE;
  }
  return EXIT_SUCCESS;
}
A Neighborhood that represents a ball structuring element (ellipsoid) with binary elements.
Implements pixel-wise the computation of constrained value addition.
Standard exception handling object.
Grayscale closing of an image.
Grayscale opening of an image.
Data source that reads image data from a single file.
Writes image data to a single file.
Templated n-dimensional image class.
void SetRadius(const RadiusType &radius) override
Applies a linear transformation to the intensity levels of the input Image.