From 5b7ed1fdb6665dd1ebc4451062a5032d75597e4a Mon Sep 17 00:00:00 2001 From: Leonardo Florez-Valencia Date: Wed, 24 Jun 2015 18:31:30 -0500 Subject: [PATCH] Minor bugs --- lib/fpa/Base/Functors/InvertCostFunction.h | 5 +- lib/fpa/Base/MinimumSpanningTree.h | 6 +++ lib/fpa/Base/MinimumSpanningTree.hxx | 53 ++++++++++++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/lib/fpa/Base/Functors/InvertCostFunction.h b/lib/fpa/Base/Functors/InvertCostFunction.h index faf4fb2..fa04ed4 100644 --- a/lib/fpa/Base/Functors/InvertCostFunction.h +++ b/lib/fpa/Base/Functors/InvertCostFunction.h @@ -29,7 +29,10 @@ namespace fpa public: virtual C Evaluate( const C& input ) const { - return( C( 1 ) / ( C( 1 ) + C( input ) ) ); + if( input < C( 0 ) ) + return( C( -1 ) / ( C( 1 ) + C( input ) ) ); + else + return( C( 1 ) / ( C( 1 ) + C( input ) ) ); } protected: diff --git a/lib/fpa/Base/MinimumSpanningTree.h b/lib/fpa/Base/MinimumSpanningTree.h index a020d47..4056267 100644 --- a/lib/fpa/Base/MinimumSpanningTree.h +++ b/lib/fpa/Base/MinimumSpanningTree.h @@ -56,6 +56,12 @@ namespace fpa std::vector< V >& path, const V& a, const V& b ) const; + template< class I, class P > + void GetPathFromImage( + std::vector< P >& path, const V& a, const V& b, + const I* image, unsigned int kernel = 0 + ) const; + protected: MinimumSpanningTree( ); virtual ~MinimumSpanningTree( ); diff --git a/lib/fpa/Base/MinimumSpanningTree.hxx b/lib/fpa/Base/MinimumSpanningTree.hxx index d932247..ad0d06b 100644 --- a/lib/fpa/Base/MinimumSpanningTree.hxx +++ b/lib/fpa/Base/MinimumSpanningTree.hxx @@ -149,6 +149,59 @@ GetPath( std::vector< V >& path, const V& a, const V& b ) const } // fi } +// ------------------------------------------------------------------------- +template< class V, class C, class B > +template< class I, class P > +void fpa::Base::MinimumSpanningTree< V, C, B >:: +GetPathFromImage( + std::vector< P >& path, const V& a, const V& b, + const I* image, unsigned int kernel + ) const +{ + std::vector< V > vertices; + this->GetPath( vertices, a, b ); + path.clear( ); + for( unsigned int i = 0; i < vertices.size( ); ++i ) + { + P p; + image->TransformIndexToPhysicalPoint( vertices[ i ], p ); + path.push_back( p ); + + } // rof + + // Lowpass filter + if( kernel > 0 ) + { + int k = int( kernel ) >> 1; + std::vector< P > lowpass_path; + for( unsigned int i = 0; i < path.size( ); ++i ) + { + P p; + p.Fill( ( typename P::ValueType )( 0 ) ); + unsigned int c = 0; + for( int j = -k; j <= k; ++j ) + { + int l = int( i ) + j; + if( l >= 0 && l < path.size( ) ) + { + p += path[ l ].GetVectorFromOrigin( ); + c++; + + } // fi + + } // rof + if( c > 0 ) + for( unsigned int d = 0; d < P::PointDimension; ++d ) + p[ d ] /= ( typename P::ValueType )( c ); + lowpass_path.push_back( p ); + + } // rof + + path = lowpass_path; + + } // fi +} + // ------------------------------------------------------------------------- template< class V, class C, class B > fpa::Base::MinimumSpanningTree< V, C, B >:: -- 2.45.1