]> Creatis software - clitk.git/blobdiff - itk/clitkInvertVFFilter.txx
Add display matrix option
[clitk.git] / itk / clitkInvertVFFilter.txx
index ae6be89f8e85c424dbbc9c7a2c39bbc5f0947da3..34500a3897e058db1247afc3f1a174526cb5862e 100644 (file)
@@ -74,10 +74,12 @@ protected:
   ~HelperClass1() {};
 
   //the actual processing
-  void GenerateInputRequestedRegion();
-  void GenerateOutputInformation();  
   void BeforeThreadedGenerateData();
+#if ITK_VERSION_MAJOR >= 4
+  void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId );
+#else
   void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, int threadId );
+#endif
 
   //member data
   typename  WeightsImageType::Pointer m_Weights;
@@ -101,33 +103,6 @@ HelperClass1<InputImageType, OutputImageType>::HelperClass1()
   m_ThreadSafe=false;
 }
 
-//=========================================================================================================================
-//Set input image params
-template <class InputImageType, class OutputImageType>
-void HelperClass1<InputImageType, OutputImageType>::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<class InputImageType, class OutputImageType >
-void HelperClass1<InputImageType, OutputImageType>::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<class InputImageType, class OutputImageType >
@@ -142,26 +117,25 @@ void HelperClass1<InputImageType, OutputImageType>::BeforeThreadedGenerateData()
 //=========================================================================================================================
 //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();
 
   //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<InputImageType> InputImageIteratorType;
-  typedef itk::ImageRegionConstIteratorWithIndex<OutputImageType> InputImageIteratorType;
+  typedef itk::ImageRegionConstIteratorWithIndex<InputImageType> 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 +144,16 @@ void HelperClass1<InputImageType, OutputImageType>::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 +161,13 @@ void HelperClass1<InputImageType, OutputImageType>::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,10 +199,12 @@ void HelperClass1<InputImageType, OutputImageType>::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
         if( (overlap>0.0)) // &&
           //                   (static_cast<unsigned int>(neighIndex[0])<size[0]) &&
@@ -270,10 +244,10 @@ void HelperClass1<InputImageType, OutputImageType>::ThreadedGenerateData(const O
       }
     }
 
-    ++outputIt;
+    ++inputIt;
   }
 
-  //std::cout << "HelperClass1::ThreadedGenerateData - OUT" << std::endl;
+//   std::cout << "HelperClass1::ThreadedGenerateData - OUT " << threadId << std::endl;
 }
 
 
@@ -323,8 +297,11 @@ protected:
 
 
   //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
 
   //member data
   typename     WeightsImageType::Pointer m_Weights;
@@ -349,9 +326,13 @@ template<class InputImageType, class OutputImageType > HelperClass2<InputImageTy
 
 //=========================================================================================================================
 //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();
@@ -403,7 +384,7 @@ template<class InputImageType, class OutputImageType > void HelperClass2<InputIm
 
   }//end while
   
-  //std::cout << "HelperClass2::ThreadedGenerateData - OUT" << std::endl;
+//   std::cout << "HelperClass2::ThreadedGenerateData - OUT " << threadId << std::endl;
   
 }//end member
 
@@ -429,60 +410,22 @@ InvertVFFilter<InputImageType, OutputImageType>::InvertVFFilter()
   m_Verbose=false;
 }
 
-//=========================================================================================================================
-//Set input image params
-template <class InputImageType, class OutputImageType>
-void InvertVFFilter<InputImageType, OutputImageType>::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<class InputImageType, class OutputImageType >
-void InvertVFFilter<InputImageType, OutputImageType>::GenerateOutputInformation()
-{
-  //std::cout << "InvertVFFilter::GenerateOutputInformation - IN" << std::endl;
-  Superclass::GenerateOutputInformation();
-
-  typename InputImageType::ConstPointer inputPtr=this->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;
-}
-
 //=========================================================================================================================
 //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 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
@@ -513,8 +456,7 @@ template <class InputImageType, class OutputImageType> void InvertVFFilter<Input
     typename MutexImageType::Pointer mutex=InvertVFFilter::MutexImageType::New();
     mutex->SetRegions(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" <<std::endl;
   } else  if(m_Verbose)std::cout <<"Inverting using a thread-unsafe algorithm" <<std::endl;
@@ -534,8 +476,7 @@ template <class InputImageType, class OutputImageType> void InvertVFFilter<Input
   typename HelperClass2Type::Pointer helper2=HelperClass2Type::New();
 
   //Set temporary output as input
-  //std::cout << temp->GetSpacing() << temp->GetLargestPossibleRegion().GetSize() << std::endl;
-  //std::cout << weights->GetSpacing() << weights->GetLargestPossibleRegion().GetSize() << std::endl;
+  if(m_NumberOfThreadsIsGiven)helper2->SetNumberOfThreads(m_NumberOfThreads);
   helper2->SetInput(temp);
   helper2->SetWeights(weights);
   helper2->SetEdgePaddingValue(m_EdgePaddingValue);
@@ -546,6 +487,8 @@ template <class InputImageType, class OutputImageType> void InvertVFFilter<Input
 
   //Set the output
   this->SetNthOutput(0, helper2->GetOutput());
+  
+  //std::cout << "InvertVFFilter::GenerateData - OUT" << std::endl;
 }