===========================================================================**/
#ifndef __clitkInvertVFFilter_txx
#define __clitkInvertVFFilter_txx
+
namespace
{
~HelperClass1() {};
//the actual processing
- void BeforeThreadedGenerateData();
- void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId );
+ void BeforeThreadedGenerateData() ITK_OVERRIDE;
+ void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId ) ITK_OVERRIDE;
//member data
typename WeightsImageType::Pointer m_Weights;
template<class InputImageType, class OutputImageType >
void HelperClass1<InputImageType, OutputImageType>::BeforeThreadedGenerateData()
{
+ //std::cout << "HelperClass1::BeforeThreadedGenerateData - IN" << std::endl;
//Since we will add, put to zero!
this->GetOutput()->FillBuffer(itk::NumericTraits<double>::Zero);
this->GetWeights()->FillBuffer(itk::NumericTraits<double>::Zero);
template<class InputImageType, class OutputImageType>
void HelperClass1<InputImageType, OutputImageType>::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId )
{
-
+// std::cout << "HelperClass1::ThreadedGenerateData - IN " << threadId << std::endl;
//Get pointer to the input
typename InputImageType::ConstPointer inputPtr = this->GetInput();
//Initialize
typename InputImageType::IndexType index;
- itk::ContinuousIndex<double,ImageDimension> contIndex;
+ itk::ContinuousIndex<double,ImageDimension> contIndex, inContIndex;
typename InputImageType::PointType ipoint;
typename OutputImageType::PointType opoint;
typedef typename OutputImageType::PixelType DisplacementType;
DisplacementType displacement;
inputIt.GoToBegin();
+ typename OutputImageType::SizeType size = outputPtr->GetLargestPossibleRegion().GetSize();
+
//define some temp variables
signed long baseIndex[ImageDimension];
double distance[ImageDimension];
unsigned int neighbors = 1 << ImageDimension;
//==================================================================================================
- //Loop over the region and add the intensities to the output and the weight to the weights
+ //Loop over the output region and add the intensities from the input to the output and the weight to the weights
//==================================================================================================
while( !inputIt.IsAtEnd() ) {
// get the input image index
overlap *= 1.0 - distance[dim];
}
upper >>= 1;
- }
+ if (neighIndex[dim] >= size[dim])
+ neighIndex[dim] = size[dim] - 1;
+ }
//Set neighbor value only if overlap is not zero
++inputIt;
}
+// std::cout << "HelperClass1::ThreadedGenerateData - OUT " << threadId << std::endl;
}
//the actual processing
- void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId );
-
+ void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId ) ITK_OVERRIDE;
//member data
typename WeightsImageType::Pointer m_Weights;
//Empty constructor
template<class InputImageType, class OutputImageType > HelperClass2<InputImageType, OutputImageType>::HelperClass2()
{
- m_EdgePaddingValue=itk::NumericTraits<PixelType>::Zero;
+ PixelType zero;
+ for(unsigned int i=0;i <PixelType::Dimension; i++) zero[i] = 0.0;
+ m_EdgePaddingValue=zero;
+ //m_EdgePaddingValue=itk::NumericTraits<PixelType>::Zero;
}
//update the output for the outputRegionForThread
template<class InputImageType, class OutputImageType > void HelperClass2<InputImageType, OutputImageType>::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId )
{
+// std::cout << "HelperClass2::ThreadedGenerateData - IN " << threadId << std::endl;
//Get pointer to the input
typename InputImageType::ConstPointer inputPtr = this->GetInput();
++inputIt;
}//end while
+
+// std::cout << "HelperClass2::ThreadedGenerateData - OUT " << threadId << std::endl;
+
}//end member
template <class InputImageType, class OutputImageType>
InvertVFFilter<InputImageType, OutputImageType>::InvertVFFilter()
{
- m_EdgePaddingValue=itk::NumericTraits<PixelType>::Zero; //no other reasonable value?
+
+ //m_EdgePaddingValue=itk::NumericTraits<PixelType>::Zero; //no other reasonable value?
+ PixelType zero;
+ for(unsigned int i=0;i <PixelType::Dimension; i++) zero[i] = 0.0;
+ m_EdgePaddingValue=zero; //no other reasonable value?
+
m_ThreadSafe=false;
m_Verbose=false;
}
-
//=========================================================================================================================
//Update
template <class InputImageType, class OutputImageType> void InvertVFFilter<InputImageType, OutputImageType>::GenerateData()
{
+ // std::cout << "InvertVFFilter::GenerateData - IN" << std::endl;
//Get the properties of the input
typename InputImageType::ConstPointer inputPtr=this->GetInput();
- typename WeightsImageType::RegionType region;
- typename WeightsImageType::RegionType::SizeType size=inputPtr->GetLargestPossibleRegion().GetSize();
- region.SetSize(size);
- typename OutputImageType::IndexType start;
- for (unsigned int i=0; i< ImageDimension; i++) start[i]=0;
- region.SetIndex(start);
-
+ typename WeightsImageType::RegionType region = inputPtr->GetLargestPossibleRegion();
//Allocate the weights
typename WeightsImageType::Pointer weights=WeightsImageType::New();
+ weights->SetOrigin(inputPtr->GetOrigin());
weights->SetRegions(region);
weights->Allocate();
weights->SetSpacing(inputPtr->GetSpacing());
typename HelperClass1Type::Pointer helper1=HelperClass1Type::New();
//Set input
- if(m_NumberOfThreadsIsGiven)helper1->SetNumberOfThreads(m_NumberOfThreads);
+ if(m_NumberOfThreadsIsGiven) {
+#if ITK_VERSION_MAJOR <= 4
+ helper1->SetNumberOfThreads(m_NumberOfThreads);
+#else
+ helper1->SetNumberOfWorkUnits(m_NumberOfWorkUnits);
+#endif
+ }
helper1->SetInput(inputPtr);
helper1->SetWeights(weights);
typename HelperClass2Type::Pointer helper2=HelperClass2Type::New();
//Set temporary output as input
+ if(m_NumberOfThreadsIsGiven) {
+#if ITK_VERSION_MAJOR <= 4
+ helper2->SetNumberOfThreads(m_NumberOfThreads);
+#else
+ helper2->SetNumberOfWorkUnits(m_NumberOfWorkUnits);
+#endif
+ }
helper2->SetInput(temp);
helper2->SetWeights(weights);
helper2->SetEdgePaddingValue(m_EdgePaddingValue);
//Set the output
this->SetNthOutput(0, helper2->GetOutput());
+
+ //std::cout << "InvertVFFilter::GenerateData - OUT" << std::endl;
}