From 026b2fe203089e1917ab78ebafb3131f147223f5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Leonardo=20Fl=C3=B3rez-Valencia?= Date: Sun, 6 Nov 2016 22:20:22 -0500 Subject: [PATCH] ... --- data/binary_test_2D_00.png | Bin 0 -> 5192 bytes data/ones_image.png | Bin 0 -> 1697 bytes data/workspaces/workspace_airwaysappli.wxml | 73 +++++++++++++++++ lib/fpa/Image/SkeletonFilter.hxx | 85 +++++++++++--------- plugins/CMakeLists.txt | 34 +++----- 5 files changed, 132 insertions(+), 60 deletions(-) create mode 100644 data/binary_test_2D_00.png create mode 100644 data/ones_image.png create mode 100644 data/workspaces/workspace_airwaysappli.wxml diff --git a/data/binary_test_2D_00.png b/data/binary_test_2D_00.png new file mode 100644 index 0000000000000000000000000000000000000000..fbe9d39bd59189ecf7f8ef87e48abde2f3d01953 GIT binary patch literal 5192 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 literal 0 HcmV?d00001 diff --git a/data/ones_image.png b/data/ones_image.png new file mode 100644 index 0000000000000000000000000000000000000000..f7afaab3a8241507fc085fd4450f6bfa393ef4db GIT binary patch literal 1697 zcmeAS@N?(olHy`uVBq!ia0y~yU{(NO4xj+TKk3LVK#H@#BeIx*fm;}a85w5HkpK#^ zmw5WRvftxo=F>J^eIwQZC?uO15>euupPQSSR|4cRFgO>bCYGe8D3oWGWGJ|M`Ua%v zrLr?Hu!(!RIEGZ*dV6^zF9QR|VS`iu-M=%HvHfoG@MPPuh9yD3fJ1_Xhl!1`xxw*( zLV^GY6B2@`L{Wty!~iu9Nfm|=1Kd`)Dl9@Cm|{roh3Ui)Lh%(u6^0N@Gm={|gfN1` zfCE#gV>BR<6A>s7M*|X(sUTs2k^Fd=FoZBdZ8RVmN3%A#WQHdV%<{0A#4_?jG~?Ve VY>s=^oN@!z9iFa!F6*2UngGDBTyX#Z literal 0 HcmV?d00001 diff --git a/data/workspaces/workspace_airwaysappli.wxml b/data/workspaces/workspace_airwaysappli.wxml new file mode 100644 index 0000000..9b80164 --- /dev/null +++ b/data/workspaces/workspace_airwaysappli.wxml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/fpa/Image/SkeletonFilter.hxx b/lib/fpa/Image/SkeletonFilter.hxx index fa78819..010c694 100644 --- a/lib/fpa/Image/SkeletonFilter.hxx +++ b/lib/fpa/Image/SkeletonFilter.hxx @@ -3,6 +3,7 @@ #include #include +#include // ------------------------------------------------------------------------- #define fpa_Image_SkeletonFilter_InputMacro( i_n, i_t, i_i ) \ @@ -107,6 +108,7 @@ GenerateData( ) // 2. Detect end-points this->_EndPoints( dmap, cmap, mst, ep->Get( ) ); + std::cout << "endpoints" << std::endl; // 3. Build skeleton and keep track of bifurcations this->_Skeleton( dmap, cmap, mst, ep->Get( ), bi->Get( ), sk ); @@ -126,10 +128,11 @@ _EndPoints( typedef itk::ImageRegionConstIteratorWithIndex< _TCostMap > _TCostMapIt; typedef std::multimap< double, TIndex, std::greater< double > > _TQueue; typedef typename _TQueue::value_type _TQueueValue; - typedef itk::Image< unsigned char, _TCostMap::ImageDimension > _TMarks; + typedef itk::ImageRegionIteratorWithIndex< TMarks > _TMarksIt; + + static const double _eps = std::sqrt( double( TMarks::ImageDimension + 1 ) ); // Some values - // typename _TMarks::Pointer marks = _TMarks::New( ); auto marks = this->GetMarks( ); marks->SetLargestPossibleRegion( dmap->GetLargestPossibleRegion( ) ); marks->SetRequestedRegion( dmap->GetRequestedRegion( ) ); @@ -149,7 +152,7 @@ _EndPoints( for( ; !dIt.IsAtEnd( ) && !cIt.IsAtEnd( ); ++dIt, ++cIt ) { double d = double( dIt.Get( ) ); - if( d > 0 ) + if( d > double( 0 ) ) { double v = double( cIt.Get( ) ) / ( d * d ); queue.insert( _TQueueValue( v, dIt.GetIndex( ) ) ); @@ -169,16 +172,18 @@ _EndPoints( queue.erase( nIt ); unsigned char m = marks->GetPixel( n.second ); - // if( ( m & 0x01 ) == 0x01 ) - if( m != 0 || ( n.first / init_v ) < double( 1e-1 ) ) + if( m != 0 ) continue; + std::cout << queue.size( ) << std::endl; + // Mark it and update end-points m |= 0x01; marks->SetPixel( n.second, m ); end_points.insert( n.second ); - // Get path + // Mark path + auto spac = marks->GetSpacing( ); typename TMST::TPath::Pointer path; mst->GetPath( path, n.second ); for( unsigned long i = 0; i < path->GetSize( ); ++i ) @@ -186,41 +191,43 @@ _EndPoints( TIndex idx = path->GetVertex( i ); typename _TCostMap::PointType cnt; cmap->TransformIndexToPhysicalPoint( idx, cnt ); - double d = double( 2 ) * double( dmap->GetPixel( idx ) ); + double r = double( dmap->GetPixel( idx ) ) * _eps; + + TIndex i0, i1; + for( unsigned int d = 0; d < TMarks::ImageDimension; ++d ) + { + long off = long( std::ceil( r / double( spac[ d ] ) ) ); + if( off == 0 ) + off = 1; + i0[ d ] = idx[ d ] - off; + i1[ d ] = idx[ d ] + off; + + if( i0[ d ] < region.GetIndex( )[ d ] ) + i0[ d ] = region.GetIndex( )[ d ]; - // Mark sphere - std::queue< TIndex > q; - q.push( idx ); - while( q.size( ) > 0 ) + if( i1[ d ] >= region.GetIndex( )[ d ] + region.GetSize( )[ d ] ) + i1[ d ] = region.GetIndex( )[ d ] + region.GetSize( )[ d ] - 1; + + } // rof + + typename TMarks::SizeType size; + for( unsigned int d = 0; d < TMarks::ImageDimension; ++d ) + size[ d ] = i1[ d ] - i0[ d ] + 1; + + typename TMarks::RegionType neighRegion; + neighRegion.SetIndex( i0 ); + neighRegion.SetSize( size ); + + _TMarksIt mIt( marks, neighRegion ); + for( mIt.GoToBegin( ); !mIt.IsAtEnd( ); ++mIt ) { - TIndex v = q.front( ); - q.pop( ); - unsigned char m = marks->GetPixel( v ); - if( ( m & 0x02 ) == 0x02 ) - continue; - m |= 0x02; - marks->SetPixel( v, m ); - - for( unsigned int x = 0; x < _TCostMap::ImageDimension; ++x ) - { - for( int y = -1; y <= 1; y += 2 ) - { - TIndex w = v; - w[ x ] += y; - if( region.IsInside( w ) ) - { - typename _TCostMap::PointType p; - cmap->TransformIndexToPhysicalPoint( w, p ); - if( cnt.EuclideanDistanceTo( p ) <= d ) - q.push( w ); - - } // fi - - } // rof - - } // rof - - } // elihw + TIndex w = mIt.GetIndex( ); + typename _TCostMap::PointType p; + marks->TransformIndexToPhysicalPoint( w, p ); + if( cnt.EuclideanDistanceTo( p ) <= r ) + mIt.Set( mIt.Get( ) | 0x02 ); + + } // rof } // rof diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index bbc5d32..36271c8 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -2,26 +2,18 @@ ## == Build plugin library == ## ========================== -INCLUDE_DIRECTORIES( - ${PROJECT_SOURCE_DIR}/lib - ${PROJECT_BINARY_DIR}/lib - ) -CreatePlugin(fpaPlugins Plugins ${cpPlugins_CONFIG_NUMBER_OF_FILES}) -TARGET_LINK_LIBRARIES( - fpaPlugins - cpPlugins cpExtensions - ${cpPlugins_Instances} - ${fpa_Instances} - ) - -#IF(USE_cpPlugins) -# Wrap_cpPlugins( -# _plugin -# ${CMAKE_CURRENT_SOURCE_DIR}/Plugins -# ${prj_VERSION} ${prj_SHORT_VERSION} -# fpa -# ) -# TARGET_LINK_LIBRARIES(${_plugin} ${VTK_LIBRARIES} ${cpPlugins_LIB} ${cpPlugins_ImageIterators_LIB} ${fpa_Instances}) -#ENDIF(USE_cpPlugins) +IF(USE_cpPlugins) + INCLUDE_DIRECTORIES( + ${PROJECT_SOURCE_DIR}/lib + ${PROJECT_BINARY_DIR}/lib + ) + CreatePlugin(fpaPlugins Plugins ${cpPlugins_CONFIG_NUMBER_OF_FILES}) + TARGET_LINK_LIBRARIES( + fpaPlugins + cpPlugins cpExtensions + ${cpPlugins_Instances} + ${fpa_Instances} + ) +ENDIF(USE_cpPlugins) ## eof - $RCSfile$ \ No newline at end of file -- 2.46.1