17 #ifndef __itkHessianToObjectnessMeasureImageFilter_txx
18 #define __itkHessianToObjectnessMeasureImageFilter_txx
26 #include "vnl/vnl_math.h"
34 template <
typename TInputImage,
typename TOutputImage >
43 m_ScaleObjectnessMeasure =
true;
46 m_ObjectDimension = 1;
47 m_BrightObject =
true;
51 template <
typename TInputImage,
typename TOutputImage >
56 if (m_ObjectDimension >= ImageDimension)
58 itkExceptionMacro(
"ObjectDimension must be lower than ImageDimension." );
63 template <
typename TInputImage,
typename TOutputImage >
69 typename OutputImageType::Pointer output = this->GetOutput();
70 typename InputImageType::ConstPointer input = this->GetInput();
73 ProgressReporter progress(
this, threadId, outputRegionForThread.GetNumberOfPixels(), 1000 / this->GetNumberOfThreads() );
77 CalculatorType eigenCalculator( ImageDimension );
91 eigenCalculator.ComputeEigenValues( it.
Get(), eigenValues );
99 bool signConstraintsSatisfied =
true;
100 for (
unsigned int i=m_ObjectDimension; i<ImageDimension; i++)
102 if ((m_BrightObject && sortedEigenValues[i] > 0.0) ||
103 (!m_BrightObject && sortedEigenValues[i] < 0.0) )
105 signConstraintsSatisfied =
false;
110 if (!signConstraintsSatisfied)
112 oit.
Set(NumericTraits< OutputPixelType >::Zero);
115 progress.CompletedPixel();
120 for (
unsigned int i=0; i<ImageDimension; i++)
122 sortedAbsEigenValues[i] = vnl_math_abs(sortedEigenValues[i]);
126 double objectnessMeasure = 1.0;
129 if (m_ObjectDimension < ImageDimension-1)
131 double rA = sortedAbsEigenValues[m_ObjectDimension];
132 double rADenominatorBase = 1.0;
133 for (
unsigned int j=m_ObjectDimension+1; j<ImageDimension; j++)
135 rADenominatorBase *= sortedAbsEigenValues[j];
137 if (vcl_fabs(rADenominatorBase) > 0.0)
139 if ( vcl_fabs( m_Alpha ) > 0.0 )
141 rA /= vcl_pow(rADenominatorBase, 1.0 / (ImageDimension-m_ObjectDimension-1));
142 objectnessMeasure *= 1.0 - vcl_exp(- 0.5 * vnl_math_sqr(rA) / vnl_math_sqr(m_Alpha));
147 objectnessMeasure = 0.0;
151 if (m_ObjectDimension > 0)
153 double rB = sortedAbsEigenValues[m_ObjectDimension-1];
154 double rBDenominatorBase = 1.0;
155 for (
unsigned int j=m_ObjectDimension; j<ImageDimension; j++)
157 rBDenominatorBase *= sortedAbsEigenValues[j];
159 if (vcl_fabs(rBDenominatorBase) > 0.0 && vcl_fabs( m_Beta ) > 0.0 )
161 rB /= vcl_pow(rBDenominatorBase, 1.0 / (ImageDimension-m_ObjectDimension));
163 objectnessMeasure *= vcl_exp(- 0.5 * vnl_math_sqr(rB) / vnl_math_sqr(m_Beta));
168 objectnessMeasure = 0.0;
172 if ( vcl_fabs( m_Gamma ) > 0.0 )
174 double frobeniusNormSquared = 0.0;
175 for (
unsigned int i=0; i<ImageDimension; i++)
177 frobeniusNormSquared += vnl_math_sqr(sortedAbsEigenValues[i]);
179 objectnessMeasure *= 1.0 - vcl_exp(- 0.5 * frobeniusNormSquared / vnl_math_sqr(m_Gamma));
183 if (m_ScaleObjectnessMeasure)
185 objectnessMeasure *= sortedAbsEigenValues[ImageDimension-1];
189 oit.
Set( static_cast< OutputPixelType >(objectnessMeasure));
194 progress.CompletedPixel();
198 template <
typename TInputImage,
typename TOutputImage >
203 Superclass::PrintSelf(os, indent);
205 os << indent <<
"Alpha: " << m_Alpha << std::endl;
206 os << indent <<
"Beta: " << m_Beta << std::endl;
207 os << indent <<
"Gamma: " << m_Gamma << std::endl;
208 os << indent <<
"ScaleObjectnessMeasure: " << m_ScaleObjectnessMeasure << std::endl;
209 os << indent <<
"ObjectDimension: " << m_ObjectDimension << std::endl;
210 os << indent <<
"BrightObject: " << m_BrightObject << std::endl;