//Typedefs
typedef typename OutputImageType::PixelType PixelType;
typedef itk::Image<double, ImageDimension > WeightsImageType;
- typedef itk::Image<itk::SimpleFastMutexLock, ImageDimension > MutexImageType;
+#if ITK_VERSION_MAJOR <= 4
+ typedef itk::Image<itk::SimpleFastMutexLock, ImageDimension> MutexImageType;
+#endif
//===================================================================================
//Set methods
m_Weights = input;
this->Modified();
}
+#if ITK_VERSION_MAJOR <= 4
void SetMutexImage(const typename MutexImageType::Pointer input) {
m_MutexImage=input;
this->Modified();
m_ThreadSafe=true;
}
+#else
+ void SetMutexImage() {
+ this->Modified();
+ m_ThreadSafe=true;
+ }
+#endif
//Get methods
typename WeightsImageType::Pointer GetWeights() {
~HelperClass1() {};
//the actual processing
- void BeforeThreadedGenerateData();
-#if ITK_VERSION_MAJOR >= 4
- void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId );
-#else
- void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, int threadId );
-#endif
+ void BeforeThreadedGenerateData() ITK_OVERRIDE;
+ void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId ) ITK_OVERRIDE;
//member data
typename WeightsImageType::Pointer m_Weights;
+#if ITK_VERSION_MAJOR <= 4
typename MutexImageType::Pointer m_MutexImage;
+#else
+ std::mutex m_Mutex;
+#endif
bool m_ThreadSafe;
};
//=========================================================================================================================
//update the output for the outputRegionForThread
template<class InputImageType, class OutputImageType>
-#if ITK_VERSION_MAJOR >= 4
void HelperClass1<InputImageType, OutputImageType>::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId )
-#else
-void HelperClass1<InputImageType, OutputImageType>::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, int threadId )
-#endif
{
- //std::cout << "HelperClass1::ThreadedGenerateData - IN" << std::endl;
+// std::cout << "HelperClass1::ThreadedGenerateData - IN " << threadId << std::endl;
//Get pointer to the input
typename InputImageType::ConstPointer inputPtr = this->GetInput();
DisplacementType displacement;
inputIt.GoToBegin();
+ typename OutputImageType::SizeType size = outputPtr->GetLargestPossibleRegion().GetSize();
+
//define some temp variables
signed long baseIndex[ImageDimension];
double distance[ImageDimension];
for(dim = 0; dim < ImageDimension; dim++) {
// The following block is equivalent to the following line without
// having to call floor. (Only for positive inputs, we already now that is in the image)
- // baseIndex[dim] = (long) vcl_floor(contIndex[dim] );
+ // baseIndex[dim] = (long) std::floor(contIndex[dim] );
baseIndex[dim] = (long) contIndex[dim];
distance[dim] = contIndex[dim] - double( baseIndex[dim] );
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
else {
//Entering critilal section: shared memory
+#if ITK_VERSION_MAJOR <= 4
m_MutexImage->GetPixel(neighIndex).Lock();
+#else
+ m_Mutex.lock();
+#endif
//Set the pixel and weight at neighIndex
outputPtr->SetPixel(neighIndex, outputPtr->GetPixel(neighIndex) - (displacement*overlap));
m_Weights->SetPixel(neighIndex, m_Weights->GetPixel(neighIndex) + overlap);
//Unlock
+#if ITK_VERSION_MAJOR <= 4
m_MutexImage->GetPixel(neighIndex).Unlock();
+#else
+ m_Mutex.unlock();
+#endif
}
//Add to total overlap
++inputIt;
}
- //std::cout << "HelperClass1::ThreadedGenerateData - OUT" << std::endl;
+// std::cout << "HelperClass1::ThreadedGenerateData - OUT " << threadId << std::endl;
}
//the actual processing
-#if ITK_VERSION_MAJOR >= 4
- void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId );
-#else
- void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, int threadId );
-#endif
+ 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
-#if ITK_VERSION_MAJOR >= 4
template<class InputImageType, class OutputImageType > void HelperClass2<InputImageType, OutputImageType>::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId )
-#else
-template<class InputImageType, class OutputImageType > void HelperClass2<InputImageType, OutputImageType>::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, int threadId )
-#endif
{
- //std::cout << "HelperClass2::ThreadedGenerateData - IN" << std::endl;
-
+// 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" << std::endl;
-
+
+// 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;
+ // std::cout << "InvertVFFilter::GenerateData - IN" << std::endl;
//Get the properties of the input
typename InputImageType::ConstPointer inputPtr=this->GetInput();
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);
//Threadsafe?
if(m_ThreadSafe) {
//Allocate the mutex image
+#if ITK_VERSION_MAJOR <= 4
typename MutexImageType::Pointer mutex=InvertVFFilter::MutexImageType::New();
mutex->SetRegions(region);
mutex->Allocate();
mutex->SetSpacing(inputPtr->GetSpacing());
helper1->SetMutexImage(mutex);
+#else
+ helper1->SetMutexImage();
+#endif
if (m_Verbose) std::cout <<"Inverting using a thread-safe algorithm" <<std::endl;
} else if(m_Verbose)std::cout <<"Inverting using a thread-unsafe algorithm" <<std::endl;
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;
}