21 #ifndef otbMaximumAutocorrelationFactorImageFilter_hxx
22 #define otbMaximumAutocorrelationFactorImageFilter_hxx
27 #include "itkSubtractImageFilter.h"
29 #include "vnl/algo/vnl_matrix_inverse.h"
30 #include "vnl/algo/vnl_generalized_eigensystem.h"
32 #include "itkChangeInformationImageFilter.h"
33 #include "itkImageRegionIterator.h"
34 #include "itkProgressReporter.h"
38 template <
class TInputImage,
class TOutputImage>
41 m_CovarianceEstimator = CovarianceEstimatorType::New();
42 m_CovarianceEstimatorH = CovarianceEstimatorType::New();
43 m_CovarianceEstimatorV = CovarianceEstimatorType::New();
44 this->DynamicMultiThreadingOn();
47 template <
class TInputImage,
class TOutputImage>
51 Superclass::GenerateOutputInformation();
54 TInputImage* inputPtr =
const_cast<TInputImage*
>(this->GetInput());
58 unsigned int nbComp = inputPtr->GetNumberOfComponentsPerPixel();
62 typedef itk::SubtractImageFilter<InternalImageType, InternalImageType, InternalImageType> DifferenceFilterType;
63 typedef itk::ChangeInformationImageFilter<InternalImageType> ChangeInformationImageFilter;
70 referenceRegion.SetSize(size);
72 referenceRegion.SetIndex(index);
79 dhRegion.SetSize(size);
80 dhRegion.SetIndex(index);
85 dvRegion.SetSize(size);
86 dvRegion.SetIndex(index);
88 typename ExtractFilterType::Pointer referenceExtract = ExtractFilterType::New();
89 referenceExtract->SetInput(inputPtr);
90 referenceExtract->SetExtractionRegion(referenceRegion);
92 typename ExtractFilterType::Pointer dhExtract = ExtractFilterType::New();
93 dhExtract->SetInput(inputPtr);
94 dhExtract->SetExtractionRegion(dhRegion);
96 typename ChangeInformationImageFilter::Pointer dhExtractShift = ChangeInformationImageFilter::New();
97 dhExtractShift->SetInput(dhExtract->GetOutput());
98 dhExtractShift->SetReferenceImage(referenceExtract->GetOutput());
99 dhExtractShift->SetUseReferenceImage(
true);
100 dhExtractShift->SetChangeOrigin(
true);
102 typename ExtractFilterType::Pointer dvExtract = ExtractFilterType::New();
103 dvExtract->SetInput(inputPtr);
104 dvExtract->SetExtractionRegion(dvRegion);
106 typename ChangeInformationImageFilter::Pointer dvExtractShift = ChangeInformationImageFilter::New();
107 dvExtractShift->SetInput(dvExtract->GetOutput());
108 dvExtractShift->SetReferenceImage(referenceExtract->GetOutput());
109 dvExtractShift->SetUseReferenceImage(
true);
110 dvExtractShift->SetChangeOrigin(
true);
113 typename DifferenceFilterType::Pointer diffh = DifferenceFilterType::New();
114 diffh->SetInput1(referenceExtract->GetOutput());
115 diffh->SetInput2(dhExtractShift->GetOutput());
117 typename DifferenceFilterType::Pointer diffv = DifferenceFilterType::New();
118 diffv->SetInput1(referenceExtract->GetOutput());
119 diffv->SetInput2(dvExtractShift->GetOutput());
122 m_CovarianceEstimatorH->SetInput(diffh->GetOutput());
123 m_CovarianceEstimatorH->Update();
124 VnlMatrixType sigmadh = m_CovarianceEstimatorH->GetCovariance().GetVnlMatrix();
126 m_CovarianceEstimatorV->SetInput(diffv->GetOutput());
127 m_CovarianceEstimatorV->Update();
128 VnlMatrixType sigmadv = m_CovarianceEstimatorV->GetCovariance().GetVnlMatrix();
134 referenceExtract->SetExtractionRegion(inputPtr->GetLargestPossibleRegion());
135 m_CovarianceEstimator->SetInput(referenceExtract->GetOutput());
136 m_CovarianceEstimator->Update();
137 VnlMatrixType sigma = m_CovarianceEstimator->GetCovariance().GetVnlMatrix();
141 for (
unsigned int i = 0; i < nbComp; ++i)
143 m_Mean[i] = m_CovarianceEstimator->GetMean()[i];
146 vnl_generalized_eigensystem ges(sigmad, sigma);
151 m_AutoCorrelation -= 0.5 * d.get_diagonal();
154 invstderr.set_diagonal(sigma.get_diagonal());
155 invstderr = invstderr.apply(&std::sqrt);
159 invstderrmaf.set_diagonal((m_V.transpose() * sigma * m_V).get_diagonal());
160 invstderrmaf = invstderrmaf.apply(&std::sqrt);
169 for (
unsigned int i = 0; i < nbComp; ++i)
171 aux2 = aux2 + aux1.get_row(i);
174 sign.set_diagonal(aux2);
182 template <
class TInputImage,
class TOutputImage>
186 const TInputImage* inputPtr = this->GetInput();
187 TOutputImage* outputPtr = this->GetOutput();
190 typedef itk::ImageRegionConstIterator<InputImageType> ConstIteratorType;
191 typedef itk::ImageRegionIterator<OutputImageType> IteratorType;
193 IteratorType outIt(outputPtr, outputRegionForThread);
194 ConstIteratorType inIt(inputPtr, outputRegionForThread);
200 unsigned int outNbComp = outputPtr->GetNumberOfComponentsPerPixel();
202 while (!inIt.IsAtEnd() && !outIt.IsAtEnd())
207 for (
unsigned int i = 0; i < outNbComp; ++i)
209 x[i] = inIt.Get()[i];
212 maf = (x - m_Mean) * m_V;
214 typename OutputImageType::PixelType outPixel(outNbComp);
216 for (
unsigned int i = 0; i < outNbComp; ++i)
218 outPixel[i] = maf[i];
InputImageRegionType::SizeType InputImageSizeType
InputImageType::RegionType InputImageRegionType
vnl_matrix< RealType > VnlMatrixType
OutputImageType::RegionType OutputImageRegionType
vnl_vector< RealType > VnlVectorType
MaximumAutocorrelationFactorImageFilter()
void GenerateOutputInformation() override
void DynamicThreadedGenerateData(const OutputImageRegionType &outputRegionForThread) override
InputImageRegionType::IndexType InputImageIndexType
The "otb" namespace contains all Orfeo Toolbox (OTB) classes.
T InverseValue(const T &value)
T SignOfValue(const T &value)