21 #ifndef __otbStreamingMinMaxVectorImageFilter_txx
22 #define __otbStreamingMinMaxVectorImageFilter_txx
27 #include "itkNumericTraits.h"
34 template<
class TInputImage>
37 : m_NoDataFlag(false),
46 for (
int i = 1; i < 3; ++i)
53 template<
class TInputImage>
66 ret =
static_cast<itk::DataObject*
>(PixelObjectType::New().GetPointer());
72 template<
class TInputImage>
80 template<
class TInputImage>
88 template<
class TInputImage>
96 template<
class TInputImage>
104 template<
class TInputImage>
109 Superclass::GenerateOutputInformation();
110 if (this->GetInput())
112 this->GetOutput()->CopyInformation(this->GetInput());
113 this->GetOutput()->SetLargestPossibleRegion(this->GetInput()->GetLargestPossibleRegion());
115 if (this->GetOutput()->GetRequestedRegion().GetNumberOfPixels() == 0)
117 this->GetOutput()->SetRequestedRegion(this->GetOutput()->GetLargestPossibleRegion());
122 template<
class TInputImage>
134 template<
class TInputImage>
139 TInputImage * inputPtr =
const_cast<TInputImage *
>(this->GetInput());
140 inputPtr->UpdateOutputInformation();
142 unsigned int numberOfThreads = this->GetNumberOfThreads();
143 unsigned int numberOfComponent = inputPtr->GetNumberOfComponentsPerPixel();
147 tempPixel.SetSize(numberOfComponent);
148 tempPixel.Fill(itk::NumericTraits<InternalPixelType>::NonpositiveMin());
149 this->GetMaximumOutput()->Set(tempPixel);
151 tempPixel.Fill(itk::NumericTraits<InternalPixelType>::max());
152 this->GetMinimumOutput()->Set(tempPixel);
155 tempTemporiesPixel.SetSize(numberOfComponent);
156 tempTemporiesPixel.Fill(itk::NumericTraits<InternalPixelType>::max());
157 m_ThreadMin =
ArrayPixelType(numberOfThreads, tempTemporiesPixel);
159 tempTemporiesPixel.Fill(itk::NumericTraits<InternalPixelType>::NonpositiveMin());
160 m_ThreadMax =
ArrayPixelType(numberOfThreads, tempTemporiesPixel);
164 template<
class TInputImage>
171 int numberOfThreads = this->GetNumberOfThreads();
172 unsigned int numberOfComponent = this->GetInput()->GetNumberOfComponentsPerPixel();
175 minimumVector.SetSize(numberOfComponent);
176 minimumVector.Fill(itk::NumericTraits<InternalPixelType>::max());
179 maximumVector.SetSize(numberOfComponent);
180 maximumVector.Fill(itk::NumericTraits<InternalPixelType>::NonpositiveMin());
184 for (i = 0; i < numberOfThreads; ++i)
186 for (
unsigned int j = 0; j < numberOfComponent; ++j)
188 if (m_ThreadMin[i][j] < minimumVector[j])
190 minimumVector[j] = m_ThreadMin[i][j];
192 if (m_ThreadMax[i][j] > maximumVector[j])
194 maximumVector[j] = m_ThreadMax[i][j];
200 this->GetMinimumOutput()->Set(minimumVector);
201 this->GetMaximumOutput()->Set(maximumVector);
204 template<
class TInputImage>
220 while (!it.IsAtEnd())
224 for (
unsigned int j = 0; j < vectorValue.GetSize(); ++j)
228 if( (!m_NoDataFlag) || value!=m_NoDataValue )
230 if (value < m_ThreadMin[threadId][j])
232 m_ThreadMin[threadId][j] = value;
234 if (value > m_ThreadMax[threadId][j])
236 m_ThreadMax[threadId][j] = value;
241 progress.CompletedPixel();
245 template <
class TImage>
250 Superclass::PrintSelf(os, indent);
252 os << indent <<
"Minimum: " << this->GetMinimumOutput()->Get() << std::endl;
253 os << indent <<
"Maximum: " << this->GetMaximumOutput()->Get() << std::endl;