21 #ifndef __otbStreamingMinMaxVectorImageFilter_txx
22 #define __otbStreamingMinMaxVectorImageFilter_txx
27 #include "itkNumericTraits.h"
34 template<
class TInputImage>
44 for (
int i = 1; i < 3; ++i)
51 template<
class TInputImage>
64 ret =
static_cast<itk::DataObject*
>(PixelObjectType::New().GetPointer());
70 template<
class TInputImage>
78 template<
class TInputImage>
86 template<
class TInputImage>
94 template<
class TInputImage>
102 template<
class TInputImage>
107 Superclass::GenerateOutputInformation();
108 if (this->GetInput())
110 this->GetOutput()->CopyInformation(this->GetInput());
111 this->GetOutput()->SetLargestPossibleRegion(this->GetInput()->GetLargestPossibleRegion());
113 if (this->GetOutput()->GetRequestedRegion().GetNumberOfPixels() == 0)
115 this->GetOutput()->SetRequestedRegion(this->GetOutput()->GetLargestPossibleRegion());
120 template<
class TInputImage>
132 template<
class TInputImage>
137 TInputImage * inputPtr =
const_cast<TInputImage *
>(this->GetInput());
138 inputPtr->UpdateOutputInformation();
140 unsigned int numberOfThreads = this->GetNumberOfThreads();
141 unsigned int numberOfComponent = inputPtr->GetNumberOfComponentsPerPixel();
145 tempPixel.SetSize(numberOfComponent);
146 tempPixel.Fill(itk::NumericTraits<InternalPixelType>::NonpositiveMin());
147 this->GetMaximumOutput()->Set(tempPixel);
149 tempPixel.Fill(itk::NumericTraits<InternalPixelType>::max());
150 this->GetMinimumOutput()->Set(tempPixel);
153 tempTemporiesPixel.SetSize(numberOfComponent);
154 tempTemporiesPixel.Fill(itk::NumericTraits<InternalPixelType>::max());
155 m_ThreadMin =
ArrayPixelType(numberOfThreads, tempTemporiesPixel);
157 tempTemporiesPixel.Fill(itk::NumericTraits<InternalPixelType>::NonpositiveMin());
158 m_ThreadMax =
ArrayPixelType(numberOfThreads, tempTemporiesPixel);
162 template<
class TInputImage>
169 int numberOfThreads = this->GetNumberOfThreads();
170 unsigned int numberOfComponent = this->GetInput()->GetNumberOfComponentsPerPixel();
173 minimumVector.SetSize(numberOfComponent);
174 minimumVector.Fill(itk::NumericTraits<InternalPixelType>::max());
177 maximumVector.SetSize(numberOfComponent);
178 maximumVector.Fill(itk::NumericTraits<InternalPixelType>::NonpositiveMin());
182 for (i = 0; i < numberOfThreads; ++i)
184 for (
unsigned int j = 0; j < numberOfComponent; ++j)
186 if (m_ThreadMin[i][j] < minimumVector[j])
188 minimumVector[j] = m_ThreadMin[i][j];
190 if (m_ThreadMax[i][j] > maximumVector[j])
192 maximumVector[j] = m_ThreadMax[i][j];
198 this->GetMinimumOutput()->Set(minimumVector);
199 this->GetMaximumOutput()->Set(maximumVector);
202 template<
class TInputImage>
214 MatrixType pixelVector, pixelTransposeVector, pixelSumVector, tempMatrix;
224 for (
unsigned int j = 0; j < vectorValue.GetSize(); ++j)
227 if (value < m_ThreadMin[threadId][j])
229 m_ThreadMin[threadId][j] = value;
231 if (value > m_ThreadMax[threadId][j])
233 m_ThreadMax[threadId][j] = value;
237 progress.CompletedPixel();
241 template <
class TImage>
246 Superclass::PrintSelf(os, indent);
248 os << indent <<
"Minimum: " << this->GetMinimumOutput()->Get() << std::endl;
249 os << indent <<
"Maximum: " << this->GetMaximumOutput()->Get() << std::endl;