From 9b022f88cd141b46d8cceaf1f1841dc9b696a672 Mon Sep 17 00:00:00 2001
From: Thomas Feuvrier <thomas.feuvrier@c-s.fr>
Date: Wed, 18 Apr 2007 16:08:30 +0000
Subject: [PATCH] Refactoring Touzi avec la classe
 ImageToModulusAndDirectionImageFilter.

---
 ...otbImageToModulusAndDirectionImageFilter.h | 30 ++++++++---
 ...bImageToModulusAndDirectionImageFilter.txx | 46 +++++++++++++++--
 ...otbModulusAndDirectionImageToImageFilter.h | 11 ++--
 .../otbTouziEdgeDetectorImageFilter.h         | 46 +++++++----------
 .../otbTouziEdgeDetectorImageFilter.txx       | 50 ++++++++-----------
 .../otbTouziEdgeDetectorDirection.cxx         |  2 +-
 6 files changed, 110 insertions(+), 75 deletions(-)

diff --git a/Code/FeatureExtraction/otbImageToModulusAndDirectionImageFilter.h b/Code/FeatureExtraction/otbImageToModulusAndDirectionImageFilter.h
index 6085aafe9f..2c27b9c1d4 100755
--- a/Code/FeatureExtraction/otbImageToModulusAndDirectionImageFilter.h
+++ b/Code/FeatureExtraction/otbImageToModulusAndDirectionImageFilter.h
@@ -48,13 +48,9 @@ public:
   				unsigned int,
                       		TOutputImage::ImageDimension);
 
-  typedef TInputImage InputImageType;
-  typedef TOutputImage OutputImageType;
-  typedef TOutputImageDirection OutputImageDirectionType;
-
   /** typedef for the classes standards. */
   typedef ImageToModulusAndDirectionImageFilter Self;
-  typedef itk::ImageToImageFilter< InputImageType, OutputImageType> Superclass;
+  typedef itk::ImageToImageFilter< TInputImage, TOutputImage > Superclass;
   typedef itk::SmartPointer<Self> Pointer;
   typedef itk::SmartPointer<const Self>  ConstPointer;
 
@@ -63,12 +59,32 @@ public:
 
   /** Return the name of the class. */
   itkTypeMacro(ImageToModulusAndDirectionImageFilter, itk::ImageToImageFilter);
+
+  typedef typename Superclass::InputImageType 	InputImageType;
+  typedef typename Superclass::OutputImageType	OutputImageType;
+  typedef TOutputImageDirection 				OutputImageDirectionType;
+
+
+
+  typedef typename InputImageType::Pointer        InputImagePointer;
+  typedef typename InputImageType::ConstPointer   InputImageConstPointer;
+  typedef typename InputImageType::RegionType     InputImageRegionType; 
+  typedef typename OutputImageType::Pointer       OutputImagePointer;
+  typedef typename OutputImageType::ConstPointer  OutputImageConstPointer;
+  typedef typename OutputImageType::RegionType    OutputImageRegionType; 
  
+  /** Return the const output image modulus */  
+  const OutputImageType * GetOutput() const;
+
   /** Return the output image modulus */  
-  const OutputImageType * GetOutput();
+  OutputImageType * GetOutput();
 
+  /** Return the const output image direction */  
+  const OutputImageDirectionType * GetOutputDirection() const;
   /** Return the output image direction */  
-  const OutputImageDirectionType * GetOutputDirection();
+  OutputImageDirectionType * GetOutputDirection();
+
+  virtual void GenerateInputRequestedRegion();
 
 protected:
   ImageToModulusAndDirectionImageFilter();
diff --git a/Code/FeatureExtraction/otbImageToModulusAndDirectionImageFilter.txx b/Code/FeatureExtraction/otbImageToModulusAndDirectionImageFilter.txx
index d3b0ba31cb..256b2f5876 100755
--- a/Code/FeatureExtraction/otbImageToModulusAndDirectionImageFilter.txx
+++ b/Code/FeatureExtraction/otbImageToModulusAndDirectionImageFilter.txx
@@ -41,11 +41,11 @@ ImageToModulusAndDirectionImageFilter()
 }
 
 
