From a0c3e041d7984885133df437147ab1c5b5b8238e Mon Sep 17 00:00:00 2001
From: Patrick Imbo <patrick.imbo@c-s.fr>
Date: Fri, 10 Feb 2006 10:56:14 +0000
Subject: [PATCH] MAJ -> OK

---
 .../otbImageToPathAlignFilter.txx             | 274 ++++++++++++++++++
 1 file changed, 274 insertions(+)
 create mode 100644 Code/FeatureExtraction/otbImageToPathAlignFilter.txx

diff --git a/Code/FeatureExtraction/otbImageToPathAlignFilter.txx b/Code/FeatureExtraction/otbImageToPathAlignFilter.txx
new file mode 100644
index 0000000000..0c5a0274b1
--- /dev/null
+++ b/Code/FeatureExtraction/otbImageToPathAlignFilter.txx
@@ -0,0 +1,274 @@
+/*=========================================================================
+
+  Programme :   OTB (ORFEO ToolBox)
+  Auteurs   :   CS - P.Imbo
+  Language  :   C++
+  Date      :   08 fevrier 2006
+  Version   :   
+  Role      :   
+  $Id: $
+
+=========================================================================*/
+#ifndef __otbImageToPathAlignFilter_txx
+#define __otbImageToPathAlignFilter_txx
+
+#include "otbImageToPathFilter.h"
+#include "itkImageRegionIteratorWithIndex.h"
+#include "itkPathIterator.h"
+#include "itkNumericTraits.h"
+
+namespace otb
+{
+
+/** Constructor */
+template <class TInputImage, class TOutputPath>
+PathToImageAlignFilter<TInputImage,TOutputPath>
+::PathToImageAlignFilter()
+{
+  this->SetNumberOfRequiredInputs(1);
+  m_Size.Fill(0);
+  
+  for (unsigned int i = 0; i < InputImageDimension; i++)
+    {
+    // Set an image spacing for the user
+    m_Spacing[i] = 1.0;
+    m_Origin[i] = 0;
+    }
+
+  m_PathValue = itk::NumericTraits<ValueType>::One;
+  m_BackgroundValue = itk::NumericTraits<ValueType>::Zero;
+}
+
+/** Destructor */
+template <class TInputImage, class TOutputPath>
+PathToImageAlignFilter<TInputImage,TOutputPath>
+::~PathToImageAlignFilter()
+{
+}
+  
+
+//----------------------------------------------------------------------------
+template <class TInputImage, class TOutputPath>
+void
+PathToImageAlignFilter<TInputImage,TOutputPath>
+::SetSpacing(const double* spacing)
+{
+  unsigned int i; 
+  for (i=0; i<InputImageDimension; i++)
+    {
+    if ( spacing[i] != m_Spacing[i] )
+      {
+      break;
+      }
+    } 
+  if ( i < InputImageDimension ) 
+    { 
+    for (i=0; i<InputImageDimension; i++)
+      {
+      m_Spacing[i] = spacing[i];
+      }
+    }
+}
+
+template <class TInputImage, class TOutputPath>
+void
+PathToImageAlignFilter<TInputImage,TOutputPath>
+::SetSpacing(const float* spacing)
+{
+  unsigned int i; 
+  for (i=0; i<InputImageDimension; i++)
+    {
+    if ( (double)spacing[i] != m_Spacing[i] )
+      {
+      break;
+      }
+    } 
+  if ( i < InputImageDimension ) 
+    { 
+    for (i=0; i<InputImageDimension; i++)
+      {
+      m_Spacing[i] = spacing[i];
+      }
+    }
+}
+
+template <class TInputImage, class TOutputPath>
+const double * 
+PathToImageAlignFilter<TInputImage,TOutputPath>
+::GetSpacing() const
+{
+  return m_Spacing;
+}
+
+//----------------------------------------------------------------------------
+template <class TInputImage, class TOutputPath>
+void
+PathToImageAlignFilter<TInputImage,TOutputPath>
+::SetOrigin(const double* origin)
+{
+  unsigned int i; 
+  for (i=0; i<InputImageDimension; i++)
+    {
+    if ( origin[i] != m_Origin[i] )
+      {
+      break;
+      }
+    } 
+  if ( i < InputImageDimension ) 
+    { 
+    for (i=0; i<InputImageDimension; i++)
+      {
+      m_Origin[i] = origin[i];
+      }
+    }
+}
+
+template <class TInputImage, class TOutputPath>
+void
+PathToImageAlignFilter<TInputImage,TOutputPath>
+::SetOrigin(const float* origin)
+{
+  unsigned int i; 
+  for (i=0; i<InputImageDimension; i++)
+    {
+    if ( (double)origin[i] != m_Origin[i] )
+      {
+      break;
+      }
+    } 
+  if ( i < InputImageDimension ) 
+    { 
+    for (i=0; i<InputImageDimension; i++)
+      {
+      m_Origin[i] = origin[i];
+      }
+    }
+}
+
+template <class TInputImage, class TOutputPath>
+const double * 
+PathToImageAlignFilter<TInputImage,TOutputPath>
+::GetOrigin() const
+{
+  return m_Origin;
+}
+
+//----------------------------------------------------------------------------
+
+template <class TInputImage, class TOutputPath>
+void
+PathToImageAlignFilter<TInputImage,TOutputPath>
+::GenerateData(void)
+{
+  unsigned int i;
+  itkDebugMacro(<< "ImageToPathAlignFilter::GenerateData() called");
+
+  // Get the input and output pointers 
+  const InputImageType * InputImage   = this->GetInput();
+  OutputPathPointer    OutputPath = this->GetOutput();
+
+  // Generate the image
+  double origin[InputImageDimension];
+  SizeType size;
+  
+  for(i=0;i<InputImageDimension;i++)
+    {
+    // Set Image size to the size of the path's bounding box
+    //size[i] = (long unsigned int)(InputObject->GetBoundingBox()->GetMaximum()[i]
+    //                              - InputObject->GetBoundingBox()->GetMinimum()[i]);
+    size[i]=0;
+    origin[i]=0;
+    }
+  
+  typename InputImageType::IndexType index;
+  index.Fill(0);
+  typename InputImageType::RegionType region;
+  
+  // If the size of the output has been explicitly specified, the filter
+  // will set the output size to the explicit size, otherwise the size from the spatial
+  // paths's bounding box will be used as default.
+  
+  bool specified = false;
+  for (i = 0; i < InputImageDimension; i++)
+    {
+    if (m_Size[i] != 0)
+      {
+      specified = true;
+      break;
+      }
+    }
+  
+  if (specified)
+    {
+    region.SetSize( m_Size );
+    }
+  else
+    {
+    itkExceptionMacro( << "Currently, the user MUST specify an image size" )
+    //region.SetSize( size );
+    }
+  region.SetIndex( index );
+  
+  InputImage->SetLargestPossibleRegion( region);     // 
+  InputImage->SetBufferedRegion( region );           // set the region 
+  InputImage->SetRequestedRegion( region );          //                                                                       
+  
+  // If the spacing has been explicitly specified, the filter
+  // will set the output spacing to that explicit spacing, otherwise the spacing from
+  // the spatial object is used as default.
+  
+  specified = false;
+  for (i = 0; i < InputImageDimension; i++)
+    {
+    if (m_Spacing[i] != 0)
+      {
+      specified = true;
+      break;
+      }
+    }
+  
+  if (specified)
+    {
+    InputImage->SetSpacing(this->m_Spacing);         // set spacing
+    }
+  else
+    {
+    itkExceptionMacro( << "Currently, the user MUST specify an image spacing" )
+    //OutputImage->SetSpacing(InputObject->GetIndexToObjectTransform()->GetScaleComponent());   // set spacing
+    }
+  InputImage->SetOrigin(origin);   //   and origin
+  InputImage->Allocate();   // allocate the image                            
+  
+  itk::ImageRegionIteratorWithIndex<InputImageType> imageIt(InputImage,region);
+  for( imageIt.GoToBegin(); !imageIt.IsAtEnd(); ++imageIt )
+    {
+    imageIt.Set(m_BackgroundValue);
+    }
+  
+  itk::PathIterator<InputImageType,OutputPathType> pathIt(InputImage,OutputPath);
+  for( pathIt.GoToBegin(); !pathIt.IsAtEnd(); ++pathIt )
+    {
+    pathIt.Set( m_PathValue );
+    }
+  
+  itkDebugMacro(<< "ImageToPathAlignFilter::GenerateData() finished");
+
+} // end update function  
+
+
+template <class TInputImage, class TOutputPath>
+void
+PathToImageAlignFilter<TInputImage,TOutputPath>
+::PrintSelf(std::ostream& os, itk::Indent indent) const
+{
+  Superclass::PrintSelf(os, indent);
+  os << indent << "Size : " << m_Size << std::endl;
+  os << indent << "Path Value : " << m_PathValue << std::endl;
+  os << indent << "Background Value : " << m_BackgroundValue << std::endl;
+}
+
+
+
+} // end namespace otb
+
+#endif
-- 
GitLab