📄 itkvariabledimensionhistogram.txx
字号:
/*=========================================================================
Program: Insight Segmentation & Registration Toolkit
Module: $RCSfile: itkVariableDimensionHistogram.txx,v $
Language: C++
Date: $Date: 2008-01-16 19:31:11 $
Version: $Revision: 1.6 $
Copyright (c) Insight Software Consortium. All rights reserved.
See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef _itkHistogram_txx
#define _itkHistogram_txx
#include "itkVariableDimensionHistogram.h"
#include "itkNumericTraits.h"
namespace itk{
namespace Statistics{
template< class TMeasurement,
class TFrequencyContainer>
VariableDimensionHistogram<TMeasurement, TFrequencyContainer>
::VariableDimensionHistogram()
{
m_ClipBinsAtEnds = true;
m_FrequencyContainer = FrequencyContainerType::New() ;
}
template< class TMeasurement,
class TFrequencyContainer>
void VariableDimensionHistogram<TMeasurement, TFrequencyContainer>
::SetMeasurementVectorSize( const MeasurementVectorSizeType s )
{
if( s == this->GetMeasurementVectorSize() )
{
return;
}
if( (m_OffsetTable.Size() != 0) ||
(m_Size.Size() != 0) ||
(m_TempIndex.Size() != 0) ||
(m_TempMeasurementVector.Size() != 0))
{
itkWarningMacro( << "Destructively resizing paramters of the histogram" );
}
Superclass::SetMeasurementVectorSize( s );
m_OffsetTable.SetSize( s + 1 );
m_OffsetTable.Fill( 0 );
m_Size.SetSize( s );
m_TempIndex.SetSize( s );
m_TempMeasurementVector.SetSize( s );
this->Modified();
}
template< class TMeasurement,
class TFrequencyContainer>
unsigned int
VariableDimensionHistogram<TMeasurement, TFrequencyContainer>
::Size() const
{
if( this->GetMeasurementVectorSize() == 0 )
{
return 0;
}
unsigned int size = 1 ;
for (unsigned int i = 0 ; i < this->GetMeasurementVectorSize() ; i++)
{
size *= m_Size[i] ;
}
return size ;
}
template< class TMeasurement,
class TFrequencyContainer>
void
VariableDimensionHistogram<TMeasurement, TFrequencyContainer>
::Initialize(const SizeType &size)
{
MeasurementVectorSizeType s =
MeasurementVectorTraits::Assert( size, this->GetMeasurementVectorSize(),
"Size mismatch in VariableDimensionHistogram::Initialize(const SizeType &size)");
if( s )
{
this->SetMeasurementVectorSize( size.Size() );
}
m_Size = size ;
// creates offset table which will be used for generation of
// instance identifiers.
InstanceIdentifier num = 1 ;
m_OffsetTable[0] = num ;
for (unsigned int i = 0 ; i < this->GetMeasurementVectorSize() ; i++)
{
num *= m_Size[i] ;
m_OffsetTable[i + 1] = num;
}
m_NumberOfInstances = num ;
// adjust the sizes of min max value containers
unsigned int dim;
m_Min.resize(this->GetMeasurementVectorSize());
for ( dim = 0; dim < this->GetMeasurementVectorSize(); dim++)
{
m_Min[dim].resize(m_Size[dim]);
}
m_Max.resize(this->GetMeasurementVectorSize());
for ( dim = 0; dim < this->GetMeasurementVectorSize(); dim++)
{
m_Max[dim].resize(m_Size[dim]);
}
// initialize the frequency container
m_FrequencyContainer->Initialize(m_OffsetTable[ this->GetMeasurementVectorSize() ]) ;
this->SetToZero();
}
template< class TMeasurement,
class TFrequencyContainer>
void
VariableDimensionHistogram<TMeasurement, TFrequencyContainer>
::SetToZero()
{
m_FrequencyContainer->SetToZero();
}
template< class TMeasurement,
class TFrequencyContainer>
void
VariableDimensionHistogram<TMeasurement, TFrequencyContainer>
::Initialize(const SizeType &size, MeasurementVectorType& lowerBound,
MeasurementVectorType& upperBound)
{
this->Initialize(size) ;
// Sanity check to see if size, lowerBound and upperBound are of the
// same length.
const MeasurementVectorSizeType measurementVectorSize =
this->GetMeasurementVectorSize();
MeasurementVectorTraits::Assert( lowerBound, measurementVectorSize,
"Length mismatch: VariableDimensionHistogram::Initialize( , )");
MeasurementVectorTraits::Assert( upperBound, measurementVectorSize,
"Length mismatch: VariableDimensionHistogram::Initialize( , )");
float interval;
for ( unsigned int i = 0 ; i < measurementVectorSize; i++)
{
interval = (float) (upperBound[i] - lowerBound[i])
/ static_cast< MeasurementType >(size[i]) ;
// Set the min vector and max vector
for (unsigned int j = 0; j < static_cast< unsigned int >(size[i] - 1) ; j++)
{
this->SetBinMin(i, j, (MeasurementType)(lowerBound[i] +
((float)j * interval))) ;
this->SetBinMax(i, j, (MeasurementType)(lowerBound[i] +
(((float)j + 1) * interval)));
}
this->SetBinMin(i, size[i] - 1,
(MeasurementType)(lowerBound[i] +
(((float) size[i] - 1) * interval))) ;
this->SetBinMax(i, size[i] - 1,
(MeasurementType)(upperBound[i])) ;
}
}
/** */
template< class TMeasurement,
class TFrequencyContainer>
bool VariableDimensionHistogram<TMeasurement, TFrequencyContainer>
::GetIndex(const MeasurementVectorType & measurement,IndexType & index ) const
{
// Sanity check.. see if index is of the same length as MeasurementVectorSize;
const MeasurementVectorSizeType measurementVectorSize =
this->GetMeasurementVectorSize();
MeasurementVectorTraits::Assert( index, measurementVectorSize,
"Length mismatch: VariableDimensionHistogram::GetIndex(MeasurementVectorType, IndexType)");
MeasurementVectorTraits::Assert( measurement, measurementVectorSize,
"Length mismatch: VariableDimensionHistogram::GetIndex(MeasurementVectorType, IndexType)");
// now using something similar to binary search to find
// index.
unsigned int dim ;
int begin, mid, end ;
MeasurementType median ;
MeasurementType tempMeasurement ;
for (dim = 0 ; dim < measurementVectorSize ; dim++)
{
tempMeasurement = measurement[dim] ;
begin = 0 ;
if (tempMeasurement < m_Min[dim][begin])
{
// one of measurement is below the minimum
index[dim] = (long) m_Size[dim] ;
return false;
}
end = m_Min[dim].size() - 1 ;
if (tempMeasurement >= m_Max[dim][end])
{
// one of measurement is above the maximum
index[dim] = (long) m_Size[dim] ;
return false;
}
mid = (end + 1) / 2 ;
median = m_Min[dim][mid];
while(true)
{
if (tempMeasurement < median )
{
end = mid - 1 ;
}
else if (tempMeasurement > median)
{
if (tempMeasurement < m_Max[dim][mid])
{
index[dim] = mid ;
break ;
}
begin = mid + 1 ;
}
else
{
// measurement[dim] = m_Min[dim][med]
index[dim] = mid ;
break ;
}
mid = begin + (end - begin) / 2 ;
median = m_Min[dim][mid] ;
} // end of while
} // end of for()
return true;
}
template< class TMeasurement,
class TFrequencyContainer>
inline const typename VariableDimensionHistogram<TMeasurement, TFrequencyContainer>::IndexType&
VariableDimensionHistogram<TMeasurement, TFrequencyContainer>
::GetIndex(const InstanceIdentifier &id) const
{
InstanceIdentifier id2 = id ;
for (int i = this->GetMeasurementVectorSize() - 1 ; i > 0 ; i--)
{
m_TempIndex[i] = static_cast<IndexValueType>(id2 / m_OffsetTable[i]);
id2 -= (m_TempIndex[i] * m_OffsetTable[i]);
}
m_TempIndex[0] = static_cast<IndexValueType>(id2);
return m_TempIndex;
}
template< class TMeasurement,
class TFrequencyContainer >
inline bool
VariableDimensionHistogram<TMeasurement, TFrequencyContainer>
::IsIndexOutOfBounds(const IndexType &index) const
{
// Sanity check.. see if index is of the same length as MeasurementVectorSize;
MeasurementVectorTraits::Assert( index, this->GetMeasurementVectorSize(),
"Length mismatch: VariableDimensionHistogram::GetIndex(MeasurementVectorType, IndexType)");
for (unsigned int dim = 0 ; dim < this->GetMeasurementVectorSize() ; dim++)
{
if (index[dim] < 0 || index[dim] >= static_cast<IndexValueType>(m_Size[dim]))
{
return true ;
}
}
return false ;
}
template< class TMeasurement,
class TFrequencyContainer >
inline typename VariableDimensionHistogram<TMeasurement,
TFrequencyContainer>::InstanceIdentifier
VariableDimensionHistogram<TMeasurement, TFrequencyContainer>
::GetInstanceIdentifier(const IndexType &index) const
{
// Sanity check.. see if index is of the same length as MeasurementVectorSize;
MeasurementVectorTraits::Assert( index, this->GetMeasurementVectorSize(),
"Length mismatch: VariableDimensionHistogram::GetIndex(MeasurementVectorType, IndexType)");
InstanceIdentifier id = 0 ;
for (int i= this->GetMeasurementVectorSize() - 1 ; i > 0 ; i-- )
{
id += index[i] * m_OffsetTable[i];
}
id += index[0] ;
return id ;
}
template< class TMeasurement,
class TFrequencyContainer >
inline const typename VariableDimensionHistogram<TMeasurement,
TFrequencyContainer>::MeasurementType&
VariableDimensionHistogram<TMeasurement, TFrequencyContainer>
::GetBinMinFromValue(const unsigned int dimension, const float value ) const
{
// If the value is lower than any of min value in the VariableDimensionHistogram,
// it returns the lowest min value
if ( value <= this->m_Min[dimension][0] )
{
return this->m_Min[dimension][0];
}
// If the value is higher than any of min value in the VariableDimensionHistogram,
// it returns the highest min value
if ( value >= m_Min[dimension][m_Size[dimension]-1] )
{
return m_Min[dimension][this->m_Size[dimension]-1];
}
for ( int i=0; i < this->m_Size[dimension]; i++ )
{
if ( (value >= this->m_Min[dimension][i])
&& (value < this->m_Max[dimension][i]) )
{
return this->m_Min[dimension][i];
}
}
}
template< class TMeasurement,
class TFrequencyContainer >
inline const typename VariableDimensionHistogram< TMeasurement,
TFrequencyContainer >::MeasurementType&
VariableDimensionHistogram< TMeasurement, TFrequencyContainer >
::GetBinMaxFromValue(const unsigned int dimension, const float value ) const
{
// If the value is lower than any of max value in the VariableDimensionHistogram,
// it returns the lowest max value
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -