/*============================================================================= Julio Lajara CSCI-4968 Open Source Software Practice Project 2: ITK Image Segmentation Purpose: Use ITK libraries to perform image segmentation on a brain data set in order to isolate the ventricles in the image. Compiler: MS Visual Studio 2005 =============================================================================*/ /*============================================================================= IMPORTED LIBRARIES =============================================================================*/ //Image Reading/Writing Libraries #include "itkImageFileReader.h" #include "itkImageFileWriter.h" //Image Segmentation and Processing Libraries #include "itkConnectedThresholdImageFilter.h" #include "itkCurvatureFlowImageFilter.h" #include "itkCastImageFilter.h" #include using std::stringstream; /*============================================================================= MAIN SEGMENTATION APPLICATION =============================================================================*/ int main(int argc, char* argv[]) { if(argc != 8) { using std::cerr; cerr << "Usage: " << argv[0] << " [input file] [output file] [lowerThreshold (int)] " << "[upperThreshold (int)] [seedIndex-x (float)] [seedIndex-y (float)] [seedIndex-z (float)]\n\n"; return EXIT_FAILURE; } stringstream strToDigBuf; //String to digit conversion buffer typedef float PixelTypef; //Float Image Pixel Type typedef unsigned short PixelTypei; //Integer Image Pixel Type const unsigned int Dim3D = 3; //3D Image Dimensions const unsigned int Dim2D = 2; //2D Image Dimensions typedef itk::Image< PixelTypef, Dim3D > ImageType3D; //3D Float Image typedef itk::Image< PixelTypef, Dim2D > ImageType2D; //2D Float Image typedef itk::Image< PixelTypei, Dim3D > ImageType3Di; //3D Integer Image typedef itk::Image< PixelTypei, Dim2D > ImageType2Di; //2D Interger Image typedef itk::ImageFileReader< ImageType3D > ReaderType3D; //3D Image Reader typedef itk::ImageFileWriter< ImageType3Di > WriterType3Di; //3Di Image Writer ReaderType3D::Pointer reader3D = ReaderType3D::New(); //Create 3D Image Reader WriterType3Di::Pointer writer3Di = WriterType3Di::New(); //Create 3D Image Writer typedef itk::CurvatureFlowImageFilter< ImageType3D, ImageType3D > CurvatureFlowImageFilterType3D; //Image Processing Filter typedef itk::ConnectedThresholdImageFilter< ImageType3D, ImageType3D > ConnectedFilterType3D; //Region Growing Filter typedef itk::CastImageFilter< ImageType3D, ImageType3Di > CastFilterType3D; //Pixel Type Cast Filter CurvatureFlowImageFilterType3D::Pointer smoothing3D = CurvatureFlowImageFilterType3D::New(); //Create Processing Filter ConnectedFilterType3D::Pointer connectedThreshold3D = ConnectedFilterType3D::New(); //Create Growing Filter CastFilterType3D::Pointer castFilter3D = CastFilterType3D::New(); //Create Pixel Type Cast Filter reader3D->SetFileName( argv[1] ); //Set read input file name writer3Di->SetFileName( argv[2] ); //Set write output file name smoothing3D->SetInput( reader3D->GetOutput() ); //Send image reader output into smoothing filter connectedThreshold3D->SetInput( smoothing3D->GetOutput() ); //Send smoothing filter output into growing filter castFilter3D->SetInput( connectedThreshold3D->GetOutput() ); //Send growing filter output into pixel cast filter writer3Di->SetInput( castFilter3D->GetOutput() ); //Send pixel cast filter output into image writer smoothing3D->SetNumberOfIterations( 10 ); //Smoothing Iterations for higher smoothness smoothing3D->SetTimeStep( 0.0625 ); //Delta Time step int lowerThreshold, upperThreshold; //Intensity threshold range strToDigBuf << argv[3] << " " << argv[4]; //Buffer intensity threshold range strToDigBuf >> lowerThreshold >> upperThreshold; //Convert intensity threshold range connectedThreshold3D->SetLower( lowerThreshold ); //Set growing filter lower threshold value connectedThreshold3D->SetUpper( upperThreshold ); //Set growing filter upper threshold value connectedThreshold3D->SetReplaceValue( 255 ); //Set threshold intensity value to highest possible float seedIndexX, seedIndexY, seedIndexZ; //Seed Index components strToDigBuf.clear(); //Reset buffer for reuse strToDigBuf.str(""); strToDigBuf << argv[5] << " " << argv[6] << " " << argv[7]; //Buffer seed index components strToDigBuf >> seedIndexX >> seedIndexY >> seedIndexZ; //Convert seed index components itk::Index<3> seedIndex3D = {seedIndexX, seedIndexY, seedIndexZ}; //Create the starting seed point index connectedThreshold3D->SetSeed( seedIndex3D ); //Set seed point index try { writer3Di->Update(); //Begin processing of pipeline } catch( itk::ExceptionObject & err ) //Catch error processing pipeline { using std::cerr; cerr << "Exception Thrown: " << err << "\n\n"; return EXIT_FAILURE; } return 0; }