21 #ifndef otbMultiChannelsPolarimetricSynthesisFilter_hxx
22 #define otbMultiChannelsPolarimetricSynthesisFilter_hxx
27 #include "itkImageRegionIterator.h"
36 template <
class TInputImage,
class TOutputImage,
class TFunction>
38 : m_PsiI(0.0), m_KhiI(0.0), m_PsiR(0.0), m_KhiR(0.0), m_Gain(1.0), m_Mode(0), m_EmissionH(false), m_EmissionV(false)
40 this->SetNumberOfRequiredInputs(1);
43 this->DynamicMultiThreadingOn();
50 template <
class TInputImage,
class TOutputImage,
class TFunction>
57 typename Superclass::OutputImagePointer outputPtr = this->GetOutput();
58 typename Superclass::InputImageConstPointer inputPtr = this->GetInput();
60 if (!outputPtr || !inputPtr)
68 this->CallCopyInputRegionToOutputRegion(outputLargestPossibleRegion, inputPtr->GetLargestPossibleRegion());
69 outputPtr->SetLargestPossibleRegion(outputLargestPossibleRegion);
72 const itk::ImageBase<Superclass::InputImageDimension>* phyData;
74 phyData =
dynamic_cast<const itk::ImageBase<Superclass::InputImageDimension>*
>(this->GetInput());
82 const typename InputImageType::SpacingType& inputSpacing = inputPtr->GetSignedSpacing();
83 const typename InputImageType::PointType& inputOrigin = inputPtr->GetOrigin();
84 const typename InputImageType::DirectionType& inputDirection = inputPtr->GetDirection();
86 typename OutputImageType::SpacingType outputSpacing;
87 typename OutputImageType::PointType outputOrigin;
88 typename OutputImageType::DirectionType outputDirection;
92 for (i = 0; i < Superclass::InputImageDimension; ++i)
94 outputSpacing[i] = inputSpacing[i];
95 outputOrigin[i] = inputOrigin[i];
96 for (j = 0; j < Superclass::OutputImageDimension; ++j)
98 if (j < Superclass::InputImageDimension)
100 outputDirection[j][i] = inputDirection[j][i];
104 outputDirection[j][i] = 0.0;
108 for (; i < Superclass::OutputImageDimension; ++i)
110 outputSpacing[i] = 1.0;
111 outputOrigin[i] = 0.0;
112 for (j = 0; j < Superclass::OutputImageDimension; ++j)
116 outputDirection[j][i] = 1.0;
120 outputDirection[j][i] = 0.0;
126 outputPtr->SetSignedSpacing(outputSpacing);
127 outputPtr->SetOrigin(outputOrigin);
128 outputPtr->SetDirection(outputDirection);
133 itkExceptionMacro(<<
"otb::MultiChannelsPolarimetricSynthesisFilter::GenerateOutputInformation "
134 <<
"cannot cast input to " <<
typeid(itk::ImageBase<Superclass::InputImageDimension>*).name());
141 template <
class TInputImage,
class TOutputImage,
class TFunction>
152 this->CallCopyOutputRegionToInputRegion(inputRegionForThread, outputRegionForThread);
155 itk::ImageRegionConstIterator<TInputImage> inputIt(inputPtr, inputRegionForThread);
156 itk::ImageRegionIterator<TOutputImage> outputIt(outputPtr, outputRegionForThread);
159 outputIt.GoToBegin();
167 while (!inputIt.IsAtEnd())
169 outputIt.Set(m_Gain * GetFunctor()(inputIt.Get()[0], inputIt.Get()[1], inputIt.Get()[2], inputIt.Get()[3]));
177 while (!inputIt.IsAtEnd())
179 outputIt.Set(m_Gain * GetFunctor()(inputIt.Get()[0], inputIt.Get()[1], inputIt.Get()[1], inputIt.Get()[2]));
187 while (!inputIt.IsAtEnd())
189 outputIt.Set(m_Gain * GetFunctor()(inputIt.Get()[0], inputIt.Get()[1], 0, 0));
197 while (!inputIt.IsAtEnd())
199 outputIt.Set(m_Gain * GetFunctor()(0, 0, inputIt.Get()[2], inputIt.Get()[3]));
206 itkExceptionMacro(
"Unknown architecture : Polarimetric synthesis is impossible !");
214 template <
class TInputImage,
class TOutputImage,
class TFunction>
223 real = std::cos(DTOR * m_PsiI) * std::cos(DTOR * m_KhiI);
224 imag = -std::sin(DTOR * m_PsiI) * std::sin(DTOR * m_KhiI);
227 real = std::sin(DTOR * m_PsiI) * std::cos(DTOR * m_KhiI);
228 imag = std::cos(DTOR * m_PsiI) * std::sin(DTOR * m_KhiI);
231 real = std::cos(DTOR * m_PsiR) * std::cos(DTOR * m_KhiR);
232 imag = -std::sin(DTOR * m_PsiR) * std::sin(DTOR * m_KhiR);
235 real = std::sin(DTOR * m_PsiR) * std::cos(DTOR * m_KhiR);
236 imag = std::cos(DTOR * m_PsiR) * std::sin(DTOR * m_KhiR);
251 template <
class TInputImage,
class TOutputImage,
class TFunction>
283 itkExceptionMacro(
"Unknown architecture : Polarimetric synthesis is impossible !!");
289 else if (GetMode() == 2)
296 template <
class TInputImage,
class TOutputImage,
class TFunction>
300 int NumberOfImages = this->GetInput()->GetNumberOfComponentsPerPixel();
303 m_ArchitectureType->DetermineArchitecture(NumberOfImages, GetEmissionH(), GetEmissionV());
306 VerifyAndForceInputs();
309 ComputeElectromagneticFields();
315 template <
class TInputImage,
class TOutputImage,
class TFunction>
326 template <
class TInputImage,
class TOutputImage,
class TFunction>
329 SetPsiR(m_PsiI + 90);
338 template <
class TInputImage,
class TOutputImage,
class TFunction>
341 this->Superclass::PrintSelf(os, indent);
342 os << indent <<
"PsiI: " << m_PsiI << std::endl;
343 os << indent <<
"KhiI: " << m_KhiI << std::endl;
344 os << indent <<
"PsiR: " << m_PsiR << std::endl;
345 os << indent <<
"KhiR: " << m_KhiR << std::endl;
348 os << indent <<
"Ei0 im: " << m_Ei[0].imag() << std::endl;
349 os << indent <<
"Ei0 re: " << m_Ei[0].real() << std::endl;
350 os << indent <<
"Ei1 im: " << m_Ei[1].imag() << std::endl;
351 os << indent <<
"Ei1 re: " << m_Ei[1].real() << std::endl;
353 os << indent <<
"Er0 im: " << m_Er[0].imag() << std::endl;
354 os << indent <<
"Er0 re: " << m_Er[0].real() << std::endl;
355 os << indent <<
"Er1 im: " << m_Er[1].imag() << std::endl;
356 os << indent <<
"Er1 re: " << m_Er[1].real() << std::endl;
itk::FixedArray< ComplexType, 2 > ComplexArrayType
OutputImageType::RegionType OutputImageRegionType
void VerifyAndForceInputs()
void GenerateOutputInformation() override
void ComputeElectromagneticFields()
OutputImageType::Pointer OutputImagePointer
void BeforeThreadedGenerateData() override
MultiChannelsPolarimetricSynthesisFilter()
std::complex< double > ComplexType
InputImageType::RegionType InputImageRegionType
InputImageType::ConstPointer InputImagePointer
PolarimetricData::Pointer m_ArchitectureType
void PrintSelf(std::ostream &os, itk::Indent indent) const override
void DynamicThreadedGenerateData(const OutputImageRegionType &outputRegionForThread) override
The "otb" namespace contains all Orfeo Toolbox (OTB) classes.
constexpr double CONST_PI_180
ArchitectureType
This enumeration describes the different architectures we can find in polarimetry....