13 #ifndef itkNeighborhoodFunctorImageFilter_cpp 14 #define itkNeighborhoodFunctorImageFilter_cpp 17 #include "itkNeighborhoodAlgorithm.h" 18 #include <itkVectorImageToImageAdaptor.h> 23 template<
typename TInputImage,
typename TFeatureImageType ,
class FunctorType>
28 const TInputImage * input = this->GetInput(0);
30 for(
unsigned int i = 0 ; i < FunctorType::OutputCount; i ++)
32 typename FeatureImageType::Pointer output = TFeatureImageType::New();
33 output->SetRegions(input->GetLargestPossibleRegion());
34 output->SetSpacing(input->GetSpacing());
35 output->SetOrigin(input->GetOrigin());
36 output->SetDirection(input->GetDirection());
38 this->SetNthOutput( i, output.GetPointer() );
41 if(m_MaskImage.IsNull())
43 m_MaskImage = MaskImageType::New();
44 m_MaskImage->SetRegions(input->GetLargestPossibleRegion());
45 m_MaskImage->Allocate();
46 m_MaskImage->FillBuffer(1);
50 template<
typename TInputImage,
typename TFeatureImageType ,
class FunctorType>
58 Superclass::GenerateInputRequestedRegion();
70 typename TInputImage::RegionType inputRequestedRegion;
71 inputRequestedRegion = inputPtr->GetRequestedRegion();
74 inputRequestedRegion.PadByRadius( m_Size );
77 if ( inputRequestedRegion.Crop( inputPtr->GetLargestPossibleRegion() ) )
79 inputPtr->SetRequestedRegion(inputRequestedRegion);
88 inputPtr->SetRequestedRegion(inputRequestedRegion);
91 InvalidRequestedRegionError e(__FILE__, __LINE__);
92 e.SetLocation(ITK_LOCATION);
93 e.SetDescription(
"Requested region is (at least partially) outside the largest possible region.");
94 e.SetDataObject(inputPtr);
99 template<
typename TInputImage,
typename TFeatureImageType,
class FunctorType >
107 typedef NeighborhoodAlgorithm::ImageBoundaryFacesCalculator< InputImageType > BFC;
108 typedef typename BFC::FaceListType FaceListType;
110 FaceListType faceList;
120 faceList = faceCalculator( input, outputRegionForThread, m_Size );
122 typename FaceListType::iterator fit;
123 ImageRegionConstIterator< MaskImageType > mit;
127 ConstNeighborhoodIterator< InputImageType > bit;
130 bit = ConstNeighborhoodIterator< InputImageType >(m_Size, input, outputRegionForThread);
132 mit = ImageRegionConstIterator< MaskImageType >(m_MaskImage, outputRegionForThread);
134 std::vector<ImageRegionIterator< FeatureImageType > > featureImageIterators;
136 for(
unsigned int i = 0; i < FunctorType::OutputCount; i++)
138 featureImageIterators.push_back(ImageRegionIterator< FeatureImageType >(this->GetOutput(i), outputRegionForThread));
139 featureImageIterators[i].GoToBegin();
145 while ( !bit.IsAtEnd() || !mit.IsAtEnd() )
150 typename FunctorType::OutputVectorType
features = ( m_Functor( bit ) );
152 for(
unsigned int i = 0 ; i < FunctorType::OutputCount; i++)
153 featureImageIterators[i].Set(features[i]);
156 for(
unsigned int i = 0 ; i < FunctorType::OutputCount; i++)
157 ++featureImageIterators[i];
163 std::cout <<
"Thread done!" << std::endl;
168 #endif //itkNeighborhoodFunctorImageFilter_cpp void BeforeThreadedGenerateData() override
Superclass::OutputImageRegionType OutputImageRegionType
void GenerateInputRequestedRegion() override
TInputImageType InputImageType
void ThreadedGenerateData(const OutputImageRegionType &outputRegionForThread, ThreadIdType threadId) override