Skip to content
Snippets Groups Projects
Commit f82fa9c0 authored by Patrick Imbo's avatar Patrick Imbo
Browse files

HistogramStatisticFunction : modif des méthodes CalculateEntropy() et...

HistogramStatisticFunction : modif des méthodes CalculateEntropy() et CalculateMean() pour prendre en compte un histogramme à N-dimension
parent 0f457438
Branches
Tags
No related merge requests found
...@@ -106,10 +106,20 @@ HistogramStatisticsFunction< TInputHistogram, TOutput> ...@@ -106,10 +106,20 @@ HistogramStatisticsFunction< TInputHistogram, TOutput>
{ {
typename TInputHistogram::ConstPointer histogram = m_InputHistogram; typename TInputHistogram::ConstPointer histogram = m_InputHistogram;
unsigned int NumberOfDimension = histogram->GetSize().GetSizeDimension(); unsigned int NumberOfDimension = histogram->GetSize().GetSizeDimension();
std::vector<TOutput> GlobalMean(NumberOfDimension);
m_mean.resize(NumberOfDimension); m_mean.resize(NumberOfDimension);
if(histogram->GetTotalFrequency() == 0)
{
itkExceptionMacro(<<"Histogram must contain at least 1 element.");
}
if(NumberOfDimension > 2)
{
itkExceptionMacro(<<"Histogram must have 1 or 2 dimension.");
}
for( unsigned int noDim = 0; noDim < NumberOfDimension; noDim++ ) for( unsigned int noDim = 0; noDim < NumberOfDimension; noDim++ )
{ {
MeasurementType mean = itk::NumericTraits<MeasurementType>::Zero; MeasurementType mean = itk::NumericTraits<MeasurementType>::Zero;
...@@ -129,37 +139,38 @@ void ...@@ -129,37 +139,38 @@ void
HistogramStatisticsFunction< TInputHistogram, TOutput> HistogramStatisticsFunction< TInputHistogram, TOutput>
::CalculateCovariance() ::CalculateCovariance()
{ {
#if 0 CalculateMean();
typename TInputHistogram::ConstPointer histogram = m_InputHistogram;
// TODO: as an improvement, the class could accept multi-dimensional histograms typename TInputHistogram::ConstPointer histogram = m_InputHistogram;
// and the user could specify the dimension to apply the algorithm to.
if (histogram->GetSize().GetSizeDimension() != 1)
{
itkExceptionMacro(<<"Histogram must be 1-dimensional.");
}
// compute global mean unsigned int NumberOfDimension = histogram->GetSize().GetSizeDimension();
typename TInputHistogram::ConstIterator iter = histogram->Begin() ; m_covariance.resize(NumberOfDimension*NumberOfDimension);
typename TInputHistogram::ConstIterator end = histogram->End() ;
RealType covariance = itk::NumericTraits<RealType>::Zero; if(histogram->GetTotalFrequency() == 0)
FrequencyType globalFrequency = histogram->GetTotalFrequency();
if(globalFrequency == 0)
{ {
itkExceptionMacro(<<"Histogram must contain at least 1 element."); itkExceptionMacro(<<"Histogram must contain at least 1 element.");
} }
while (iter != end)
for( unsigned int noDimX = 0; noDimX < NumberOfDimension; noDimX++ )
for( unsigned int noDimY = 0; noDimY < NumberOfDimension; noDimY++ )
{ {
covariance += static_cast<RealType>(iter.GetFrequency()) MeasurementType covariance = itk::NumericTraits<MeasurementType>::Zero;
* ( static_cast<RealType>(iter.GetMeasurementVector()[0]) for (unsigned int i = 0; i < histogram->GetSize()[noDimX]; i++)
-static_cast<RealType>(m_mean) ); for (unsigned int j = 0; j < histogram->GetSize()[noDimY]; j++)
++iter ; {
} MeasurementType valX = histogram->GetMeasurement(i, noDimX);
covariance /= static_cast<RealType>(globalFrequency); MeasurementType valY = histogram->GetMeasurement(j, noDimY);
FrequencyType freqX = histogram->GetFrequency(i, noDimX);
FrequencyType freqY = histogram->GetFrequency(j, noDimY);
valX -= static_cast<MeasurementType>(m_mean[noDimX]);
valY -= static_cast<MeasurementType>(m_mean[noDimY]);
covariance += ( (valX*freqX)*(valY*freqY) );
}
covariance /= histogram->GetTotalFrequency();
m_covariance[noDimX*NumberOfDimension+noDimY] = static_cast<TOutput>(covariance);
}
m_covariance = static_cast<OutputType>(covariance);
#endif
} }
template< class TInputHistogram, class TOutput > template< class TInputHistogram, class TOutput >
......
...@@ -82,8 +82,8 @@ int otbHistogramStatisticsFunction(int argc, char* argv[]) ...@@ -82,8 +82,8 @@ int otbHistogramStatisticsFunction(int argc, char* argv[])
std::cout << "Error in mean estimation" << std::endl; std::cout << "Error in mean estimation" << std::endl;
return EXIT_FAILURE; return EXIT_FAILURE;
} }
/*
Covariance = HistogramStatisticsFunction->GetCovariance(); Covariance = HistogramStatisticsFunction->GetCovariance()[0];
std::cout << "Covariance 1 : " << Covariance << std::endl; std::cout << "Covariance 1 : " << Covariance << std::endl;
if( Covariance != 0 ) if( Covariance != 0 )
...@@ -91,7 +91,7 @@ int otbHistogramStatisticsFunction(int argc, char* argv[]) ...@@ -91,7 +91,7 @@ int otbHistogramStatisticsFunction(int argc, char* argv[])
std::cout << "Error in covariance estimation" << std::endl; std::cout << "Error in covariance estimation" << std::endl;
return EXIT_FAILURE; return EXIT_FAILURE;
} }
*/
// create histogram just all value equal to zero except the first one // create histogram just all value equal to zero except the first one
for (HistogramType::Iterator iter = histogram->Begin(); iter != histogram->End(); ++iter) for (HistogramType::Iterator iter = histogram->Begin(); iter != histogram->End(); ++iter)
{ {
...@@ -124,8 +124,8 @@ int otbHistogramStatisticsFunction(int argc, char* argv[]) ...@@ -124,8 +124,8 @@ int otbHistogramStatisticsFunction(int argc, char* argv[])
std::cout << "Error in mean estimation" << std::endl; std::cout << "Error in mean estimation" << std::endl;
return EXIT_FAILURE; return EXIT_FAILURE;
} }
/*
Covariance = HistogramStatisticsFunction->GetCovariance(); Covariance = HistogramStatisticsFunction->GetCovariance()[0];
std::cout << "Covariance 2 : " << Covariance << std::endl; std::cout << "Covariance 2 : " << Covariance << std::endl;
if( Covariance != 0 ) if( Covariance != 0 )
...@@ -133,6 +133,6 @@ int otbHistogramStatisticsFunction(int argc, char* argv[]) ...@@ -133,6 +133,6 @@ int otbHistogramStatisticsFunction(int argc, char* argv[])
std::cout << "Error in covariance estimation" << std::endl; std::cout << "Error in covariance estimation" << std::endl;
return EXIT_FAILURE; return EXIT_FAILURE;
} }
*/
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment