]> Creatis software - FrontAlgorithms.git/blobdiff - lib/fpa/Filters/Image/RandomWalker.hxx
...
[FrontAlgorithms.git] / lib / fpa / Filters / Image / RandomWalker.hxx
diff --git a/lib/fpa/Filters/Image/RandomWalker.hxx b/lib/fpa/Filters/Image/RandomWalker.hxx
new file mode 100644 (file)
index 0000000..ef858b5
--- /dev/null
@@ -0,0 +1,166 @@
+// =========================================================================
+// @author Leonardo Florez Valencia
+// @email florez-l@javeriana.edu.co
+// =========================================================================
+#ifndef __fpa__Filters__Image__RandomWalker__hxx__
+#define __fpa__Filters__Image__RandomWalker__hxx__
+
+#include <itkImageRegionConstIteratorWithIndex.h>
+
+// -------------------------------------------------------------------------
+template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
+typename
+fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
+TCostsImage*
+fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
+GetOutputCosts( )
+{
+  return( this->GetOutput( ) );
+}
+
+// -------------------------------------------------------------------------
+template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
+const typename
+fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
+TCostsImage*
+fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
+GetOutputCosts( ) const
+{
+  return( this->GetOutput( ) );
+}
+
+// -------------------------------------------------------------------------
+template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
+typename
+fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
+TOutputLabels*
+fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
+GetOutputLabels( )
+{
+  return( this->GetMarks( ) );
+}
+
+// -------------------------------------------------------------------------
+template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
+const typename
+fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
+TOutputLabels*
+fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
+GetOutputLabels( ) const
+{
+  return( this->GetMarks( ) );
+}
+
+// -------------------------------------------------------------------------
+template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
+typename
+fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
+TInputImage*
+fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
+GetInputImage( )
+{
+  return( this->GetInput( ) );
+}
+
+// -------------------------------------------------------------------------
+template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
+const typename
+fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
+TInputImage*
+fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
+GetInputImage( ) const
+{
+  return( this->GetInput( ) );
+}
+
+// -------------------------------------------------------------------------
+template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
+void
+fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
+SetInputImage( TInputImage* image )
+{
+  this->SetInput( image );
+}
+
+// -------------------------------------------------------------------------
+template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
+fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
+RandomWalker( )
+  : Superclass( )
+{
+  fpaFilterInputConfigureMacro( InputLabels, TInputLabels );
+}
+
+// -------------------------------------------------------------------------
+template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
+fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
+~RandomWalker( )
+{
+}
+
+// -------------------------------------------------------------------------
+template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
+const itk::DataObject*
+fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
+_GetReferenceInput( ) const
+{
+  return( this->GetInputLabels( ) );
+}
+
+// -------------------------------------------------------------------------
+template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
+void
+fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
+_PrepareSeeds( const itk::DataObject* input )
+{
+  // Input object is a labelled image?
+  const TInputLabels* labels = dynamic_cast< const TInputLabels* >( input );
+  if( labels != NULL )
+  {
+    this->m_UnifiedSeeds.clear( );
+
+    // Iterate over labels
+    typedef itk::ImageRegionConstIteratorWithIndex< TInputLabels > _TIt;
+    typename TInputLabels::RegionType reg = labels->GetRequestedRegion( );
+    _TIt lIt( labels, reg );
+    for( lIt.GoToBegin( ); !lIt.IsAtEnd( ); ++lIt )
+    {
+      if( lIt.Get( ) > 0 )
+      {
+        bool is_seed = false;
+        for( unsigned int d = 0; d < Self::Dimension; ++d )
+        {
+          for( int s = -1; s <= 1; s += 2 )
+          {
+            TVertex neigh = lIt.GetIndex( );
+            neigh[ d ] += s;
+            if( reg.IsInside( neigh ) )
+              is_seed |= ( labels->GetPixel( neigh ) == 0 );
+
+          } // rof
+
+        } // rof
+
+        // Add pixel as seed or already marked
+        TNode node;
+        node.Vertex = lIt.GetIndex( );
+        node.Parent = lIt.GetIndex( );
+        node.FrontId = lIt.Get( );
+        node.Value = TOutputValue( 0 );
+        if( !is_seed )
+        {
+          this->_Mark( node.Vertex, node.FrontId );
+          this->_UpdateOutputValue( node );
+        }
+        else
+          this->m_UnifiedSeeds.insert( node );
+
+      } // fi
+
+    } // rof
+
+  } // fi
+}
+
+#endif // __fpa__Filters__Image__RandomWalker__hxx__
+// eof - $RCSfile$