// Example implementation of the confidence connected region growing algorithm // using the Insight Toolkit // // Based off Examples/Segmentatoin/ConfidenceConnected.cxx // Extended to be used with 3-D image data // // Matt Edman // #if defined(_MSC_VER) #pragma warning ( disable : 4786 ) #endif #ifdef __BORLANDC__ #define ITK_LEAN_AND_MEAN #endif #include "itkConfidenceConnectedImageFilter.h" #include "itkImage.h" #include "itkCastImageFilter.h" #include "itkCurvatureFlowImageFilter.h" #include "itkImageFileReader.h" #include "itkImageFileWriter.h" // Define the constants most often tweaked in the algorithm #define SMOOTHING_ITERATIONS 5 #define SMOOTHING_TIMESTEP 0.125 #define CONFIDENCE_NEIGHBORHOOD 2 #define CONFIDENCE_ITERATIONS 2 int main(int argc, char *argv[]) { // Ensure we received the corrent number of arguments if (argc < 7) { std::cerr << "Missing parameters" << std::endl; std::cerr << "Usage: " << argv[0]; std::cerr << " inputImage outputImage seedX seedY seedZ multiplier" << std::endl; return 1; } // Setup the dimensions and type of image we're dealing with typedef float InternalPixelType; const unsigned int Dimension = 3; typedef itk::Image< InternalPixelType, Dimension > InternalImageType; typedef unsigned char OutputPixelType; typedef itk::Image< OutputPixelType, Dimension > OutputImageType; typedef itk::CastImageFilter< InternalImageType, OutputImageType > CastingFilterType; CastingFilterType::Pointer caster = CastingFilterType::New(); // Set up the input reader and output writer using the given command // line arguments typedef itk::ImageFileReader< InternalImageType > ReaderType; typedef itk::ImageFileWriter< OutputImageType > WriterType; ReaderType::Pointer reader = ReaderType::New(); WriterType::Pointer writer = WriterType::New(); reader->SetFileName(argv[1]); writer->SetFileName(argv[2]); // Construct a image smoothing filter typedef itk::CurvatureFlowImageFilter< InternalImageType, InternalImageType > CurvatureFlowImageFilterType; CurvatureFlowImageFilterType::Pointer smoothing = CurvatureFlowImageFilterType::New(); smoothing->SetNumberOfIterations(SMOOTHING_ITERATIONS); smoothing->SetTimeStep(SMOOTHING_TIMESTEP); // Construct the confidence connected filter typedef itk::ConfidenceConnectedImageFilter< InternalImageType, InternalImageType > ConnectedFilterType; ConnectedFilterType::Pointer confidenceConnected = ConnectedFilterType::New(); // Set up the pipeline smoothing->SetInput(reader->GetOutput()); confidenceConnected->SetInput(smoothing->GetOutput()); caster->SetInput(confidenceConnected->GetOutput()); writer->SetInput(caster->GetOutput()); // Specify our starting seed point and initiall neighborhood InternalImageType::IndexType index; index[0] = atoi(argv[3]); index[1] = atoi(argv[4]); index[2] = atoi(argv[5]); confidenceConnected->SetSeed(index); confidenceConnected->SetMultiplier(atof(argv[6])); confidenceConnected->SetInitialNeighborhoodRadius(CONFIDENCE_NEIGHBORHOOD); confidenceConnected->SetNumberOfIterations(CONFIDENCE_ITERATIONS); confidenceConnected->SetReplaceValue(255); // White pixels // Try to execute the filter or catch any thrown exceptions try { writer->Update(); } catch(itk::ExceptionObject &ex) { std::cerr << "Exception caught !" << std::endl; std::cerr << ex << std::endl; return 1; } return 0; }