Skip to content
Snippets Groups Projects
Commit 29e226d0 authored by Julien Michel's avatar Julien Michel
Browse files

ENH: Adding a composite filter for morphological profiles based segmentation

parent c04a8ce6
No related branches found
No related tags found
No related merge requests found
/*=========================================================================
Program: ORFEO Toolbox
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
See OTBCopyright.txt for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef __otbMorphologicalProfilesSegmentationFilter_h
#define __otbMorphologicalProfilesSegmentationFilter_h
#include "otbMorphologicalOpeningProfileFilter.h"
#include "otbMorphologicalClosingProfileFilter.h"
#include "otbProfileToProfileDerivativeFilter.h"
#include "otbProfileDerivativeToMultiScaleCharacteristicsFilter.h"
#include "otbMultiScaleConvexOrConcaveClassificationFilter.h"
#include "otbImage.h"
#include "itkScalarConnectedComponentImageFilter.h"
#include "itkBinaryBallStructuringElement.h"
namespace otb
{
/** \class MorphologicalProfilesSegmentationFilter
*
*
*/
template <class TInputImage, class TOuputImage, class TInternalPrecision = float, class TStructuringElement = itk::BinaryBallStructuringElement<typename TInputImage::PixelType, TInputImage::ImageDimension> >
class ITK_EXPORT MorphologicalProfilesSegmentationFilter
: public itk::ImageToImageFilter<TInputImage, TOuputImage>
{
public:
/** Standard Self typedef */
typedef MorphologicalProfilesSegmentationFilter Self;
typedef itk::ImageToImageFilter<TInputImage, TOuputImage> Superclass;
typedef itk::SmartPointer<Self> Pointer;
typedef itk::SmartPointer<const Self> ConstPointer;
/** Some convenient typedefs. */
typedef TInputImage InputImageType;
typedef typename InputImageType::PixelType InputPixelType;
typedef TOuputImage OutputImageType;
typedef otb::Image<TInternalPrecision> InternalImageType;
typedef TStructuringElement StructuringElementType;
typedef otb::MorphologicalOpeningProfileFilter<InputImageType, InternalImageType, StructuringElementType>
OpeningProfileFilterType;
typedef otb::MorphologicalClosingProfileFilter<InputImageType, InternalImageType, StructuringElementType>
ClosingProfileFilterType;
typedef otb::ProfileToProfileDerivativeFilter<InternalImageType, InternalImageType> DerivativeFilterType;
typedef otb::ProfileDerivativeToMultiScaleCharacteristicsFilter<InternalImageType, InternalImageType, OutputImageType>
MultiScaleCharacteristicsFilterType;
typedef otb::MultiScaleConvexOrConcaveClassificationFilter<InternalImageType,
OutputImageType> MultiScaleClassificationFilterType;
typedef itk::ScalarConnectedComponentImageFilter<OutputImageType,OutputImageType> ConnectedComponentsFilterType;
/** Method for creation through the object factory. */
itkNewMacro(Self);
/** Runtime information support. */
itkTypeMacro(MorphologicalProfilesSegmentationFilter, itk::ImageToImageFilter);
itkSetMacro(ProfileSize,unsigned int);
itkGetConstReferenceMacro(ProfileSize,unsigned int);
itkSetMacro(ProfileStart,unsigned int);
itkGetConstReferenceMacro(ProfileStart,unsigned int);
itkSetMacro(ProfileStep,unsigned int);
itkGetConstReferenceMacro(ProfileStep,unsigned int);
itkSetMacro(Sigma,double);
itkGetConstReferenceMacro(Sigma,double);
protected:
MorphologicalProfilesSegmentationFilter();
virtual ~MorphologicalProfilesSegmentationFilter();
virtual void GenerateData();
private:
typename OpeningProfileFilterType::Pointer m_OpeningProfile;
typename ClosingProfileFilterType::Pointer m_ClosingProfile;
typename DerivativeFilterType::Pointer m_OpeningDerivativeProfile;
typename DerivativeFilterType::Pointer m_ClosingDerivativeProfile;
typename MultiScaleCharacteristicsFilterType::Pointer m_OpeningCharacteristicsFilter;
typename MultiScaleCharacteristicsFilterType::Pointer m_ClosingCharacteristicsFilter;
typename MultiScaleClassificationFilterType::Pointer m_ClassificationFilter;
typename ConnectedComponentsFilterType::Pointer m_ConnectedComponentsFilter;
unsigned int m_ProfileSize;
unsigned int m_ProfileStart;
unsigned int m_ProfileStep;
double m_Sigma;
};
} // end namespace otb
#ifndef OTB_MANUAL_INSTANTIATION
#include "otbMorphologicalProfilesSegmentationFilter.txx"
#endif
#endif
/*=========================================================================
Program: ORFEO Toolbox
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
See OTBCopyright.txt for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef __otbMorphologicalProfilesSegmentationFilter_txx
#define __otbMorphologicalProfilesSegmentationFilter_txx
#include "otbMorphologicalProfilesSegmentationFilter.h"
namespace otb
{
template <class TInputImage, class TOuputImage, class TInternalPrecision, class TStructuringElement>
MorphologicalProfilesSegmentationFilter<TInputImage,TOuputImage,TInternalPrecision,TStructuringElement>
::MorphologicalProfilesSegmentationFilter()
{
m_ProfileSize = 5;
m_ProfileStart = 1;
m_ProfileStep = 1;
m_ClassificationFilter = MultiScaleClassificationFilterType::New();
m_ConnectedComponentsFilter = ConnectedComponentsFilterType::New();
m_OpeningProfile = OpeningProfileFilterType::New();
m_ClosingProfile = ClosingProfileFilterType::New();
m_OpeningDerivativeProfile = DerivativeFilterType::New();
m_ClosingDerivativeProfile = DerivativeFilterType::New();
m_OpeningCharacteristicsFilter = MultiScaleCharacteristicsFilterType::New();
m_ClosingCharacteristicsFilter = MultiScaleCharacteristicsFilterType::New();
// Wire pipeline
m_OpeningDerivativeProfile->SetInput(m_OpeningProfile->GetOutput());
m_ClosingDerivativeProfile->SetInput(m_ClosingProfile->GetOutput());
m_OpeningCharacteristicsFilter->SetInput(m_OpeningDerivativeProfile->GetOutput());
m_ClosingCharacteristicsFilter->SetInput(m_ClosingDerivativeProfile->GetOutput());
m_ClassificationFilter->SetOpeningProfileDerivativeMaxima(m_OpeningCharacteristicsFilter->GetOutput());
m_ClassificationFilter->SetOpeningProfileCharacteristics(m_OpeningCharacteristicsFilter->GetOutputCharacteristics());
m_ClassificationFilter->SetClosingProfileDerivativeMaxima(m_ClosingCharacteristicsFilter->GetOutput());
m_ClassificationFilter->SetClosingProfileCharacteristics(m_ClosingCharacteristicsFilter->GetOutputCharacteristics());
m_ConnectedComponentsFilter->SetInput(m_ClassificationFilter->GetOutput());
}
template <class TInputImage, class TOuputImage, class TInternalPrecision, class TStructuringElement>
MorphologicalProfilesSegmentationFilter<TInputImage,TOuputImage,TInternalPrecision,TStructuringElement>
::~MorphologicalProfilesSegmentationFilter()
{}
template <class TInputImage, class TOuputImage, class TInternalPrecision, class TStructuringElement>
void
MorphologicalProfilesSegmentationFilter<TInputImage,TOuputImage,TInternalPrecision,TStructuringElement>
::GenerateData()
{
m_OpeningProfile->SetInput(this->GetInput());
m_ClosingProfile->SetInput(this->GetInput());
m_OpeningProfile->SetProfileSize(m_ProfileSize);
m_OpeningProfile->SetInitialValue(m_ProfileStart);
m_OpeningProfile->SetStep(m_ProfileStep);
m_ClosingProfile->SetProfileSize(m_ProfileSize);
m_ClosingProfile->SetInitialValue(m_ProfileStart);
m_ClosingProfile->SetStep(m_ProfileStep);
m_OpeningCharacteristicsFilter->SetInitialValue(m_ProfileStart);
m_OpeningCharacteristicsFilter->SetStep(m_ProfileStep);
m_ClosingCharacteristicsFilter->SetInitialValue(m_ProfileStart);
m_ClosingCharacteristicsFilter->SetStep(m_ProfileStep);
m_ClassificationFilter->SetSigma(m_Sigma);
m_ClassificationFilter->SetLabelSeparator(m_ProfileStart + m_ProfileSize * m_ProfileStep);
m_ConnectedComponentsFilter->GraftOutput(this->GetOutput());
m_ConnectedComponentsFilter->Update();
this->GraftOutput(m_ConnectedComponentsFilter->GetOutput());
}
}
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment