+// =========================================================================
+// @author Leonardo Florez Valencia
+// @email florez-l@javeriana.edu.co
+// =========================================================================
+
+#include <itkImage.h>
+#include <itkAbsoluteValueDifferenceImageFilter.h>
+#include <itkBinaryThresholdImageFilter.h>
+#include <CTBronchi/Functions.h>
+#include <CTBronchi/Mori.h>
+#include <CTBronchi/MoriLabelling.h>
+#include <CTBronchi/RandomWalker.h>
+
+// -------------------------------------------------------------------------
+const unsigned int Dim = 3;
+typedef short TInputPixel;
+typedef unsigned char TLabelPixel;
+typedef itk::Image< TInputPixel, Dim > TImage;
+typedef itk::Image< TLabelPixel, Dim > TLabelImage;
+
+// -------------------------------------------------------------------------
int main( int argc, char* argv[] )
{
- /* TODO
- -input input_raw_image
- -seed x y z
- [-mori mori_image_dfilename]
- [-labels labels_image_filename]
- [-output output_image_filename]
- */
-
- /* TODO
- if [ -z "$mori_init_threshold" ]; then mori_init_threshold="-1024"; fi
- if [ -z "$mori_end_threshold" ]; then mori_end_threshold="0"; fi
- if [ -z "$mori_delta" ]; then mori_delta="1"; fi
- if [ -z "$mori_minimum_threshold" ]; then mori_minimum_threshold="-850"; fi
- if [ -z "$mori_inside_value" ]; then mori_inside_value="255"; fi
- if [ -z "$mori_outside_value" ]; then mori_outside_value="0"; fi
- if [ -z "$mori_signal_kernel_size" ]; then mori_signal_kernel_size="20"; fi
- if [ -z "$mori_signal_threshold" ]; then mori_signal_threshold="500"; fi
- if [ -z "$mori_signal_influence" ]; then mori_signal_influence="0.5"; fi
- if [ -z "$label_upper_threshold" ]; then label_upper_threshold="-600"; fi
- if [ -z "$label_inside" ]; then label_inside="1"; fi
- if [ -z "$label_outside" ]; then label_outside="2"; fi
- if [ -z "$random_walker_beta" ]; then random_walker_beta="20"; fi
- */
-
- return( 0 );
+ std::map< std::string, std::string > args;
+ try
+ {
+ if( CTBronchi::ParseArgs( args, argc, argv ) )
+ {
+ // Parse seed
+ TImage::PointType seed;
+ char* str = new char[ args[ "seed" ].size( ) + 1 ];
+ strcpy( str, args[ "seed" ].c_str( ) );
+ seed[ 0 ] = std::atof( strtok( str, ";" ) );
+ seed[ 1 ] = std::atof( strtok( NULL, ";" ) );
+ seed[ 2 ] = std::atof( strtok( NULL, ";" ) );
+
+ // Read input image
+ TImage::Pointer input_image;
+ CTBronchi::ReadImage( input_image, args[ "in" ] );
+
+ // Mori segmentation
+ TLabelImage::Pointer mori;
+ TInputPixel opt_thr = CTBronchi::Mori( mori, input_image, seed, args );
+
+ // Label image
+ TLabelImage::Pointer labels;
+ CTBronchi::Label( labels, input_image, mori, opt_thr, args );
+
+ // Final labels
+ TLabelImage::Pointer final_labels;
+ CTBronchi::RandomWalker( final_labels, input_image, labels, args );
+
+ // Extract label 1
+ typedef itk::BinaryThresholdImageFilter< TLabelImage, TLabelImage > TBinThr;
+ TBinThr::Pointer bin_thr = TBinThr::New( );
+ bin_thr->SetInput( final_labels );
+ bin_thr->SetLowerThreshold( 1 );
+ bin_thr->SetUpperThreshold( 1 );
+ bin_thr->SetInsideValue( 1 );
+ bin_thr->SetOutsideValue( 0 );
+ double t = CTBronchi::MeasureTime( bin_thr );
+ std::cout << "Label extracted in " << t << " s" << std::endl;
+ TLabelImage::Pointer segmentation = bin_thr->GetOutput( );
+
+ // Save
+ CTBronchi::WriteImage( segmentation, args[ "out" ] );
+
+ // Save difference
+ std::map< std::string, std::string >::const_iterator i =
+ args.find( "out_diff" );
+ if( i != args.end( ) )
+ {
+ typedef itk::AbsoluteValueDifferenceImageFilter< TLabelImage, TLabelImage, TLabelImage > TDiff;
+ TDiff::Pointer diff = TDiff::New( );
+ diff->SetInput1( mori );
+ diff->SetInput2( segmentation );
+ t = CTBronchi::MeasureTime( diff );
+ std::cout << "Difference computed in " << t << " s" << std::endl;
+ TLabelImage::Pointer difference = diff->GetOutput( );
+ CTBronchi::WriteImage( difference, i->second );
+
+ } // fi
+ }
+ else
+ return( 1 );
+ }
+ catch( std::exception& err )
+ {
+ std::cerr
+ << "===============================" << std::endl
+ << "Error caught: " << std::endl
+ << err.what( )
+ << "===============================" << std::endl
+ << std::endl;
+ return( 1 );
+
+ } // yrt
+ return( 0 );
}
+
+// eof - $RCSfile$