18 #ifndef __otbLocalHistogramImageFunction_txx
19 #define __otbLocalHistogramImageFunction_txx
23 #include "itkNumericTraits.h"
34 template <
class TInputImage,
class TCoordRep>
37 m_NeighborhoodRadius(1), m_NumberOfHistogramBins(128), m_HistogramMin(0), m_HistogramMax(1), m_GaussianSmoothing(true)
41 template <
class TInputImage,
class TCoordRep>
46 this->Superclass::PrintSelf(os, indent);
47 os << indent <<
" Neighborhood radius value : " << this->GetNeighborhoodRadius() << std::endl;
48 os << indent <<
" Number Of Histogram Bins : " << this->GetNumberOfHistogramBins() << std::endl;
49 os << indent <<
" Histogram Minimum : " << this->GetHistogramMin() << std::endl;
50 os << indent <<
" Histogram Maximum : " << this->GetHistogramMax() << std::endl;
53 template <
class TInputImage,
class TCoordRep>
62 size.
Fill( this->GetNumberOfHistogramBins() );
67 lowerBound.Fill( static_cast<typename HistogramType::MeasurementType>(this->GetHistogramMin()) );
68 upperBound.Fill( static_cast<typename HistogramType::MeasurementType>(this->GetHistogramMax()) );
70 histogram->Initialize(size, lowerBound, upperBound );
71 histogram->SetToZero();
74 if( !this->GetInputImage() )
80 if ( !this->IsInsideBuffer( index ) )
86 typename InputImageType::SizeType kernelSize;
87 kernelSize.Fill( m_NeighborhoodRadius );
90 it(kernelSize, this->GetInputImage(), this->GetInputImage()->GetBufferedRegion());
96 double squaredRadius = m_NeighborhoodRadius * m_NeighborhoodRadius;
97 double squaredSigma = 0.25 * squaredRadius;
100 typename InputImageType::OffsetType offset;
103 for(
int i = -(
int)m_NeighborhoodRadius; i< (int)m_NeighborhoodRadius; ++i)
105 for(
int j = -(
int)m_NeighborhoodRadius; j< (int)m_NeighborhoodRadius; ++j)
108 double currentSquaredRadius = i*i+j*j;
109 if(currentSquaredRadius < squaredRadius)
114 if(m_GaussianSmoothing)
116 gWeight = (1/vcl_sqrt(
otb::CONST_2PI*squaredSigma)) * vcl_exp(- currentSquaredRadius/(2*squaredSigma));
128 histogram->IncreaseFrequency(sample, gWeight);