]> Creatis software - FrontAlgorithms.git/blobdiff - appli/CTBronchi/Process.cxx
...
[FrontAlgorithms.git] / appli / CTBronchi / Process.cxx
index 8fb3e17bc3521ee5e5c88c0da9308b6700122a91..19d16d50edc716e60f7b1b88e5ea451cc983748e 100644 (file)
+// =========================================================================
+// @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$