17 #ifndef __itkBinaryStatisticsKeepNObjectsImageFilter_txx
18 #define __itkBinaryStatisticsKeepNObjectsImageFilter_txx
20 #include "itkBinaryStatisticsKeepNObjectsImageFilter.h"
26 template<
class TInputImage,
class TFeatureImage>
30 m_BackgroundValue = NumericTraits<OutputImagePixelType>::NonpositiveMin();
31 m_ForegroundValue = NumericTraits<OutputImagePixelType>::max();
32 m_FullyConnected =
false;
33 m_ReverseOrdering =
false;
34 m_Attribute = LabelObjectType::MEAN;
35 this->SetNumberOfRequiredInputs(2);
38 template<
class TInputImage,
class TFeatureImage>
44 Superclass::GenerateInputRequestedRegion();
47 InputImagePointer input =
const_cast<InputImageType *
>(this->GetInput());
50 input->SetRequestedRegion( input->GetLargestPossibleRegion() );
55 template<
class TInputImage,
class TFeatureImage>
61 ->SetRequestedRegion( this->GetOutput()->GetLargestPossibleRegion() );
65 template<
class TInputImage,
class TFeatureImage>
72 progress->SetMiniPipelineFilter(
this);
75 this->AllocateOutputs();
77 typename LabelizerType::Pointer labelizer = LabelizerType::New();
78 labelizer->SetInput( this->GetInput() );
79 labelizer->SetForegroundValue( m_ForegroundValue );
80 labelizer->SetBackgroundValue( m_BackgroundValue );
81 labelizer->SetFullyConnected( m_FullyConnected );
82 labelizer->SetNumberOfThreads( this->GetNumberOfThreads() );
83 progress->RegisterInternalFilter(labelizer, .3f);
85 typename LabelObjectValuatorType::Pointer valuator = LabelObjectValuatorType::New();
86 valuator->SetInput( labelizer->GetOutput() );
87 valuator->SetFeatureImage( this->GetFeatureImage() );
88 valuator->SetNumberOfThreads( this->GetNumberOfThreads() );
89 valuator->SetComputeHistogram(
false );
90 if( m_Attribute == LabelObjectType::PERIMETER || m_Attribute == LabelObjectType::ROUNDNESS )
92 valuator->SetComputePerimeter(
true );
94 if( m_Attribute == LabelObjectType::FERET_DIAMETER )
96 valuator->SetComputeFeretDiameter(
true );
98 progress->RegisterInternalFilter(valuator, .3f);
100 typename KeepNObjectsType::Pointer opening = KeepNObjectsType::New();
101 opening->SetInput( valuator->GetOutput() );
102 opening->SetNumberOfObjects( m_NumberOfObjects );
103 opening->SetReverseOrdering( m_ReverseOrdering );
104 opening->SetAttribute( m_Attribute );
105 opening->SetNumberOfThreads( this->GetNumberOfThreads() );
106 progress->RegisterInternalFilter(opening, .2f);
108 typename BinarizerType::Pointer binarizer = BinarizerType::New();
109 binarizer->SetInput( opening->GetOutput() );
110 binarizer->SetForegroundValue( m_ForegroundValue );
111 binarizer->SetBackgroundValue( m_BackgroundValue );
112 binarizer->SetBackgroundImage( this->GetInput() );
113 binarizer->SetNumberOfThreads( this->GetNumberOfThreads() );
114 progress->RegisterInternalFilter(binarizer, .2f);
116 binarizer->GraftOutput( this->GetOutput() );
118 this->GraftOutput( binarizer->GetOutput() );
122 template<
class TInputImage,
class TFeatureImage>
127 Superclass::PrintSelf(os, indent);
129 os << indent <<
"FullyConnected: " << m_FullyConnected << std::endl;
130 os << indent <<
"BackgroundValue: " <<
static_cast<typename NumericTraits<OutputImagePixelType>::PrintType
>(m_BackgroundValue) << std::endl;
131 os << indent <<
"ForegroundValue: " <<
static_cast<typename NumericTraits<OutputImagePixelType>::PrintType
>(m_ForegroundValue) << std::endl;
132 os << indent <<
"NumberOfObjects: " << m_NumberOfObjects << std::endl;
133 os << indent <<
"ReverseOrdering: " << m_ReverseOrdering << std::endl;
134 os << indent <<
"Attribute: " << LabelObjectType::GetNameFromAttribute(m_Attribute) <<
" (" << m_Attribute <<
")" << std::endl;