// @author Leonardo Florez Valencia
// @email florez-l@javeriana.edu.co
// =========================================================================
-
#ifndef __CTBronchi__MoriLabelling__h__
#define __CTBronchi__MoriLabelling__h__
#include <fpa/Filters/Image/RegionGrow.h>
#include <fpa/Functors/RegionGrow/BinaryThreshold.h>
-/* TODO
- #include <fpa/Base/RegionGrow.h>
- #include <fpa/Base/MarksInterface.h>
- #include <fpa/Base/Functors/RegionGrow/BinaryThreshold.h>
- #include <fpa/Image/Algorithm.h>
- #include <fpa/Image/DefaultTraits.h>
- #include <fpa/Image/LabelledSeedsInterface.h>
-*/
-
namespace CTBronchi
{
/**
typedef CTBronchi::MoriLabellingTraits< TInputImage, TLabelImage > TTraits;
fpaTraitsMacro( typename, TTraits );
- typedef fpa::Filters::Image::Algorithm< fpa::Filters::RegionGrow< TTraits > > TAlgorithm;
+ typedef fpa::Filters::RegionGrow< TTraits > TBase;
+ typedef fpa::Filters::Image::Algorithm< TBase > TAlgorithm;
typedef fpa::Filters::Image::LabelsSeedFilter< TAlgorithm, _TLabelImage > Superclass;
typedef MoriLabelling Self;
typedef itk::SmartPointer< Self > Pointer;
itkNewMacro( Self );
itkTypeMacro( CTBronchi::MoriLabelling, fpa::Filters::Image::RegionGrow );
+ itkGetConstMacro( InputInsideValue, TInputValue );
+ itkSetMacro( InputInsideValue, TInputValue );
+
public:
TInputValue GetUpperThreshold( ) const;
void SetUpperThreshold( TInputValue t );
protected:
typename TLabelFunctor::Pointer m_LabelFunctor;
+ TInputValue m_InputInsideValue;
};
} // ecapseman
void CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >::
_UpdateOutputValue( TNode& n )
{
- this->Superclass::_UpdateOutputValue( n );
+ this->TBase::_UpdateOutputValue( n );
if( n.FrontId != 0 )
{
const TLabelImage* input_labels = this->GetInputLabels( );
- if( input_labels->GetPixel( n.Vertex ) == this->GetInsideValue( ) )
- n.Value = TOutputValue( 1 ); // this->GetInsideLabel( );
- else
+ if( input_labels->GetPixel( n.Vertex ) != this->GetInputInsideValue( ) )
n.Value = TOutputValue( 0 );
- /* TODO
- if( input_labels->GetPixel( n.Vertex ) == this->GetInsideValue( ) )
- */
+ else
+ n.Value = this->GetInsideValue( );
+
} // fi
+ this->GetOutput( )->SetPixel( n.Vertex, n.Value );
}
#endif // __CTBronchi__MoriLabelling__hxx__
#include <itkImageFileReader.h>
#include <itkImageFileWriter.h>
#include <fpa/Filters/Image/Mori.h>
+#include <fpa/Filters/Image/RandomWalker.h>
+#include <fpa/Functors/Dijkstra/Image/Gaussian.h>
#include <CTBronchi/MoriLabelling.h>
// -------------------------------------------------------------------------
const unsigned int Dim = 3;
typedef short TInputPixel;
typedef unsigned char TLabelPixel;
+typedef float TScalar;
typedef itk::Image< TInputPixel, Dim > TInputImage;
typedef itk::Image< TLabelPixel, Dim > TLabelImage;
+typedef itk::Image< TScalar, Dim > TScalarImage;
typedef std::map< std::string, std::string > TMap;
// -------------------------------------------------------------------------
TMap Args;
TInputImage::PointType global_seed;
-TLabelPixel inside_value = std::numeric_limits< TLabelPixel >::max( );
+TLabelPixel inside_value = TLabelPixel( 1 );
TLabelPixel outside_value = TLabelPixel( 0 );
+TLabelPixel inside_label = TLabelPixel( 1 );
+TLabelPixel outside_label = TLabelPixel( 2 );
// -------------------------------------------------------------------------
double MeasureTime( itk::ProcessObject* f )
typename _TLabelling::Pointer labelling = _TLabelling::New( );
labelling->SetInput( input );
labelling->SetInputLabels( labels );
- // TODO: labelling->SetOutsideValue( ); // out label
- // TODO: labelling->SetInsideValue( ); // inside label
- // TODO: labelling->SetUpperThreshold( );
+ labelling->SetOutsideValue( outside_label );
+ labelling->SetInsideValue( inside_label );
+ labelling->SetInputInsideValue( inside_value );
+ labelling->SetUpperThreshold(
+ TInputPixel( std::atof( Args[ "labelling_upper_threshold" ].c_str( ) ) )
+ );
double t = MeasureTime( labelling );
std::cout << "Labelling executed in " << t << " s" << std::endl;
output = labelling->GetOutput( );
output->DisconnectPipeline( );
}
+// -------------------------------------------------------------------------
+template< class _TRawPtr, class _TLabelPtr >
+void RandomWalker( _TLabelPtr& output, const _TRawPtr& raw, const _TLabelPtr& labels )
+{
+ typedef typename _TRawPtr::ObjectType _TRaw;
+ typedef typename _TLabelPtr::ObjectType _TLabel;
+}
+
// -------------------------------------------------------------------------
bool ParseArgs( int argc, char* argv[] )
{
Args[ "mori_lower_threshold" ] = "-1024";
Args[ "mori_upper_threshold" ] = "0";
Args[ "mori_delta_threshold" ] = "1";
+ Args[ "labelling_upper_threshold" ] = "-400";
+
for( int i = 1; i < argc; i += 2 )
Args[ argv[ i ] + 1 ] = argv[ i + 1 ];
<< "\t[-mori_signal_influence value]" << std::endl
<< "\t[-mori_lower_threshold value]" << std::endl
<< "\t[-mori_upper_threshold value]" << std::endl
- << "\t[-mori_delta_threshold value]" << std::endl;
+ << "\t[-mori_delta_threshold value]" << std::endl
+ << "\t[-labelling_upper_threshold value]" << std::endl;
return( false );
} // fi