3 #include <itkImageFileReader.h>
4 #include <itkImageFileWriter.h>
6 #include <fpa/Image/RandomWalker.h>
7 #include <fpa/Image/Functors/Dijkstra/Gaussian.h>
8 #include <ivq/ITK/ExtractLabelFunction.h>
9 #include <ivq/ITK/ImageUnaryFunctionFilter.h>
11 // -------------------------------------------------------------------------
12 const unsigned int Dim = 3;
14 typedef unsigned short TLabel;
15 typedef unsigned char TBinary;
16 typedef double TScalar;
18 typedef itk::Image< TPixel, Dim > TInputImage;
19 typedef itk::Image< TLabel, Dim > TLabelImage;
20 typedef itk::Image< TBinary, Dim > TBinaryImage;
22 typedef fpa::Image::RandomWalker< TInputImage, TLabelImage, TScalar > TFilter;
23 typedef fpa::Image::Functors::Dijkstra::Gaussian< TInputImage, TScalar > TWeight;
25 typedef ivq::ITK::ExtractLabelFunction< TLabel, TBinary > TLabelFunction;
26 typedef ivq::ITK::ImageUnaryFunctionFilter< TLabelImage, TBinaryImage > TLabelExtractor;
28 // -------------------------------------------------------------------------
29 int main( int argc, char* argv[] )
35 << "Usage: " << argv[ 0 ] << std::endl
36 << " input_image label_image output_image" << std::endl
42 std::string input_image_filename = argv[ 1 ];
43 std::string label_image_filename = argv[ 2 ];
44 std::string output_image_filename = argv[ 3 ];
45 TLabel label = TLabel( std::atoi( argv[ 4 ] ) );
46 double beta = std::atof( argv[ 5 ] );
49 itk::ImageFileReader< TInputImage >::Pointer input_image_reader =
50 itk::ImageFileReader< TInputImage >::New( );
51 input_image_reader->SetFileName( input_image_filename );
53 itk::ImageFileReader< TLabelImage >::Pointer label_image_reader =
54 itk::ImageFileReader< TLabelImage >::New( );
55 label_image_reader->SetFileName( label_image_filename );
58 TWeight::Pointer weight = TWeight::New( );
59 weight->SetBeta( beta );
62 TFilter::Pointer filter = TFilter::New( );
63 filter->SetInput( input_image_reader->GetOutput( ) );
64 filter->SetLabels( label_image_reader->GetOutput( ) );
65 filter->SetWeightFunction( weight );
68 TLabelFunction::Pointer label_function = TLabelFunction::New( );
69 label_function->SetLabel( label );
70 label_function->SetInsideValue( 255 );
71 label_function->SetOutsideValue( 0 );
73 TLabelExtractor::Pointer label_extractor = TLabelExtractor::New( );
74 label_extractor->SetInput( filter->GetMarks( ) );
75 label_extractor->SetFunction( label_function );
78 // Show some information
79 std::cout << "----------------------------------------------" << std::endl;
80 std::cout << "Image: " << input_image_filename << std::endl;
83 std::chrono::time_point< std::chrono::high_resolution_clock > ts, te;
84 std::chrono::duration< double > tr;
87 ts = std::chrono::high_resolution_clock::now( );
88 input_image_reader->Update( );
89 te = std::chrono::high_resolution_clock::now( );
91 std::cout << "Raw read time: " << tr.count( ) << " s" << std::endl;
93 ts = std::chrono::high_resolution_clock::now( );
94 label_image_reader->Update( );
95 te = std::chrono::high_resolution_clock::now( );
97 std::cout << "Label read time: " << tr.count( ) << " s" << std::endl;
99 ts = std::chrono::high_resolution_clock::now( );
101 te = std::chrono::high_resolution_clock::now( );
104 << "Labelling time: " << tr.count( ) << " s" << std::endl;
106 ts = std::chrono::high_resolution_clock::now( );
107 label_extractor->Update( );
108 te = std::chrono::high_resolution_clock::now( );
111 << "Extract label time: " << tr.count( ) << " s" << std::endl;
113 catch( std::exception& err )
115 std::cerr << "Error caught: " << err.what( ) << std::endl;
121 itk::ImageFileWriter< TBinaryImage >::Pointer output_image_writer =
122 itk::ImageFileWriter< TBinaryImage >::New( );
123 output_image_writer->SetInput( label_extractor->GetOutput( ) );
124 output_image_writer->SetFileName( output_image_filename );
127 ts = std::chrono::high_resolution_clock::now( );
128 output_image_writer->Update( );
129 te = std::chrono::high_resolution_clock::now( );
131 std::cout << "Write time: " << tr.count( ) << " s" << std::endl;
133 catch( std::exception& err )
135 std::cerr << "Error caught: " << err.what( ) << std::endl;
139 std::cout << "----------------------------------------------" << std::endl;