X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=itk%2FclitkInvertVFFilter.txx;h=b2485e0e51a5f6c260c3aeed26cfc5575c396543;hb=f05cc2cf37d7ec960b73fa9d2393d5a888e1f87a;hp=ae6be89f8e85c424dbbc9c7a2c39bbc5f0947da3;hpb=2252420857d1554424d1f2c69ea68547bc759678;p=clitk.git diff --git a/itk/clitkInvertVFFilter.txx b/itk/clitkInvertVFFilter.txx index ae6be89..b2485e0 100644 --- a/itk/clitkInvertVFFilter.txx +++ b/itk/clitkInvertVFFilter.txx @@ -74,10 +74,8 @@ protected: ~HelperClass1() {}; //the actual processing - void GenerateInputRequestedRegion(); - void GenerateOutputInformation(); - void BeforeThreadedGenerateData(); - void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, int threadId ); + void BeforeThreadedGenerateData() ITK_OVERRIDE; + void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId ) ITK_OVERRIDE; //member data typename WeightsImageType::Pointer m_Weights; @@ -101,33 +99,6 @@ HelperClass1::HelperClass1() m_ThreadSafe=false; } -//========================================================================================================================= -//Set input image params -template -void HelperClass1::GenerateInputRequestedRegion() -{ - //std::cout << "HelperClass1::GenerateInputRequestedRegion - IN" << std::endl; - - typename InputImageType::Pointer inputPtr = const_cast< InputImageType * >(this->GetInput()); - inputPtr->SetRequestedRegion(inputPtr->GetLargestPossibleRegion()); - - //std::cout << "HelperClass1::GenerateInputRequestedRegion - OUT" << std::endl; -} - -//========================================================================================================================= -//Set output image params -template -void HelperClass1::GenerateOutputInformation() -{ - //std::cout << "HelperClass1::GenerateOutputInformation - IN" << std::endl; - Superclass::GenerateOutputInformation(); - - // it's the weight image that determines the size of the output - typename OutputImageType::Pointer outputPtr = this->GetOutput(); - outputPtr->SetLargestPossibleRegion( m_Weights->GetLargestPossibleRegion() ); - outputPtr->SetSpacing(m_Weights->GetSpacing()); -} - //========================================================================================================================= //Before threaded data template @@ -142,26 +113,21 @@ void HelperClass1::BeforeThreadedGenerateData() //========================================================================================================================= //update the output for the outputRegionForThread template -void HelperClass1::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, int threadId ) +void HelperClass1::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId ) { - //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(); //Get pointer to the output typename OutputImageType::Pointer outputPtr = this->GetOutput(); -/* outputPtr->SetLargestPossibleRegion( m_Weights->GetLargestPossibleRegion() ); - outputPtr->SetSpacing(m_Weights->GetSpacing());*/ - typename OutputImageType::SizeType size=outputPtr->GetLargestPossibleRegion().GetSize(); - //std::cout << outputPtr->GetSpacing() << size << std::endl; + //typename OutputImageType::SizeType size=outputPtr->GetLargestPossibleRegion().GetSize(); //Iterator over input - //typedef itk::ImageRegionConstIteratorWithIndex InputImageIteratorType; - typedef itk::ImageRegionConstIteratorWithIndex InputImageIteratorType; + typedef itk::ImageRegionConstIteratorWithIndex InputImageIteratorType; //define them over the outputRegionForThread - //InputImageIteratorType outputIt(inputPtr, outputRegionForThread); - InputImageIteratorType outputIt(outputPtr, outputPtr->GetLargestPossibleRegion()); + InputImageIteratorType inputIt(inputPtr, outputRegionForThread); //Initialize typename InputImageType::IndexType index; @@ -170,14 +136,16 @@ void HelperClass1::ThreadedGenerateData(const O typename OutputImageType::PointType opoint; typedef typename OutputImageType::PixelType DisplacementType; DisplacementType displacement; - outputIt.GoToBegin(); + inputIt.GoToBegin(); + + typename OutputImageType::SizeType size = outputPtr->GetLargestPossibleRegion().GetSize(); //define some temp variables signed long baseIndex[ImageDimension]; double distance[ImageDimension]; unsigned int dim, counter, upper; double totalOverlap,overlap; - typename OutputImageType::IndexType neighIndex, outIndex; + typename OutputImageType::IndexType neighIndex; //Find the number of neighbors unsigned int neighbors = 1 << ImageDimension; @@ -185,17 +153,13 @@ void HelperClass1::ThreadedGenerateData(const O //================================================================================================== //Loop over the output region and add the intensities from the input to the output and the weight to the weights //================================================================================================== - while( !outputIt.IsAtEnd() ) { + while( !inputIt.IsAtEnd() ) { // get the input image index - outIndex = outputIt.GetIndex(); - outputPtr->TransformIndexToPhysicalPoint( outIndex,opoint ); - for(unsigned int j = 0; j < ImageDimension; j++ ) ipoint[j] = opoint[j]; - inputPtr->TransformPhysicalPointToIndex(ipoint, index); + index = inputIt.GetIndex(); inputPtr->TransformIndexToPhysicalPoint( index,ipoint ); // get the required displacement - //displacement = outputIt.Get(); - displacement = inputPtr->GetPixel(index); + displacement = inputIt.Get(); // compute the required output image point for(unsigned int j = 0; j < ImageDimension; j++ ) opoint[j] = ipoint[j] + (double)displacement[j]; @@ -227,8 +191,10 @@ void HelperClass1::ThreadedGenerateData(const O 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 @@ -270,10 +236,10 @@ void HelperClass1::ThreadedGenerateData(const O } } - ++outputIt; + ++inputIt; } - //std::cout << "HelperClass1::ThreadedGenerateData - OUT" << std::endl; +// std::cout << "HelperClass1::ThreadedGenerateData - OUT " << threadId << std::endl; } @@ -323,8 +289,7 @@ protected: //the actual processing - void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, int threadId ); - + void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId ) ITK_OVERRIDE; //member data typename WeightsImageType::Pointer m_Weights; @@ -343,16 +308,19 @@ protected: //Empty constructor template HelperClass2::HelperClass2() { - m_EdgePaddingValue=itk::NumericTraits::Zero; + PixelType zero; + for(unsigned int i=0;i ::Zero; } //========================================================================================================================= //update the output for the outputRegionForThread -template void HelperClass2::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, int threadId ) +template void HelperClass2::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId ) { - //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(); @@ -402,9 +370,9 @@ template void HelperClass2 InvertVFFilter::InvertVFFilter() { - m_EdgePaddingValue=itk::NumericTraits::Zero; //no other reasonable value? - m_ThreadSafe=false; - m_Verbose=false; -} - -//========================================================================================================================= -//Set input image params -template -void InvertVFFilter::GenerateInputRequestedRegion() -{ - //std::cout << "InvertVFFilter::GenerateInputRequestedRegion - IN" << std::endl; - // call the superclass' implementation of this method - // Superclass::GenerateInputRequestedRegion(); - - typename InputImageType::Pointer inputPtr = const_cast< InputImageType * >(this->GetInput()); - inputPtr->SetRequestedRegion(inputPtr->GetLargestPossibleRegion()); - - //std::cout << "InvertVFFilter::GenerateInputRequestedRegion - OUT" << std::endl; -} -//========================================================================================================================= -//Set output image params -template -void InvertVFFilter::GenerateOutputInformation() -{ - //std::cout << "InvertVFFilter::GenerateOutputInformation - IN" << std::endl; - Superclass::GenerateOutputInformation(); + //m_EdgePaddingValue=itk::NumericTraits::Zero; //no other reasonable value? + PixelType zero; + for(unsigned int i=0;i GetInput(); - typename WeightsImageType::RegionType region = inputPtr->GetLargestPossibleRegion(); - region.SetSize(m_OutputSize); - - typename OutputImageType::Pointer outputPtr = this->GetOutput(); - outputPtr->SetRegions( region ); - outputPtr->SetSpacing(m_OutputSpacing); - outputPtr->SetOrigin(inputPtr->GetOrigin()); - - //std::cout << "InvertVFFilter::GenerateOutputInformation - OUT" << std::endl; + m_ThreadSafe=false; + m_Verbose=false; } //========================================================================================================================= //Update template void InvertVFFilter::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 WeightsImageType::RegionType region = inputPtr->GetLargestPossibleRegion(); - //region.SetSize(size); - region.SetSize(m_OutputSize); //Allocate the weights typename WeightsImageType::Pointer weights=WeightsImageType::New(); weights->SetOrigin(inputPtr->GetOrigin()); weights->SetRegions(region); - weights->SetSpacing(m_OutputSpacing); weights->Allocate(); - //weights->SetSpacing(inputPtr->GetSpacing()); + weights->SetSpacing(inputPtr->GetSpacing()); //=========================================================================== //Inversion is divided in in two loops, for each we will call a threaded helper class @@ -503,7 +438,13 @@ template void InvertVFFilterSetNumberOfThreads(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); @@ -513,8 +454,7 @@ template void InvertVFFilterSetRegions(region); mutex->Allocate(); - //mutex->SetSpacing(inputPtr->GetSpacing()); - mutex->SetSpacing(m_OutputSpacing); + mutex->SetSpacing(inputPtr->GetSpacing()); helper1->SetMutexImage(mutex); if (m_Verbose) std::cout <<"Inverting using a thread-safe algorithm" < void InvertVFFilterGetSpacing() << temp->GetLargestPossibleRegion().GetSize() << std::endl; - //std::cout << weights->GetSpacing() << weights->GetLargestPossibleRegion().GetSize() << std::endl; + 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); @@ -546,6 +491,8 @@ template void InvertVFFilterSetNthOutput(0, helper2->GetOutput()); + + //std::cout << "InvertVFFilter::GenerateData - OUT" << std::endl; }