18 #ifndef __otbMultiChannelsPolarimetricSynthesisFilter_txx
19 #define __otbMultiChannelsPolarimetricSynthesisFilter_txx
35 template <
class TInputImage,
class TOutputImage,
class TFunction>
39 this->SetNumberOfRequiredInputs(1);
50 template <
class TInputImage,
class TOutputImage,
class TFunction>
62 if (!outputPtr || !inputPtr)
70 this->CallCopyInputRegionToOutputRegion(outputLargestPossibleRegion,
71 inputPtr->GetLargestPossibleRegion());
72 outputPtr->SetLargestPossibleRegion(outputLargestPossibleRegion);
86 const typename InputImageType::SpacingType&
88 const typename InputImageType::PointType&
89 inputOrigin = inputPtr->GetOrigin();
90 const typename InputImageType::DirectionType&
91 inputDirection = inputPtr->GetDirection();
93 typename OutputImageType::SpacingType outputSpacing;
94 typename OutputImageType::PointType outputOrigin;
95 typename OutputImageType::DirectionType outputDirection;
99 for (i = 0; i < Superclass::InputImageDimension; ++i)
101 outputSpacing[i] = inputSpacing[i];
102 outputOrigin[i] = inputOrigin[i];
103 for (j = 0; j < Superclass::OutputImageDimension; ++j)
105 if (j < Superclass::InputImageDimension)
107 outputDirection[j][i] = inputDirection[j][i];
111 outputDirection[j][i] = 0.0;
115 for (; i < Superclass::OutputImageDimension; ++i)
117 outputSpacing[i] = 1.0;
118 outputOrigin[i] = 0.0;
119 for (j = 0; j < Superclass::OutputImageDimension; ++j)
123 outputDirection[j][i] = 1.0;
127 outputDirection[j][i] = 0.0;
133 outputPtr->SetSpacing(outputSpacing);
134 outputPtr->SetOrigin(outputOrigin);
135 outputPtr->SetDirection(outputDirection);
141 itkExceptionMacro(<<
"otb::MultiChannelsPolarimetricSynthesisFilter::GenerateOutputInformation "
142 <<
"cannot cast input to "
150 template <
class TInputImage,
class TOutputImage,
class TFunction>
164 this->CallCopyOutputRegionToInputRegion(inputRegionForThread, outputRegionForThread);
183 outputIt.
Set(m_Gain * GetFunctor() (inputIt.
Get()[0], inputIt.
Get()[1],
184 inputIt.
Get()[2], inputIt.
Get()[3]));
187 progress.CompletedPixel();
195 outputIt.
Set(m_Gain * GetFunctor() (inputIt.
Get()[0], inputIt.
Get()[1],
196 inputIt.
Get()[1], inputIt.
Get()[2]));
199 progress.CompletedPixel();
207 outputIt.
Set(m_Gain * GetFunctor() (inputIt.
Get()[0], inputIt.
Get()[1], 0, 0));
210 progress.CompletedPixel();
218 outputIt.
Set(m_Gain * GetFunctor() (0, 0, inputIt.
Get()[2], inputIt.
Get()[3]));
221 progress.CompletedPixel();
226 itkExceptionMacro(
"Unknown architecture : Polarimetric synthesis is impossible !");
235 template <
class TInputImage,
class TOutputImage,
class TFunction>
246 real = vcl_cos(DTOR * m_PsiI) * vcl_cos(DTOR * m_KhiI);
247 imag = -vcl_sin(DTOR * m_PsiI) * vcl_sin(DTOR * m_KhiI);
250 real = vcl_sin(DTOR * m_PsiI) * vcl_cos(DTOR * m_KhiI);
251 imag = vcl_cos(DTOR * m_PsiI) * vcl_sin(DTOR * m_KhiI);
254 real = vcl_cos(DTOR * m_PsiR) * vcl_cos(DTOR * m_KhiR);
255 imag = -vcl_sin(DTOR * m_PsiR) * vcl_sin(DTOR * m_KhiR);
258 real = vcl_sin(DTOR * m_PsiR) * vcl_cos(DTOR * m_KhiR);
259 imag = vcl_cos(DTOR * m_PsiR) * vcl_sin(DTOR * m_KhiR);
275 template <
class TInputImage,
class TOutputImage,
class TFunction>
309 itkExceptionMacro(
"Unknown architecture : Polarimetric synthesis is impossible !!");
313 if (GetMode() == 1) ForceCoPolar();
314 else if (GetMode() == 2) ForceCrossPolar();
321 template <
class TInputImage,
class TOutputImage,
class TFunction>
327 int NumberOfImages = this->GetInput()->GetNumberOfComponentsPerPixel();
330 m_ArchitectureType->DetermineArchitecture(NumberOfImages, GetEmissionH(), GetEmissionV());
333 VerifyAndForceInputs();
336 ComputeElectromagneticFields();
343 template <
class TInputImage,
class TOutputImage,
class TFunction>
355 template <
class TInputImage,
class TOutputImage,
class TFunction>
360 SetPsiR(m_PsiI + 90);
368 template <
class TInputImage,
class TOutputImage,
class TFunction>
373 this->Superclass::PrintSelf(os, indent);
374 os << indent <<
"PsiI: " << m_PsiI << std::endl;
375 os << indent <<
"KhiI: " << m_KhiI << std::endl;
376 os << indent <<
"PsiR: " << m_PsiR << std::endl;
377 os << indent <<
"KhiR: " << m_KhiR << std::endl;
379 os << indent <<
"Ei0 im: " << m_Ei[0].imag() << std::endl;
380 os << indent <<
"Ei0 re: " << m_Ei[0].real() << std::endl;
381 os << indent <<
"Ei1 im: " << m_Ei[1].imag() << std::endl;
382 os << indent <<
"Ei1 re: " << m_Ei[1].real() << std::endl;
384 os << indent <<
"Er0 im: " << m_Er[0].imag() << std::endl;
385 os << indent <<
"Er0 re: " << m_Er[0].real() << std::endl;
386 os << indent <<
"Er1 im: " << m_Er[1].imag() << std::endl;
387 os << indent <<
"Er1 re: " << m_Er[1].real() << std::endl;