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