]> Creatis software - FrontAlgorithms.git/blobdiff - lib/fpa/Base/MinimumSpanningTree.hxx
Minor bugs
[FrontAlgorithms.git] / lib / fpa / Base / MinimumSpanningTree.hxx
index d932247c7bc2dcbc739e5902848da20879509bb5..ad0d06bc00a315e654c77692f9fcef4e5ed4588d 100644 (file)
@@ -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 >::