17 #ifndef __itkStatisticsImageFilter_txx
18 #define __itkStatisticsImageFilter_txx
23 #include "itkNumericTraits.h"
28 template<
class TInputImage>
37 for (
int i=1; i < 3; ++i)
45 for (
int i=3; i < 7; ++i)
52 this->GetMinimumOutput()->Set( NumericTraits<PixelType>::max() );
53 this->GetMaximumOutput()->Set( NumericTraits<PixelType>::NonpositiveMin() );
54 this->GetMeanOutput()->Set( NumericTraits<RealType>::max() );
55 this->GetSigmaOutput()->Set( NumericTraits<RealType>::max() );
56 this->GetVarianceOutput()->Set( NumericTraits<RealType>::max() );
57 this->GetSumOutput()->Set( NumericTraits<RealType>::Zero );
61 template<
class TInputImage>
69 return static_cast<DataObject*
>(TInputImage::New().GetPointer());
72 return static_cast<DataObject*
>(PixelObjectType::New().GetPointer());
75 return static_cast<DataObject*
>(PixelObjectType::New().GetPointer());
81 return static_cast<DataObject*
>(RealObjectType::New().GetPointer());
85 return static_cast<DataObject*
>(TInputImage::New().GetPointer());
91 template<
class TInputImage>
99 template<
class TInputImage>
108 template<
class TInputImage>
116 template<
class TInputImage>
125 template<
class TInputImage>
133 template<
class TInputImage>
142 template<
class TInputImage>
150 template<
class TInputImage>
159 template<
class TInputImage>
167 template<
class TInputImage>
176 template<
class TInputImage>
184 template<
class TInputImage>
192 template<
class TInputImage>
197 Superclass::GenerateInputRequestedRegion();
198 if ( this->GetInput() )
202 image->SetRequestedRegionToLargestPossibleRegion();
206 template<
class TInputImage>
211 Superclass::EnlargeOutputRequestedRegion(data);
216 template<
class TInputImage>
223 const_cast< TInputImage *
>( this->GetInput() );
224 this->GraftOutput( image );
229 template<
class TInputImage>
234 int numberOfThreads = this->GetNumberOfThreads();
237 m_Count.SetSize(numberOfThreads);
238 m_SumOfSquares.SetSize(numberOfThreads);
239 m_ThreadSum.SetSize(numberOfThreads);
240 m_ThreadMin.SetSize(numberOfThreads);
241 m_ThreadMax.SetSize(numberOfThreads);
244 m_Count.Fill(NumericTraits<long>::Zero);
245 m_ThreadSum.Fill(NumericTraits<RealType>::Zero);
246 m_SumOfSquares.Fill(NumericTraits<RealType>::Zero);
247 m_ThreadMin.Fill(NumericTraits<PixelType>::max());
248 m_ThreadMax.Fill(NumericTraits<PixelType>::NonpositiveMin());
251 template<
class TInputImage>
260 int numberOfThreads = this->GetNumberOfThreads();
269 sum = sumOfSquares = NumericTraits<RealType>::Zero;
274 minimum = NumericTraits<PixelType>::max();
275 maximum = NumericTraits<PixelType>::NonpositiveMin();
276 for( i = 0; i < numberOfThreads; i++)
279 sum += m_ThreadSum[i];
280 sumOfSquares += m_SumOfSquares[i];
282 if (m_ThreadMin[i] < minimum)
284 minimum = m_ThreadMin[i];
286 if (m_ThreadMax[i] > maximum)
288 maximum = m_ThreadMax[i];
292 mean = sum /
static_cast<RealType>(count);
295 variance = (sumOfSquares - (sum*sum /
static_cast<RealType>(count)))
296 / (static_cast<RealType>(count) - 1);
297 sigma = vcl_sqrt(variance);
300 this->GetMinimumOutput()->Set( minimum );
301 this->GetMaximumOutput()->Set( maximum );
302 this->GetMeanOutput()->Set( mean );
303 this->GetSigmaOutput()->Set( sigma );
304 this->GetVarianceOutput()->Set( variance );
305 this->GetSumOutput()->Set( sum );
308 template<
class TInputImage>
319 ProgressReporter progress(
this, threadId, outputRegionForThread.GetNumberOfPixels());
325 realValue =
static_cast<RealType>( value );
326 if (value < m_ThreadMin[threadId])
328 m_ThreadMin[threadId] = value;
330 if (value > m_ThreadMax[threadId])
332 m_ThreadMax[threadId] = value;
335 m_ThreadSum[threadId] += realValue;
336 m_SumOfSquares[threadId] += (realValue * realValue);
339 progress.CompletedPixel();
343 template <
class TImage>
348 Superclass::PrintSelf(os,indent);
351 #if !(defined(_MSC_VER) && (_MSC_VER <= 1300))
352 os << indent <<
"Minimum: "
353 <<
static_cast<typename NumericTraits<PixelType>::PrintType
>(this->GetMinimum()) << std::endl;
354 os << indent <<
"Maximum: "
355 <<
static_cast<typename NumericTraits<PixelType>::PrintType
>(this->GetMaximum()) << std::endl;
357 os << indent <<
"Sum: " << this->GetSum() << std::endl;
358 os << indent <<
"Mean: " << this->GetMean() << std::endl;
359 os << indent <<
"Sigma: " << this->GetSigma() << std::endl;
360 os << indent <<
"Variance: " << this->GetVariance() << std::endl;