Commit ee8dca90 authored by Christophe Palmann's avatar Christophe Palmann

Merge branch 'ENH-SARDecompositions' into develop

parents 7060b442 18c233f8
......@@ -20,10 +20,17 @@
#include "otbReciprocalHAlphaImageFilter.h"
#include "otbReciprocalBarnesDecompImageFilter.h"
#include "otbReciprocalHuynenDecompImageFilter.h"
#include "otbReciprocalPauliDecompImageFilter.h"
#include "otbSinclairReciprocalImageFilter.h"
#include "otbSinclairToReciprocalCoherencyMatrixFunctor.h"
#include "otbPerBandVectorImageFilter.h"
#include "itkMeanImageFilter.h"
#include "otbNRIBandImagesToOneNComplexBandsImage.h"
#include "otbImageListToVectorImageFilter.h"
#include "otbImageList.h"
namespace otb
......@@ -52,15 +59,21 @@ public:
ComplexDoubleImageType,
ComplexDoubleImageType,
ComplexDoubleVectorImageType,
FunctorType > SRFilterType;
FunctorType > SRFilterType;
typedef otb::ReciprocalHAlphaImageFilter<ComplexDoubleVectorImageType, DoubleVectorImageType> HAFilterType;
typedef itk::MeanImageFilter<ComplexDoubleImageType, ComplexDoubleImageType> MeanFilterType;
typedef otb::PerBandVectorImageFilter<ComplexDoubleVectorImageType, ComplexDoubleVectorImageType, MeanFilterType> PerBandMeanFilterType;
//typedef otb::NRIBandImagesToOneNComplexBandsImage<DoubleVectorImageType, ComplexDoubleVectorImageType> NRITOOneCFilterType;
typedef otb::ImageList<ComplexDoubleImageType> ImageListType;
typedef ImageListToVectorImageFilter<ImageListType, ComplexDoubleVectorImageType > ListConcatenerFilterType;
typedef itk::MeanImageFilter<ComplexDoubleImageType, ComplexDoubleImageType> MeanFilterType;
typedef otb::PerBandVectorImageFilter<ComplexDoubleVectorImageType, ComplexDoubleVectorImageType, MeanFilterType> PerBandMeanFilterType;
//FloatImageType
typedef otb::ReciprocalHAlphaImageFilter<ComplexDoubleVectorImageType, ComplexDoubleVectorImageType> HAFilterType;
typedef otb::ReciprocalBarnesDecompImageFilter<ComplexDoubleVectorImageType, ComplexDoubleVectorImageType> BarnesFilterType;
typedef otb::ReciprocalHuynenDecompImageFilter<ComplexDoubleVectorImageType, ComplexDoubleVectorImageType> HuynenFilterType;
typedef otb::ReciprocalPauliDecompImageFilter<ComplexDoubleVectorImageType, ComplexDoubleVectorImageType> PauliFilterType;
/** Standard macro */
itkNewMacro(Self);
......@@ -76,14 +89,18 @@ private:
// Documentation
SetDocName("SARDecompositions");
SetDocLongDescription("From one-band complex images (HH, HV, VH, VV), returns the selected decomposition.\n \n"
"The H-alpha-A decomposition is currently the only one available; it is implemented for the monostatic case (transmitter and receiver are co-located).\n"
"User must provide three one-band complex images HH, HV or VH, and VV (monostatic case <=> HV = VH).\n"
"The H-alpha-A decomposition consists in averaging 3x3 complex coherency matrices (incoherent analysis); the user must provide the size of the averaging window, thanks to the parameter inco.kernelsize.\n "
"The applications returns a float vector image, made up of three channels : H (entropy), Alpha, A (Anisotropy)." );
"All the decompositions implemented are intended for the mono-static case (transmitter and receiver are co-located).\n"
"There are two kinds of decomposition : coherent ones and incoherent ones.\n"
"In the coherent case, only the Pauli decomposition is available.\n"
"In the incoherent case, there the decompositions available : Huynen, Barnes, and H-alpha-A.\n"
"User must provide three one-band complex images HH, HV or VH, and VV (mono-static case <=> HV = VH).\n"
"Incoherent decompositions consist in averaging 3x3 complex coherency/covariance matrices; the user must provide the size of the averaging window, thanks to the parameter inco.kernelsize.\n "
);
SetDocLimitations("None");
SetDocLimitations("Some decompositions output real images, while this application outputs complex images for general purpose.\n"
"Users should pay attention to extract the real part of the results provided by this application.\n");
SetDocAuthors("OTB-Team");
SetDocSeeAlso("SARPolarMatrixConvert, SARPolarSynth");
......@@ -103,15 +120,21 @@ private:
AddParameter(ParameterType_ComplexInputImage, "invv", "Input Image");
SetParameterDescription("invv", "Input image (VV)");
AddParameter(ParameterType_OutputImage, "out", "Output Image");
AddParameter(ParameterType_ComplexOutputImage, "out", "Output Image");
SetParameterDescription("out", "Output image");
AddParameter(ParameterType_Choice, "decomp", "Decompositions");
AddChoice("decomp.haa","H-alpha-A decomposition");
SetParameterDescription("decomp.haa","H-alpha-A decomposition");
AddChoice("decomp.haa","H-alpha-A incoherent decomposition");
SetParameterDescription("decomp.haa","H-alpha-A incoherent decomposition");
AddChoice("decomp.barnes","Barnes incoherent decomposition");
SetParameterDescription("decomp.barnes","Barnes incoherent decomposition");
AddChoice("decomp.huynen","Huynen incoherent decomposition");
SetParameterDescription("decomp.huynen","Huynen incoherent decomposition");
AddChoice("decomp.pauli","Pauli coherent decomposition");
SetParameterDescription("decomp.pauli","Pauli coherent decomposition");
AddParameter(ParameterType_Group,"inco","Incoherent decompositions");
SetParameterDescription("inco","This group allows setting parameters related to the incoherent decompositions.");
SetParameterDescription("inco","This group allows to set parameters related to the incoherent decompositions.");
AddParameter(ParameterType_Int, "inco.kernelsize", "Kernel size for spatial incoherent averaging.");
SetParameterDescription("inco.kernelsize", "Minute (0-59)");
......@@ -146,14 +169,39 @@ private:
if ( (!inhv) && (!invh) )
otbAppLogFATAL( << "Parameter inhv or invh not set. Please provide a HV or a VH complex image.");
m_SRFilter = SRFilterType::New();
m_HAFilter = HAFilterType::New();
m_MeanFilter = PerBandMeanFilterType::New();
MeanFilterType::InputSizeType radius;
m_BarnesFilter = BarnesFilterType::New();
m_HuynenFilter = HuynenFilterType::New();
m_PauliFilter = PauliFilterType::New();
m_Concatener = ListConcatenerFilterType::New();
m_ImageList = ImageListType::New();
switch (GetParameterInt("decomp"))
{
case 0: // H-alpha-A
m_SRFilter = SRFilterType::New();
m_HAFilter = HAFilterType::New();
m_MeanFilter = PerBandMeanFilterType::New();
if (inhv)
m_SRFilter->SetInputHV_VH(GetParameterComplexDoubleImage("inhv"));
else if (invh)
m_SRFilter->SetInputHV_VH(GetParameterComplexDoubleImage("invh"));
m_SRFilter->SetInputHH(GetParameterComplexDoubleImage("inhh"));
m_SRFilter->SetInputVV(GetParameterComplexDoubleImage("invv"));
radius.Fill( GetParameterInt("inco.kernelsize") );
m_MeanFilter->GetFilter()->SetRadius(radius);
m_MeanFilter->SetInput(m_SRFilter->GetOutput());
m_HAFilter->SetInput(m_MeanFilter->GetOutput());
SetParameterComplexOutputImage("out", m_HAFilter->GetOutput() );
break;
case 1: // Barnes
if (inhv)
m_SRFilter->SetInputHV_VH(GetParameterComplexDoubleImage("inhv"));
else if (invh)
......@@ -162,14 +210,49 @@ private:
m_SRFilter->SetInputHH(GetParameterComplexDoubleImage("inhh"));
m_SRFilter->SetInputVV(GetParameterComplexDoubleImage("invv"));
MeanFilterType::InputSizeType radius;
radius.Fill( GetParameterInt("inco.kernelsize") );
m_MeanFilter->GetFilter()->SetRadius(radius);
m_MeanFilter->SetInput(m_SRFilter->GetOutput());
m_BarnesFilter->SetInput(m_MeanFilter->GetOutput());
SetParameterComplexOutputImage("out", m_BarnesFilter->GetOutput() );
break;
case 2: // Huynen
if (inhv)
m_SRFilter->SetInputHV_VH(GetParameterComplexDoubleImage("inhv"));
else if (invh)
m_SRFilter->SetInputHV_VH(GetParameterComplexDoubleImage("invh"));
m_SRFilter->SetInputHH(GetParameterComplexDoubleImage("inhh"));
m_SRFilter->SetInputVV(GetParameterComplexDoubleImage("invv"));
radius.Fill( GetParameterInt("inco.kernelsize") );
m_MeanFilter->GetFilter()->SetRadius(radius);
m_MeanFilter->SetInput(m_SRFilter->GetOutput());
m_HAFilter->SetInput(m_MeanFilter->GetOutput());
SetParameterOutputImage("out", m_HAFilter->GetOutput() );
m_HuynenFilter->SetInput(m_MeanFilter->GetOutput());
SetParameterComplexOutputImage("out", m_HuynenFilter->GetOutput() );
break;
case 3: // Pauli
m_ImageList->PushBack(GetParameterComplexDoubleImage("inhh"));
if (inhv)
m_ImageList->PushBack(GetParameterComplexDoubleImage("inhv"));
else if (invh)
m_ImageList->PushBack(GetParameterComplexDoubleImage("invh"));
m_ImageList->PushBack(GetParameterComplexDoubleImage("invv"));
m_Concatener->SetInput( m_ImageList );
m_PauliFilter->SetInput(m_Concatener->GetOutput());
SetParameterComplexOutputImage("out", m_PauliFilter->GetOutput() );
break;
}
......@@ -179,7 +262,12 @@ private:
//MCPSFilterType::Pointer m_MCPSFilter;
SRFilterType::Pointer m_SRFilter;
HAFilterType::Pointer m_HAFilter;
BarnesFilterType::Pointer m_BarnesFilter;
HuynenFilterType::Pointer m_HuynenFilter;
PauliFilterType::Pointer m_PauliFilter;
PerBandMeanFilterType::Pointer m_MeanFilter;
ListConcatenerFilterType::Pointer m_Concatener;
ImageListType::Pointer m_ImageList;
};
......
otb_module_test()
#----------- SARDecompositions TESTS ----------------
otb_test_application(NAME apTvSARDecompositions
otb_test_application(NAME apTvSARDecompositionsHAAlpha
APP SARDecompositions
OPTIONS
-inhh ${INPUTDATA}/RSAT_imageryC_HH.tif
......@@ -11,4 +11,37 @@ otb_test_application(NAME apTvSARDecompositions
-out ${TEMP}/apTvReciprocalHAlpha.tif
)
otb_test_application(NAME apTvSARDecompositionsBarnes
APP SARDecompositions
OPTIONS
-inhh ${INPUTDATA}/RSAT_imageryC_HH.tif
-inhv ${INPUTDATA}/RSAT_imageryC_HV.tif
-invv ${INPUTDATA}/RSAT_imageryC_VV.tif
-decomp barnes
-out ${TEMP}/apTvReciprocalBarnes.tif
)
otb_test_application(NAME apTvSARDecompositionsHuynen
APP SARDecompositions
OPTIONS
-inhh ${INPUTDATA}/RSAT_imageryC_HH.tif
-inhv ${INPUTDATA}/RSAT_imageryC_HV.tif
-invv ${INPUTDATA}/RSAT_imageryC_VV.tif
-decomp huynen
-out ${TEMP}/apTvReciprocalHuynen.tif
)
otb_test_application(NAME apTvSARDecompositionsPauli
APP SARDecompositions
OPTIONS
-inhh ${INPUTDATA}/RSAT_imageryC_HH.tif
-inhv ${INPUTDATA}/RSAT_imageryC_HV.tif
-invv ${INPUTDATA}/RSAT_imageryC_VV.tif
-decomp pauli
-out ${TEMP}/apTvReciprocalPauli.tif
)
/*=========================================================================
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 __ReciprocalBarnesDecompImageFilter_h
#define __ReciprocalBarnesDecompImageFilter_h
#include "otbUnaryFunctorImageFilter.h"
#include "otbMath.h"
#include "vnl/algo/vnl_complex_eigensystem.h"
#include <algorithm>
namespace otb
{
namespace Functor {
/** \class otbBarnesDecompFunctor
*
* \brief Evaluate the Huynen decomposition from the reciprocal Sinclair matrix image.
*
* \ingroup OTBPolarimetry
*/
template< class TInput, class TOutput>
class ReciprocalBarnesDecompFunctor
{
public:
typedef typename std::complex<double> ComplexType;
typedef vnl_matrix<ComplexType> VNLMatrixType;
typedef vnl_vector<ComplexType> VNLVectorType;
typedef vnl_vector<double> VNLDoubleVectorType;
typedef std::vector<double> VectorType;
typedef typename TOutput::ValueType OutputValueType;
inline TOutput operator()( const TInput & Covariance ) const
{
TOutput result;
result.SetSize(m_NumberOfComponentsPerPixel);
VNLMatrixType qi(3,1);
VNLMatrixType cov(3, 3);
cov[0][0] = ComplexType(Covariance[0]);
cov[0][1] = ComplexType(Covariance[1]);
cov[0][2] = ComplexType(Covariance[2]);
cov[1][0] = std::conj(ComplexType(Covariance[1]));
cov[1][1] = ComplexType(Covariance[3]);
cov[1][2] = ComplexType(Covariance[4]);
cov[2][0] = std::conj(ComplexType(Covariance[2]));
cov[2][1] = std::conj(ComplexType(Covariance[4]));
cov[2][2] = ComplexType(Covariance[5]);
qi[0][0]=ComplexType(1.,0.);
qi[1][0]=ComplexType(0.,0.);
qi[2][0]=ComplexType(0.,0.);
ComplexType norm = (qi.conjugate_transpose()*cov*qi)[0][0];
VNLMatrixType ki = cov*qi / std::sqrt(norm);
result[0] = static_cast<OutputValueType>(ki[0][0]);
result[1] = static_cast<OutputValueType>(ki[1][0]);
result[2] = static_cast<OutputValueType>(ki[2][0]);
qi[0][0]=ComplexType(0.,0.);
qi[1][0]=ComplexType(1./std::sqrt(2.),0.);
qi[2][0]=ComplexType(0.,1./std::sqrt(2.));
norm = (qi.conjugate_transpose()*cov*qi)[0][0];
ki = cov*qi / std::sqrt(norm);
result[3] = static_cast<OutputValueType>(ki[0][0]);
result[4] = static_cast<OutputValueType>(ki[1][0]);
result[5] = static_cast<OutputValueType>(ki[2][0]);
qi[0][0]=ComplexType(0.,0.);
qi[1][0]=ComplexType(0.,1./std::sqrt(2.));
qi[2][0]=ComplexType(1./std::sqrt(2.),0.);
norm = (qi.conjugate_transpose()*cov*qi)[0][0];
ki = cov*qi / std::sqrt(norm);
result[6] = static_cast<OutputValueType>(ki[0][0]);
result[7] = static_cast<OutputValueType>(ki[1][0]);
result[8] = static_cast<OutputValueType>(ki[2][0]);
return result;
}
unsigned int GetOutputSize()
{
return m_NumberOfComponentsPerPixel;
}
/** Constructor */
ReciprocalBarnesDecompFunctor() : m_Epsilon(1e-6) {}
/** Destructor */
virtual ~ReciprocalBarnesDecompFunctor() {}
private:
itkStaticConstMacro(m_NumberOfComponentsPerPixel, unsigned int, 9);
const double m_Epsilon;
};
}
/** \class otbBarnesDecompImageFilter
* \brief Compute the Barnes decomposition image (9 complex channels)
* from the Reciprocal Covariance image (6 complex channels)
*
* For more details, please refer to the class ReciprocalBarnesDecompFunctor.
*
* \ingroup OTBPolarimetry
* \sa ReciprocalBarnesDecompFunctor
*/
template <class TInputImage, class TOutputImage>
class ITK_EXPORT ReciprocalBarnesDecompImageFilter :
public otb::UnaryFunctorImageFilter<TInputImage, TOutputImage, Functor::ReciprocalBarnesDecompFunctor<
typename TInputImage::PixelType, typename TOutputImage::PixelType> >
{
public:
/** Standard class typedefs. */
typedef ReciprocalBarnesDecompImageFilter Self;
typedef typename Functor::ReciprocalBarnesDecompFunctor<
typename TInputImage::PixelType, typename TOutputImage::PixelType> FunctionType;
typedef otb::UnaryFunctorImageFilter<TInputImage, TOutputImage, FunctionType> Superclass;
typedef itk::SmartPointer<Self> Pointer;
typedef itk::SmartPointer<const Self> ConstPointer;
/** Method for creation through the object factory. */
itkNewMacro(Self);
/** Runtime information support. */
itkTypeMacro(ReciprocalBarnesDecompImageFilter, UnaryFunctorImageFilter);
protected:
ReciprocalBarnesDecompImageFilter() {}
virtual ~ReciprocalBarnesDecompImageFilter() {}
private:
ReciprocalBarnesDecompImageFilter(const Self&); //purposely not implemented
void operator=(const Self&); //purposely not implemented
};
} // end namespace otb
#endif
......@@ -50,9 +50,6 @@ namespace Functor {
* - \f$ if p[i] > 1, p[i]=1 \f$
* - \f$ if \alpha_{i} > 90, \alpha_{i}=90 \f$
*
* \ingroup SARPolarimetry
*
*
* \ingroup OTBPolarimetry
*/
template< class TInput, class TOutput>
......@@ -194,10 +191,9 @@ private:
*
* For more details, please refer to the class ReciprocalHAlphaFunctor.
*
* \ingroup SARPOlarimetry
* \ingroup OTBPolarimetry
* \sa ReciprocalHAlphaFunctor
*
* \ingroup OTBPolarimetry
*/
template <class TInputImage, class TOutputImage>
class ITK_EXPORT ReciprocalHAlphaImageFilter :
......
/*=========================================================================
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 __ReciprocalHuynenDecompImageFilter_h
#define __ReciprocalHuynenDecompImageFilter_h
#include "otbUnaryFunctorImageFilter.h"
namespace otb
{
namespace Functor {
/** \class ReciprocalHuynenDecompFunctor
*
* \brief Evaluate the Huynen decomposition from the reciprocal Sinclair matrix image.
*
* \ingroup OTBPolarimetry
*/
template< class TInput, class TOutput>
class ReciprocalHuynenDecompFunctor
{
public:
typedef typename TOutput::ValueType OutputValueType;
inline TOutput operator()( const TInput & Covariance ) const
{
TOutput result;
result.SetSize(m_NumberOfComponentsPerPixel);
OutputValueType A0 = static_cast<OutputValueType>(Covariance[0].real() / 2.0);
OutputValueType B0 = static_cast<OutputValueType>((Covariance[3] + Covariance[5]).real() / 2.0);
OutputValueType B = static_cast<OutputValueType>(Covariance[3].real() - B0);
OutputValueType C = static_cast<OutputValueType>(Covariance[1].real());
OutputValueType D = static_cast<OutputValueType>(-Covariance[1].imag());
OutputValueType E = static_cast<OutputValueType>(Covariance[4].real());
OutputValueType F = static_cast<OutputValueType>(Covariance[4].imag());
OutputValueType G = static_cast<OutputValueType>(Covariance[2].imag());
OutputValueType H = static_cast<OutputValueType>(Covariance[2].real());
result[0] = A0;
result[1] = B0;
result[2] = B;
result[3] = C;
result[4] = D;
result[5] = E;
result[6] = F;
result[7] = G;
result[8] = H;
return result;
}
unsigned int GetOutputSize()
{
return m_NumberOfComponentsPerPixel;
}
/** Constructor */
ReciprocalHuynenDecompFunctor() : m_Epsilon(1e-6) {}
/** Destructor */
virtual ~ReciprocalHuynenDecompFunctor() {}
private:
itkStaticConstMacro(m_NumberOfComponentsPerPixel, unsigned int, 9);
const double m_Epsilon;
};
}
/** \class ReciprocalHuynenDecompImageFilter
* \brief Compute the Huynen decomposition image (9 complex channels)
* from the Reciprocal Covariance image (6 complex channels)
*
* For more details, please refer to the class ReciprocalHuynenDecompFunctor.
*
* \ingroup OTBPolarimetry
* \sa ReciprocalHuynenDecompFunctor
*
*/
template <class TInputImage, class TOutputImage>
class ITK_EXPORT ReciprocalHuynenDecompImageFilter :
public otb::UnaryFunctorImageFilter<TInputImage, TOutputImage, Functor::ReciprocalHuynenDecompFunctor<
typename TInputImage::PixelType, typename TOutputImage::PixelType> >
{
public:
/** Standard class typedefs. */
typedef ReciprocalHuynenDecompImageFilter Self;
typedef typename Functor::ReciprocalHuynenDecompFunctor<
typename TInputImage::PixelType, typename TOutputImage::PixelType> FunctionType;
typedef otb::UnaryFunctorImageFilter<TInputImage, TOutputImage, FunctionType> Superclass;
typedef itk::SmartPointer<Self> Pointer;
typedef itk::SmartPointer<const Self> ConstPointer;
/** Method for creation through the object factory. */
itkNewMacro(Self);
/** Runtime information support. */
itkTypeMacro(ReciprocalHuynenDecompImageFilter, UnaryFunctorImageFilter);
protected:
ReciprocalHuynenDecompImageFilter() {}
virtual ~ReciprocalHuynenDecompImageFilter() {}
private:
ReciprocalHuynenDecompImageFilter(const Self&); //purposely not implemented
void operator=(const Self&); //purposely not implemented
};
} // end namespace otb
#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 __ReciprocalPauliDecompImageFilter_h
#define __ReciprocalPauliDecompImageFilter_h
#include "otbUnaryFunctorImageFilter.h"
namespace otb
{
namespace Functor {
/** \class ReciprocalPauliDecompFunctor
*
* \brief Evaluate the Pauli decomposition from the reciprocal Sinclair matrix image.
*
* \ingroup OTBPolarimetry
*/
template< class TInput, class TOutput>
class ReciprocalPauliDecompFunctor
{
public:
typedef typename TInput::ValueType InputValueType;
typedef typename TOutput::ValueType OutputValueType;
inline TOutput operator()( const TInput & Sinclair ) const
{
TOutput result;
result.SetSize(m_NumberOfComponentsPerPixel);
InputValueType sqrt2(std::sqrt(2.0),0.0);
InputValueType Shh = static_cast<InputValueType>(Sinclair[0]);
InputValueType Shv = static_cast<InputValueType>(Sinclair[1]);
InputValueType Svv = static_cast<InputValueType>(Sinclair[2]);
result[0] = (Shh+Svv)/sqrt2;
result[1] = (Shh-Svv)/sqrt2;
result[2] = sqrt2*Shv;
return result;
}
unsigned int GetOutputSize()
{
return m_NumberOfComponentsPerPixel;
}
/** Constructor */
ReciprocalPauliDecompFunctor() : m_Epsilon(1e-6) {}
/** Destructor */
virtual ~ReciprocalPauliDecompFunctor() {}
private:
itkStaticConstMacro(m_NumberOfComponentsPerPixel, unsigned int, 3);
const double m_Epsilon;
};
}
/** \class ReciprocalPauliDecompImageFilter
* \brief Compute the Pauli decomposition image (3 complex channels)
* from the Reciprocal Sinclair image (6 complex channels)
*
* For more details, please refer to the class ReciprocalPauliDecompFunctor.
*
* \ingroup OTBPolarimetry
* \sa ReciprocalPauliDecompFunctor
*
*/
template <class TInputImage, class TOutputImage>
class ITK_EXPORT ReciprocalPauliDecompImageFilter :
public otb::UnaryFunctorImageFilter<TInputImage, TOutputImage, Functor::ReciprocalPauliDecompFunctor<
typename TInputImage::PixelType, typename TOutputImage::PixelType> >
{
public:
/** Standard class typedefs. */
typedef ReciprocalPauliDecompImageFilter Self;
typedef typename Functor::ReciprocalPauliDecompFunctor<
typename TInputImage::PixelType, typename TOutputImage::PixelType> FunctionType;
typedef otb::UnaryFunctorImageFilter<TInputImage, TOutputImage, FunctionType> Superclass;
typedef itk::SmartPointer<Self> Pointer;
typedef itk::SmartPointer<const Self> ConstPointer;
/** Method for creation through the object factory. */
itkNewMacro(Self);
/** Runtime information support. */