X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=plugins%2FRegionGrowFunctors%2FBinaryThreshold.cxx;fp=plugins%2FRegionGrowFunctors%2FBinaryThreshold.cxx;h=05010ab4974efd39bdf28d082e29b491dcbe711e;hb=cd110994af8ac9a46a74c3a5ba3e13ab897731ec;hp=0000000000000000000000000000000000000000;hpb=3e69c5942ef8dd71c4e25da906eac97ffb63a79d;p=FrontAlgorithms.git diff --git a/plugins/RegionGrowFunctors/BinaryThreshold.cxx b/plugins/RegionGrowFunctors/BinaryThreshold.cxx new file mode 100644 index 0000000..05010ab --- /dev/null +++ b/plugins/RegionGrowFunctors/BinaryThreshold.cxx @@ -0,0 +1,117 @@ +#include +#include + +#include +#include +#include + +// ------------------------------------------------------------------------- +fpaPluginsRegionGrowFunctors::BinaryThreshold:: +BinaryThreshold( ) + : Superclass( ) +{ + typedef cpPlugins::BaseObjects::DataObject _TData; + typedef cpInstances::Image _TImage; + + this->_ConfigureInput< _TImage >( "Input", true, false ); + this->_ConfigureInput< _TData >( "Seeds", false, false ); + this->_ConfigureOutput< _TData >( "Output" ); + + this->m_Parameters.ConfigureAsUint( "Radius", 1 ); + this->m_Parameters.ConfigureAsReal( "LowerThreshold", 0 ); + this->m_Parameters.ConfigureAsReal( "UpperThreshold", 0 ); +} + +// ------------------------------------------------------------------------- +fpaPluginsRegionGrowFunctors::BinaryThreshold:: +~BinaryThreshold( ) +{ +} + +// ------------------------------------------------------------------------- +void fpaPluginsRegionGrowFunctors::BinaryThreshold:: +_GenerateData( ) +{ + auto o = this->GetInputData( "Input" ); + cpPlugins_Demangle_Image_ScalarPixels_AllDims_1( o, _GD0 ) + this->_Error( "Invalid input image." ); +} + +// ------------------------------------------------------------------------- +template< class _TImage > +void fpaPluginsRegionGrowFunctors::BinaryThreshold:: +_GD0( _TImage* image ) +{ + typedef itk::ConstNeighborhoodIterator< _TImage > _TInIt; + typedef + fpa::Image::Functors::RegionGrowBinaryThreshold< _TImage > + _TFunctor; + auto out = this->GetOutput( "Output" ); + auto f = out->GetITK< _TFunctor >( ); + if( f == NULL ) + { + typename _TFunctor::Pointer ptr_f = _TFunctor::New( ); + f = ptr_f.GetPointer( ); + out->SetITK( f ); + + } // fi + + // Compute thresholds from seeds + auto seeds = this->GetInputData< vtkPolyData >( "Seeds" ); + if( seeds != NULL ) + { + std::vector< typename _TImage::IndexType > indices; + typename _TImage::PointType pnt; + typename _TImage::IndexType idx; + unsigned int dim = + ( _TImage::ImageDimension < 3 )? _TImage::ImageDimension: 3; + + for( int i = 0; i < seeds->GetNumberOfPoints( ); ++i ) + { + double buf[ 3 ]; + seeds->GetPoint( i, buf ); + pnt.Fill( 0 ); + for( unsigned int d = 0; d < dim; ++d ) + pnt[ d ] = buf[ d ]; + if( image->TransformPhysicalPointToIndex( pnt, idx ) ) + indices.push_back( idx ); + + } // rof + + typename _TImage::SizeType r; + r.Fill( this->m_Parameters.GetUint( "Radius" ) ); + _TInIt iIt( r, image, image->GetRequestedRegion( ) ); + double v_s1 = double( 0 ); + double v_s2 = double( 0 ); + double v_n = double( 0 ); + double v_min = std::numeric_limits< double >::max( ); + double v_max = -v_min; + for( auto idxIt = indices.begin( ); idxIt != indices.end( ); ++idxIt ) + { + iIt.SetLocation( *idxIt ); + for( unsigned int i = 0; i < iIt.Size( ); ++i ) + { + double v = double( iIt.GetPixel( i ) ); + v_s1 += v; + v_s2 += v * v; + v_n += double( 1 ); + v_min = ( v < v_min )? v: v_min; + v_max = ( v_max < v )? v: v_max; + + } // rof + + } // rof + double s = ( v_s2 - ( ( v_s1 * v_s1 ) / v_n ) ) / ( v_n - double( 1 ) ); + s = std::sqrt( s ) / double( 2 ); + f->SetLowerThreshold( v_min ); + f->SetUpperThreshold( v_max ); + } + else + { + f->SetLowerThreshold( this->m_Parameters.GetReal( "LowerThreshold" ) ); + f->SetUpperThreshold( this->m_Parameters.GetReal( "UpperThreshold" ) ); + + } // fi +} + +// eof - $RCSfile$