-/** Return the output image modulus */  
+/** Return the const output image modulus */  
 template <class TInputImage, class TOutputImage, class TOutputImageDirection >
 const typename ImageToModulusAndDirectionImageFilter<TInputImage, TOutputImage, TOutputImageDirection>::OutputImageType * 
 ImageToModulusAndDirectionImageFilter<TInputImage, TOutputImage, TOutputImageDirection>::
-GetOutput()
+GetOutput() const
 {
 	if (this->GetNumberOfOutputs() < 1)
     {
@@ -54,12 +54,25 @@ GetOutput()
 	return static_cast<const OutputImageType * >
     (this->itk::ProcessObject::GetOutput(0) );
 }
+/** Return the output image modulus */  
+template <class TInputImage, class TOutputImage, class TOutputImageDirection >
+typename ImageToModulusAndDirectionImageFilter<TInputImage, TOutputImage, TOutputImageDirection>::OutputImageType * 
+ImageToModulusAndDirectionImageFilter<TInputImage, TOutputImage, TOutputImageDirection>::
+GetOutput()
+{
+	if (this->GetNumberOfOutputs() < 1)
+    {
+    	return 0;
+    }
+	return static_cast<OutputImageType * >
+    (this->itk::ProcessObject::GetOutput(0) );
+}
 
-/** Return the output image direction */  
+/** Return the const output image direction */  
 template <class TInputImage, class TOutputImage, class TOutputImageDirection >
 const typename ImageToModulusAndDirectionImageFilter<TInputImage, TOutputImage, TOutputImageDirection>::OutputImageDirectionType * 
 ImageToModulusAndDirectionImageFilter<TInputImage, TOutputImage, TOutputImageDirection>::
-GetOutputDirection()
+GetOutputDirection()const
 {
 	if (this->GetNumberOfOutputs() < 2)
     {
@@ -69,6 +82,31 @@ GetOutputDirection()
     (this->itk::ProcessObject::GetOutput(1) );
 }
 
+/** Return the output image direction */  
+template <class TInputImage, class TOutputImage, class TOutputImageDirection >
+typename ImageToModulusAndDirectionImageFilter<TInputImage, TOutputImage, TOutputImageDirection>::OutputImageDirectionType * 
+ImageToModulusAndDirectionImageFilter<TInputImage, TOutputImage, TOutputImageDirection>::
+GetOutputDirection()
+{
+	if (this->GetNumberOfOutputs() < 2)
+    {
+    	return 0;
+    }
+	return static_cast<OutputImageDirectionType * >
+    (this->itk::ProcessObject::GetOutput(1) );
+}
+
+/**
+ * Standard "GenerateInputRequestedRegion" method
+ */
+template <class TInputImage, class TOutputImage, class TOutputImageDirection >
+void 
+ImageToModulusAndDirectionImageFilter<TInputImage, TOutputImage, TOutputImageDirection>
+::GenerateInputRequestedRegion()
+{
+  Superclass::GenerateInputRequestedRegion();
+}
+
 /**
  * Standard "PrintSelf" method
  */
diff --git a/Code/FeatureExtraction/otbModulusAndDirectionImageToImageFilter.h b/Code/FeatureExtraction/otbModulusAndDirectionImageToImageFilter.h
index cfbbe22627..c44254e217 100755
--- a/Code/FeatureExtraction/otbModulusAndDirectionImageToImageFilter.h
+++ b/Code/FeatureExtraction/otbModulusAndDirectionImageToImageFilter.h
@@ -48,13 +48,9 @@ public:
   				unsigned int,
                       		TOutputImage::ImageDimension);
 
-  typedef TInputImage InputImageType;
-  typedef TInputImageDirection InputImageDirectionType;
-  typedef TOutputImage OutputImageType;
-
   /** typedef for the classes standards. */
   typedef ModulusAndDirectionImageToImageFilter Self;
-  typedef itk::ImageToImageFilter< InputImageType, OutputImageType> Superclass;
+  typedef itk::ImageToImageFilter< TInputImage, TOutputImage> Superclass;
   typedef itk::SmartPointer<Self> Pointer;
   typedef itk::SmartPointer<const Self>  ConstPointer;
 
@@ -63,7 +59,10 @@ public:
 
   /** Return the name of the class. */
   itkTypeMacro(ModulusAndDirectionImageToImageFilter, itk::ImageToImageFilter);
- 
+
+  typedef typename Superclass::InputImageType 	InputImageType;
+  typedef TInputImageDirection 				    InputImageDirectionType;
+  typedef typename Superclass::OutputImageType	OutputImageType;
  
   /** Set/Get the image input of this process object.  */
   virtual void SetInput( const InputImageType *input);
diff --git a/Code/FeatureExtraction/otbTouziEdgeDetectorImageFilter.h b/Code/FeatureExtraction/otbTouziEdgeDetectorImageFilter.h
index bc6aadcc69..1b5901da70 100755
--- a/Code/FeatureExtraction/otbTouziEdgeDetectorImageFilter.h
+++ b/Code/FeatureExtraction/otbTouziEdgeDetectorImageFilter.h
@@ -18,7 +18,7 @@
 #ifndef __otbTouziEdgeDetectorImageFilter_h
 #define __otbTouziEdgeDetectorImageFilter_h
 
-#include "itkImageToImageFilter.h"
+#include "otbImageToModulusAndDirectionImageFilter.h"
 #include "otbImage.h"
 #include "itkNumericTraits.h"
 
@@ -56,8 +56,8 @@ namespace otb
  *  
  */
 
-template <class TInputImage, class TOutputImage>
-class  ITK_EXPORT TouziEdgeDetectorImageFilter :  public itk::ImageToImageFilter< TInputImage, TOutputImage >
+template <class TInputImage, class TOutputImage, class TOutputImageDirection = TOutputImage >
+class  ITK_EXPORT TouziEdgeDetectorImageFilter :  public ImageToModulusAndDirectionImageFilter< TInputImage, TOutputImage, TOutputImageDirection >
 {
 public:
   /** 	Extrait les dimensions aussi bien des images 
@@ -69,37 +69,31 @@ public:
   				unsigned int,
                       		TOutputImage::ImageDimension);
 
-  /** "typedef" pour simplifier la définition et la déclaration de variables. */
-  typedef TInputImage InputImageType;
-  typedef TOutputImage OutputImageType;
-
-  /** "typedef" pour les classes standards. */
+  /** typedef for the classes standards. */
   typedef TouziEdgeDetectorImageFilter Self;
-  typedef itk::ImageToImageFilter< InputImageType, OutputImageType> Superclass;
+  typedef ImageToModulusAndDirectionImageFilter< TInputImage, TOutputImage, TOutputImageDirection> Superclass;
   typedef itk::SmartPointer<Self> Pointer;
   typedef itk::SmartPointer<const Self>  ConstPointer;
 
-  /** Methode pour la gestion "object factory". */
+  /** Method for management of the object factory. */
   itkNewMacro(Self);
 
-  /** Retourne le nom de la classe. */
-  itkTypeMacro(TouziEdgeDetectorImageFilter, itk::ImageToImageFilter);
-  
-  /** Définition des images supportées. */
-  typedef typename InputImageType::PixelType InputPixelType;
-  typedef typename OutputImageType::PixelType OutputPixelType;
+  /** Return the name of the class. */
+  itkTypeMacro(TouziEdgeDetectorImageFilter, ImageToModulusAndDirectionImageFilter);
 
-  
-  typedef typename InputImageType::RegionType InputImageRegionType;
-  typedef typename OutputImageType::RegionType OutputImageRegionType;
+  /** "typedef" pour simplifier la définition et la déclaration de variables. */
+  typedef typename Superclass::InputImageType InputImageType;
+  typedef typename Superclass::OutputImageType OutputImageType;
+  typedef typename Superclass::OutputImageDirectionType OutputImageDirectionType;
 
-  /** "typedef" définissant la taille d'une image. */
   typedef typename InputImageType::SizeType SizeType;
+  typedef typename OutputImageType::RegionType OutputImageRegionType;
+  typedef typename OutputImageType::PixelType OutputPixelType;
+  typedef typename OutputImageDirectionType::PixelType OutputPixelDirectionType;
+  
 
-  /** Positionne le rayon définissant le voisinage utilisé pour le calcul du filtre. */
+  /** Set/Get radius methods */
   itkSetMacro(Radius, SizeType);
-
-  /** Récupère le rayon définissant le voisinage utilisé pour le calcul du filtre. */
   itkGetConstReferenceMacro(Radius, SizeType);
  
 
@@ -108,8 +102,6 @@ public:
    *
    * \sa ImageToImageFilter::GenerateInputRequestedRegion() */
   virtual void GenerateInputRequestedRegion() throw(itk::InvalidRequestedRegionError);
-
-  const OutputImageType * GetOutputDirections();
   
 protected:
   TouziEdgeDetectorImageFilter();
@@ -136,10 +128,8 @@ private:
   /** Déclaration du rayon */
   SizeType m_Radius;
   
-  typename OutputImageType::Pointer m_DirectionOuputImage;
-  
-
 };
+
 } // end namespace otb
 
 #ifndef OTB_MANUAL_INSTANTIATION
