21 #ifndef __otbStreamingMinMaxImageFilter_txx
22 #define __otbStreamingMinMaxImageFilter_txx
28 #include "itkNumericTraits.h"
35 template<
class TInputImage>
46 for (
int i = 1; i < 5; ++i)
51 this->GetMinimumOutput()->Set(itk::NumericTraits<PixelType>::max());
52 this->GetMaximumOutput()->Set(itk::NumericTraits<PixelType>::NonpositiveMin());
57 template<
class TInputImage>
70 ret =
static_cast<itk::DataObject*
>(PixelObjectType::New().GetPointer());
74 ret =
static_cast<itk::DataObject*
>(IndexObjectType::New().GetPointer());
80 template<
class TInputImage>
88 template<
class TInputImage>
96 template<
class TInputImage>
104 template<
class TInputImage>
113 template<
class TInputImage>
121 template<
class TInputImage>
129 template<
class TInputImage>
137 template<
class TInputImage>
145 template<
class TInputImage>
150 Superclass::GenerateOutputInformation();
151 if (this->GetInput())
153 this->GetOutput()->CopyInformation(this->GetInput());
154 this->GetOutput()->SetLargestPossibleRegion(this->GetInput()->GetLargestPossibleRegion());
156 if (this->GetOutput()->GetRequestedRegion().GetNumberOfPixels() == 0)
158 this->GetOutput()->SetRequestedRegion(this->GetOutput()->GetLargestPossibleRegion());
162 template<
class TInputImage>
174 template<
class TInputImage>
180 int numberOfThreads = this->GetNumberOfThreads();
182 PixelType minimum = itk::NumericTraits<PixelType>::max();
183 PixelType maximum = itk::NumericTraits<PixelType>::NonpositiveMin();
187 for (i = 0; i < numberOfThreads; ++i)
189 if (m_ThreadMin[i] < minimum)
191 minimum = m_ThreadMin[i];
192 minimumIdx = m_ThreadMinIndex[i];
194 if (m_ThreadMax[i] > maximum)
196 maximum = m_ThreadMax[i];
197 maximumIdx = m_ThreadMaxIndex[i];
202 this->GetMinimumOutput()->Set(minimum);
203 this->GetMaximumOutput()->Set(maximum);
204 this->GetMinimumIndexOutput()->Set(minimumIdx);
205 this->GetMaximumIndexOutput()->Set(maximumIdx);
208 template<
class TInputImage>
213 int numberOfThreads = this->GetNumberOfThreads();
215 m_ThreadMin.resize(numberOfThreads);
216 m_ThreadMax.resize(numberOfThreads);
217 std::fill(m_ThreadMin.begin(), m_ThreadMin.end(), itk::NumericTraits<PixelType>::max());
218 std::fill(m_ThreadMax.begin(), m_ThreadMax.end(), itk::NumericTraits<PixelType>::NonpositiveMin());
222 m_ThreadMinIndex.resize(numberOfThreads);
223 m_ThreadMaxIndex.resize(numberOfThreads);
224 std::fill(m_ThreadMinIndex.begin(), m_ThreadMinIndex.end(), zeroIdx);
225 std::fill(m_ThreadMaxIndex.begin(), m_ThreadMaxIndex.end(), zeroIdx);
228 template<
class TInputImage>
244 if (value < m_ThreadMin[threadId])
246 m_ThreadMin[threadId] = value;
247 m_ThreadMinIndex[threadId] = it.
GetIndex();
249 if (value > m_ThreadMax[threadId])
251 m_ThreadMax[threadId] = value;
252 m_ThreadMaxIndex[threadId] = it.
GetIndex();
255 progress.CompletedPixel();
259 template <
class TImage>
264 Superclass::PrintSelf(os, indent);
266 os << indent <<
"Minimum: "
267 <<
static_cast<typename itk::NumericTraits<PixelType>::PrintType
>(this->GetMinimum()) << std::endl;
268 os << indent <<
"Maximum: "
269 <<
static_cast<typename itk::NumericTraits<PixelType>::PrintType
>(this->GetMaximum()) << std::endl;
270 os << indent <<
"Minimum Index: " << this->GetMinimumIndex() << std::endl;
271 os << indent <<
"Maximum Index: " << this->GetMaximumIndex() << std::endl;