21 #ifndef __otbStreamingStatisticsImageFilter_txx
22 #define __otbStreamingStatisticsImageFilter_txx
27 #include "itkNumericTraits.h"
34 template<
class TInputImage>
43 for (
int i = 1; i < 3; ++i)
51 for (
int i = 3; i < 7; ++i)
58 this->GetMinimumOutput()->Set(itk::NumericTraits<PixelType>::max());
59 this->GetMaximumOutput()->Set(itk::NumericTraits<PixelType>::NonpositiveMin());
60 this->GetMeanOutput()->Set(itk::NumericTraits<RealType>::max());
61 this->GetSigmaOutput()->Set(itk::NumericTraits<RealType>::max());
62 this->GetVarianceOutput()->Set(itk::NumericTraits<RealType>::max());
63 this->GetSumOutput()->Set(itk::NumericTraits<RealType>::Zero);
68 template<
class TInputImage>
79 return static_cast<itk::DataObject*
>(PixelObjectType::New().GetPointer());
82 return static_cast<itk::DataObject*
>(PixelObjectType::New().GetPointer());
88 return static_cast<itk::DataObject*
>(RealObjectType::New().GetPointer());
97 template<
class TInputImage>
105 template<
class TInputImage>
113 template<
class TInputImage>
121 template<
class TInputImage>
129 template<
class TInputImage>
137 template<
class TInputImage>
145 template<
class TInputImage>
153 template<
class TInputImage>
161 template<
class TInputImage>
169 template<
class TInputImage>
177 template<
class TInputImage>
185 template<
class TInputImage>
192 template<
class TInputImage>
197 Superclass::GenerateOutputInformation();
198 if (this->GetInput())
200 this->GetOutput()->CopyInformation(this->GetInput());
201 this->GetOutput()->SetLargestPossibleRegion(this->GetInput()->GetLargestPossibleRegion());
203 if (this->GetOutput()->GetRequestedRegion().GetNumberOfPixels() == 0)
205 this->GetOutput()->SetRequestedRegion(this->GetOutput()->GetLargestPossibleRegion());
209 template<
class TInputImage>
221 template<
class TInputImage>
230 int numberOfThreads = this->GetNumberOfThreads();
239 sum = sumOfSquares = itk::NumericTraits<RealType>::Zero;
244 minimum = itk::NumericTraits<PixelType>::max();
245 maximum = itk::NumericTraits<PixelType>::NonpositiveMin();
246 for (i = 0; i < numberOfThreads; ++i)
249 sum += m_ThreadSum[i];
250 sumOfSquares += m_SumOfSquares[i];
252 if (m_ThreadMin[i] < minimum)
254 minimum = m_ThreadMin[i];
256 if (m_ThreadMax[i] > maximum)
258 maximum = m_ThreadMax[i];
262 mean = sum /
static_cast<RealType>(count);
265 variance = (sumOfSquares - (sum * sum /
static_cast<RealType>(count)))
266 / (static_cast<RealType>(count) - 1);
267 sigma = vcl_sqrt(variance);
270 this->GetMinimumOutput()->Set(minimum);
271 this->GetMaximumOutput()->Set(maximum);
272 this->GetMeanOutput()->Set(mean);
273 this->GetSigmaOutput()->Set(sigma);
274 this->GetVarianceOutput()->Set(variance);
275 this->GetSumOutput()->Set(sum);
278 template<
class TInputImage>
283 int numberOfThreads = this->GetNumberOfThreads();
286 m_Count.SetSize(numberOfThreads);
287 m_SumOfSquares.SetSize(numberOfThreads);
288 m_ThreadSum.SetSize(numberOfThreads);
289 m_ThreadMin.SetSize(numberOfThreads);
290 m_ThreadMax.SetSize(numberOfThreads);
293 m_Count.Fill(itk::NumericTraits<long>::Zero);
294 m_ThreadSum.Fill(itk::NumericTraits<RealType>::Zero);
295 m_SumOfSquares.Fill(itk::NumericTraits<RealType>::Zero);
296 m_ThreadMin.Fill(itk::NumericTraits<PixelType>::max());
297 m_ThreadMax.Fill(itk::NumericTraits<PixelType>::NonpositiveMin());
300 template<
class TInputImage>
323 realValue =
static_cast<RealType>(value);
324 if (value < m_ThreadMin[threadId])
326 m_ThreadMin[threadId] = value;
328 if (value > m_ThreadMax[threadId])
330 m_ThreadMax[threadId] = value;
333 m_ThreadSum[threadId] += realValue;
334 m_SumOfSquares[threadId] += (realValue * realValue);
337 progress.CompletedPixel();
340 template <
class TImage>
345 Superclass::PrintSelf(os, indent);
347 os << indent <<
"Minimum: "
348 <<
static_cast<typename itk::NumericTraits<PixelType>::PrintType
>(this->GetMinimum()) << std::endl;
349 os << indent <<
"Maximum: "
350 <<
static_cast<typename itk::NumericTraits<PixelType>::PrintType
>(this->GetMaximum()) << std::endl;
351 os << indent <<
"Sum: " << this->GetSum() << std::endl;
352 os << indent <<
"Mean: " << this->GetMean() << std::endl;
353 os << indent <<
"Sigma: " << this->GetSigma() << std::endl;
354 os << indent <<
"Variance: " << this->GetVariance() << std::endl;