]> Creatis software - FrontAlgorithms.git/commitdiff
...
authorLeonardo Florez-Valencia <florez-l@javeriana.edu.co>
Mon, 27 Nov 2017 03:02:11 +0000 (22:02 -0500)
committerLeonardo Florez-Valencia <florez-l@javeriana.edu.co>
Mon, 27 Nov 2017 03:02:11 +0000 (22:02 -0500)
appli/CTBronchi/CMakeLists.txt
appli/CTBronchi/Process.sh
appli/CTBronchi/Skeleton.cxx [new file with mode: 0644]
lib/fpa/Filters/Image/ExtractSkeleton.h
lib/fpa/Filters/Image/ExtractSkeleton.hxx

index 5f10a8ed58718c72f11c32b167c756aeafe2d205..b5f19be277946146496cb99752650b68e4474036 100644 (file)
@@ -13,6 +13,7 @@ if(fpa_BUILD_CTBronchi)
     FastRandomWalker
     SliceBySliceRandomWalker
     AndSegmentations
+    Skeleton
     )
   foreach(_e ${_examples})
     BuildApplication(
index 618a3bc7cc8c4bfabb7d180435aa1cab02f34cf7..5f4220241880dff433df891707f02219dc832a80 100755 (executable)
@@ -2,6 +2,7 @@
 
 ## -- Command line options
 curr_dir=`dirname $0`
+ext="mhd"
 vesselness_sigma="0.5"
 vesselness_alpha1="0.5"
 vesselness_alpha2="2"
@@ -13,7 +14,7 @@ mori_lower="-1024"
 mori_upper="0"
 mori_delta="1"
 slice_by_slice_vesselness_thr="5"
-labels_vesselness_thr="65"
+fast_vesselness_thr="65"
 labels_upper_thr="-400"
 beta="2.5"
 epsilon="1e-5"
@@ -111,14 +112,17 @@ if [ -z "$input" ] || [ -z "$seed" ] ; then
 fi
 
 base_dir=`dirname $input | xargs realpath`
-base_name=$base_dir/`basename $input .mha`
+base_name=$base_dir/`basename $input .$ext`
 
-vesselness=$base_name"_vesselness.mha"
-mori=$base_name"_mori.mha"
+vesselness=$base_name"_vesselness.$ext"
+mori=$base_name"_mori.$ext"
 mori_signal=$base_name"_mori_signal.txt"
-labels=$base_name"_labels.mha"
-fastrw=$base_name"_fastrw.mha"
-slicerw=$base_name"_slicerw.mha"
+labels=$base_name"_labels.$ext"
+fastrw=$base_name"_fastrw.$ext"
+slicerw=$base_name"_slicerw.$ext"
+skeleton_fastrw=$base_name"_fastrw_skeleton.txt"
+skeleton_slicerw=$base_name"_slicerw_skeleton.txt"
+points=$base_name"_points.txt"
 
 echo "************************************************"
 (>&2 echo "Processing $input... ")
@@ -173,6 +177,14 @@ if [ ! -f $slicerw ] || [ -n "$force" ] ; then
         -b $beta \
         -e $epsilon
 fi
+
+if [ ! -f $skeleton_slicerw ] || [ -n "$force" ] ; then
+    $curr_dir/fpa_CTBronchi_Skeleton \
+        -i $slicerw \
+        -o $skeleton_slicerw \
+        -e $points \
+        -p "$seed"
+fi
 (>&2 echo "done.")
 echo "done."
 echo "************************************************"
diff --git a/appli/CTBronchi/Skeleton.cxx b/appli/CTBronchi/Skeleton.cxx
new file mode 100644 (file)
index 0000000..4110825
--- /dev/null
@@ -0,0 +1,119 @@
+// =========================================================================
+// @author Leonardo Florez Valencia
+// @email florez-l@javeriana.edu.co
+// =========================================================================
+
+#include <sstream>
+#include <string>
+#include <tclap/CmdLine.h>
+#include <itkImage.h>
+#include <ivq/ITK/ImageSkeletonWriter.h>
+#include <fpa/Filters/Image/ExtractSkeleton.h>
+#include "Functions.h"
+
+// -------------------------------------------------------------------------
+const unsigned int Dim = 3;
+typedef unsigned char             TPixel;
+typedef itk::Image< TPixel, Dim > TImage;
+
+// -------------------------------------------------------------------------
+int main( int argc, char* argv[] )
+{
+  typedef TCLAP::ValueArg< std::string >   _TStringArg;
+  typedef TCLAP::ValueArg< double >        _TRealArg;
+  typedef TCLAP::ValueArg< unsigned long > _TUIntArg;
+  typedef TCLAP::ValueArg< TPixel >        _TPixelArg;
+
+  // Parse input line
+  _TStringArg in( "i", "input", "Input image", true, "", "file" );
+  _TStringArg out( "o", "output", "Output skeleton", true, "", "file" );
+  _TStringArg oute( "e", "end_points", "Output end points", false, "", "file" );
+  _TStringArg aSeed( "p", "seed", "Input seed", true, "", "\"x y z\"" );
+  try
+  {
+    TCLAP::CmdLine cmd( "Skeleton", ' ', "1.0.0" );
+    cmd.add( aSeed );
+    cmd.add( oute );
+    cmd.add( out );
+    cmd.add( in );
+    cmd.parse( argc, argv );
+  }
+  catch( TCLAP::ArgException& err )
+  {
+    std::cerr
+      << "===============================" << std::endl
+      << "Error caught: " << std::endl
+      << err.error( ) << " " << err.argId( )
+      << "===============================" << std::endl
+      << std::endl;
+    return( 1 );
+
+  } // yrt
+
+  // Get seed
+  std::istringstream sSeed( aSeed.getValue( ) );
+  TImage::PointType pnt;
+  sSeed >> pnt[ 0 ] >> pnt[ 1 ] >> pnt[ 2 ];
+
+  try
+  {
+    // Read image
+    TImage::Pointer input_image;
+    CTBronchi::ReadImage( input_image, in.getValue( ) );
+
+    TImage::IndexType seed;
+    input_image->TransformPhysicalPointToIndex( pnt, seed );
+
+    // Skeleton extraction
+    typedef fpa::Filters::Image::ExtractSkeleton< TImage > TFilter;
+    TFilter::Pointer filter = TFilter::New( );
+    filter->SetInput( input_image );
+    filter->SeedFromMaximumDistanceOff( );
+    filter->SetSeed( seed );
+    filter->GetDistanceMap( )->InsideIsPositiveOn( );
+    filter->GetDistanceMap( )->SquaredDistanceOff( );
+    filter->GetDistanceMap( )->UseImageSpacingOn( );
+    double t = CTBronchi::MeasureTime( filter );
+    std::cout << "Skeleton executed in " << t << " s" << std::endl;
+
+    // Save results
+    typedef ivq::ITK::ImageSkeletonWriter< TFilter::TSkeleton > TWriter;
+    TWriter::Pointer skeleton_writer = TWriter::New( );
+    skeleton_writer->SetInput( filter->GetOutput( ) );
+    skeleton_writer->SetFileName( out.getValue( ) );
+    skeleton_writer->Update( );
+
+    // Write end points
+    if( oute.getValue( ) != "" )
+    {
+      std::stringstream eStr;
+      auto pnts = filter->GetEndPoints( );
+      for( unsigned int i = 0; i < 10; ++i )
+      {
+        eStr
+          << pnts[ i ][ 0 ] << " "
+          << pnts[ i ][ 1 ] << " "
+          << pnts[ i ][ 2 ] << " " << i % 3 << std::endl;
+
+      } // rof
+      std::ofstream oStrE( oute.getValue( ).c_str( ) );
+      oStrE << eStr.str( );
+      oStrE.close( );
+
+    } // fi
+  }
+  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$
index 9e7f948f0e736aa9fdba01b4fbe9346986f87959..231240305d0e55cb4a9070826dfed1b7ebd901d5 100644 (file)
@@ -97,6 +97,8 @@ namespace fpa
         itkGetConstMacro( Seed, TIndex );
         itkSetMacro( Seed, TIndex );
 
+        itkGetConstMacro( EndPoints, std::vector< TIndex > );
+
       public:
         virtual itk::ModifiedTimeType GetMTime( ) const override;
 
@@ -136,6 +138,7 @@ namespace fpa
         typename TDistanceMap::Pointer m_DistanceMap;
         bool   m_SeedFromMaximumDistance;
         TIndex m_Seed;
+        std::vector< TIndex >  m_EndPoints;
       };
 
     } // ecapseman
index 38b3df41fb9b69e7f2aac6eca9e233fa5cb8003d..5904cd45e574d448c287d79742dd583982ddc899 100644 (file)
@@ -172,6 +172,7 @@ GenerateData( )
     end_points, this->m_DistanceMap->GetOutput( ),
     mst, dijkstra->GetSkeletonQueue( )
     );
+  this->m_EndPoints = end_points;
 
   // Compute symbolic branches
   typedef std::map< TIndex, TIndex, typename TIndex::LexicographicCompare > _TTags;