X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2Ffpa%2FBase%2FMinimumSpanningTree.hxx;h=ad0d06bc00a315e654c77692f9fcef4e5ed4588d;hb=5b7ed1fdb6665dd1ebc4451062a5032d75597e4a;hp=d932247c7bc2dcbc739e5902848da20879509bb5;hpb=b4ed6ddfa7e90e892f07cad9a760961bd4e84e6b;p=FrontAlgorithms.git 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 >::