diff --git a/Code/FeatureExtraction/otbTouziEdgeDetectorImageFilter.txx b/Code/FeatureExtraction/otbTouziEdgeDetectorImageFilter.txx
index 3c319152bb..5d691014fe 100755
--- a/Code/FeatureExtraction/otbTouziEdgeDetectorImageFilter.txx
+++ b/Code/FeatureExtraction/otbTouziEdgeDetectorImageFilter.txx
@@ -41,14 +41,14 @@ namespace otb
 /**
  *
  */
-template <class TInputImage, class TOutputImage>
-TouziEdgeDetectorImageFilter<TInputImage, TOutputImage>::TouziEdgeDetectorImageFilter()
+template <class TInputImage, class TOutputImage, class TOutputImageDirection >
+TouziEdgeDetectorImageFilter<TInputImage, TOutputImage, TOutputImageDirection>::TouziEdgeDetectorImageFilter()
 {
   m_Radius.Fill(1);
 }
 
-template <class TInputImage, class TOutputImage>
-void TouziEdgeDetectorImageFilter<TInputImage, TOutputImage>::GenerateInputRequestedRegion() throw (itk::InvalidRequestedRegionError)
+template <class TInputImage, class TOutputImage, class TOutputImageDirection >
+void TouziEdgeDetectorImageFilter<TInputImage, TOutputImage, TOutputImageDirection>::GenerateInputRequestedRegion() throw (itk::InvalidRequestedRegionError)
 {
   // call the superclass' implementation of this method
   Superclass::GenerateInputRequestedRegion();
@@ -101,38 +101,29 @@ void TouziEdgeDetectorImageFilter<TInputImage, TOutputImage>::GenerateInputReque
  * InterpolatorType::SetInputImage is not thread-safe and hence
  * has to be set up before ThreadedGenerateData
  */
-template <class TInputImage, class TOutputImage>
+template <class TInputImage, class TOutputImage, class TOutputImageDirection >
 void 
-TouziEdgeDetectorImageFilter<TInputImage,TOutputImage>
+TouziEdgeDetectorImageFilter<TInputImage, TOutputImage, TOutputImageDirection>
 ::BeforeThreadedGenerateData()
 {
 
-  typename OutputImageType::RegionType region;    
+  typename OutputImageDirectionType::RegionType region;    
   typename OutputImageType::Pointer     output = this->GetOutput();
 
-  m_DirectionOuputImage = OutputImageType::New();
+  OutputImageDirectionType * direction = this->GetOutputDirection();
 
   region.SetSize(output->GetLargestPossibleRegion().GetSize());
   region.SetIndex(output->GetLargestPossibleRegion().GetIndex());
-  m_DirectionOuputImage->SetRegions( region );
-  m_DirectionOuputImage->SetOrigin(output->GetOrigin());
-  m_DirectionOuputImage->SetSpacing(output->GetSpacing());
-  m_DirectionOuputImage->Allocate();
+  direction->SetRegions( region );
+  direction->SetOrigin(output->GetOrigin());
+  direction->SetSpacing(output->GetSpacing());
+  direction->Allocate();
 
 }
 
-template <class TInputImage, class TOutputImage>
-const typename TouziEdgeDetectorImageFilter<TInputImage,TOutputImage>::OutputImageType *
-TouziEdgeDetectorImageFilter<TInputImage,TOutputImage>
-::GetOutputDirections()
-{
-	this->Update();
-	return 	static_cast< const OutputImageType *> (m_DirectionOuputImage);
-}
-
-
-template< class TInputImage, class TOutputImage>
-void TouziEdgeDetectorImageFilter< TInputImage, TOutputImage>
+template <class TInputImage, class TOutputImage, class TOutputImageDirection >
+void 
+TouziEdgeDetectorImageFilter<TInputImage, TOutputImage, TOutputImageDirection>
 ::ThreadedGenerateData(	
 			const 	OutputImageRegionType& 		outputRegionForThread,
                        	int 	threadId
@@ -148,7 +139,7 @@ void TouziEdgeDetectorImageFilter< TInputImage, TOutputImage>
   // Allocate output
   typename OutputImageType::Pointer     output = this->GetOutput();
   typename InputImageType::ConstPointer input  = this->GetInput();
-  typename OutputImageType::Pointer     outputDir = m_DirectionOuputImage;
+  typename OutputImageDirectionType::Pointer     outputDir = this->GetOutputDirection();
     
   // Find the data-set boundary "faces"
   typename itk::NeighborhoodAlgorithm::ImageBoundaryFacesCalculator<InputImageType>::FaceListType 		faceList;
@@ -214,7 +205,7 @@ void TouziEdgeDetectorImageFilter< TInputImage, TOutputImage>
     unsigned int neighborhoodSize = bit.Size();
       
     it = itk::ImageRegionIterator<OutputImageType>(output, *fit);
-    it_dir = itk::ImageRegionIterator<OutputImageType>(outputDir, *fit);
+    it_dir = itk::ImageRegionIterator<OutputImageDirectionType>(outputDir, *fit);
     
     bit.OverrideBoundaryCondition(&nbc);
     bit.GoToBegin();
@@ -318,7 +309,7 @@ void TouziEdgeDetectorImageFilter< TInputImage, TOutputImage>
 
       
       // Assignment of this value to the "outputdir" pixel
-      it_dir.Set( static_cast<OutputPixelType>(Dir_contour) );
+      it_dir.Set( static_cast<OutputPixelDirectionType>(Dir_contour) );
                      
       ++bit;
       ++it;
@@ -333,9 +324,10 @@ void TouziEdgeDetectorImageFilter< TInputImage, TOutputImage>
 /**
  * Standard "PrintSelf" method
  */
-template <class TInputImage, class TOutput>
+template <class TInputImage, class TOutputImage, class TOutputImageDirection >
 void 
-TouziEdgeDetectorImageFilter<TInputImage, TOutput>::PrintSelf(std::ostream& os, itk::Indent indent) const
+TouziEdgeDetectorImageFilter<TInputImage, TOutputImage, TOutputImageDirection>
+::PrintSelf(std::ostream& os, itk::Indent indent) const
 {
   Superclass::PrintSelf( os, indent );
   os << indent << "Radius: " << m_Radius << std::endl;
diff --git a/Testing/Code/FeatureExtraction/otbTouziEdgeDetectorDirection.cxx b/Testing/Code/FeatureExtraction/otbTouziEdgeDetectorDirection.cxx
index 17889d2627..1a30110970 100755
--- a/Testing/Code/FeatureExtraction/otbTouziEdgeDetectorDirection.cxx
+++ b/Testing/Code/FeatureExtraction/otbTouziEdgeDetectorDirection.cxx
@@ -66,7 +66,7 @@ int otbTouziEdgeDetectorDirection( int argc, char* argv[] )
         writer->SetFileName( outputFilename );
         
         filtreTouzi->SetInput( reader->GetOutput() );
-        writer->SetInput( filtreTouzi->GetOutputDirections() );
+        writer->SetInput( filtreTouzi->GetOutputDirection() );
         
         writer->Update();
 
-- 
GitLab