17 #ifndef __itkMultiScaleHessianBasedMeasureImageFilter_txx
18 #define __itkMultiScaleHessianBasedMeasureImageFilter_txx
23 #include "vnl/vnl_math.h"
31 template <
typename TInputImage,
32 typename THessianImage,
33 typename TOutputImage>
34 MultiScaleHessianBasedMeasureImageFilter
35 <TInputImage,THessianImage,TOutputImage>
38 m_NonNegativeHessianBasedMeasure =
true;
43 m_NumberOfSigmaSteps = 10;
44 m_SigmaStepMethod = Self::LogarithmicSigmaSteps;
46 m_HessianFilter = HessianFilterType::New();
47 m_HessianToMeasureFilter =
NULL;
50 m_UpdateBuffer = UpdateBufferType::New();
52 m_GenerateScalesOutput =
false;
53 m_GenerateHessianOutput =
false;
56 typename HessianImageType::Pointer hessianImage = HessianImageType::New();
62 template <
typename TInputImage,
63 typename THessianImage,
64 typename TOutputImage>
67 <TInputImage,THessianImage,TOutputImage>
75 template <
typename TInputImage,
76 typename THessianImage,
77 typename TOutputImage>
79 <TInputImage,THessianImage,TOutputImage>::DataObjectPointer
81 <TInputImage,THessianImage,TOutputImage>
82 ::MakeOutput(
unsigned int idx)
86 return static_cast<DataObject*
>(ScalesImageType::New().GetPointer());
90 return static_cast<DataObject*
>(HessianImageType::New().GetPointer());
92 return Superclass::MakeOutput(idx);
95 template <
typename TInputImage,
96 typename THessianImage,
97 typename TOutputImage>
100 <TInputImage,THessianImage,TOutputImage>
101 ::AllocateUpdateBuffer()
106 typename TOutputImage::Pointer output = this->GetOutput();
110 m_UpdateBuffer->CopyInformation(output);
112 m_UpdateBuffer->SetRequestedRegion(output->GetRequestedRegion());
113 m_UpdateBuffer->SetBufferedRegion(output->GetBufferedRegion());
114 m_UpdateBuffer->Allocate();
118 if (m_NonNegativeHessianBasedMeasure)
120 m_UpdateBuffer->FillBuffer( itk::NumericTraits< BufferValueType >::Zero );
124 m_UpdateBuffer->FillBuffer( itk::NumericTraits< BufferValueType >::NonpositiveMin() );
128 template <
typename TInputImage,
129 typename THessianImage,
130 typename TOutputImage>
133 <TInputImage,THessianImage,TOutputImage>
138 this->GetOutput()->SetBufferedRegion(this->GetOutput()->GetRequestedRegion());
139 this->GetOutput()->Allocate();
141 if( m_HessianToMeasureFilter.IsNull() )
143 itkExceptionMacro(
" HessianToMeasure filter is not set. Use SetHessianToMeasureFilter() " );
146 if (m_GenerateScalesOutput)
151 scalesImage->SetBufferedRegion(scalesImage->GetRequestedRegion());
152 scalesImage->Allocate();
153 scalesImage->FillBuffer(0);
156 if (m_GenerateHessianOutput)
158 typename HessianImageType::Pointer hessianImage =
161 hessianImage->SetBufferedRegion(hessianImage->GetRequestedRegion());
162 hessianImage->Allocate();
165 typename HessianImageType::PixelType zeroTensor(0.0);
166 hessianImage->FillBuffer(zeroTensor);
170 AllocateUpdateBuffer();
172 typename InputImageType::ConstPointer input = this->GetInput();
174 this->m_HessianFilter->SetInput(input);
176 this->m_HessianFilter->SetNormalizeAcrossScale(
true);
182 progress->SetMiniPipelineFilter(
this);
185 if ( m_NumberOfSigmaSteps > 0 )
187 progress->RegisterInternalFilter( this->m_HessianFilter, .5/m_NumberOfSigmaSteps );
188 progress->RegisterInternalFilter( this->m_HessianToMeasureFilter, .5/m_NumberOfSigmaSteps );
191 double sigma = m_SigmaMinimum;
195 while (sigma <= m_SigmaMaximum)
197 if ( m_NumberOfSigmaSteps == 0 )
202 itkDebugMacro ( <<
"Computing measure for scale with sigma = " << sigma );
204 m_HessianFilter->SetSigma( sigma );
206 m_HessianToMeasureFilter->SetInput ( m_HessianFilter->GetOutput() );
208 m_HessianToMeasureFilter->Update();
210 this->UpdateMaximumResponse(sigma);
212 sigma = this->ComputeSigmaValue( scaleLevel );
218 progress->ResetFilterProgressAndKeepAccumulatedProgress();
221 if ( m_NumberOfSigmaSteps == 1 )
245 m_UpdateBuffer->ReleaseData();
248 template <
typename TInputImage,
249 typename THessianImage,
250 typename TOutputImage>
253 <TInputImage,THessianImage,TOutputImage>
254 ::UpdateMaximumResponse(
double sigma)
268 if (m_GenerateScalesOutput)
273 if (m_GenerateHessianOutput)
289 if( oit.
Value() < it.Value() )
291 oit.
Value() = it.Value();
292 if (m_GenerateScalesOutput)
296 if (m_GenerateHessianOutput)
298 ohit.
Value() = hit.Value();
303 if (m_GenerateScalesOutput)
307 if (m_GenerateHessianOutput)
315 template <
typename TInputImage,
316 typename THessianImage,
317 typename TOutputImage>
320 <TInputImage,THessianImage,TOutputImage>
321 ::ComputeSigmaValue(
int scaleLevel)
325 if (m_NumberOfSigmaSteps < 2)
327 return m_SigmaMinimum;
330 switch (m_SigmaStepMethod)
332 case Self::EquispacedSigmaSteps:
334 const double stepSize = vnl_math_max(1e-10, ( m_SigmaMaximum - m_SigmaMinimum ) / (m_NumberOfSigmaSteps - 1));
335 sigmaValue = m_SigmaMinimum + stepSize * scaleLevel;
338 case Self::LogarithmicSigmaSteps:
340 const double stepSize = vnl_math_max(1e-10, ( vcl_log(m_SigmaMaximum) - vcl_log(m_SigmaMinimum) ) / (m_NumberOfSigmaSteps - 1));
341 sigmaValue = vcl_exp( vcl_log (m_SigmaMinimum) + stepSize * scaleLevel);
345 throw ExceptionObject(__FILE__, __LINE__,
"Invalid SigmaStepMethod.",ITK_LOCATION);
352 template <
typename TInputImage,
353 typename THessianImage,
354 typename TOutputImage>
357 <TInputImage,THessianImage,TOutputImage>
358 ::SetSigmaStepMethodToEquispaced()
360 this->SetSigmaStepMethod(Self::EquispacedSigmaSteps);
363 template <
typename TInputImage,
364 typename THessianImage,
365 typename TOutputImage>
368 <TInputImage,THessianImage,TOutputImage>
369 ::SetSigmaStepMethodToLogarithmic()
371 this->SetSigmaStepMethod(Self::LogarithmicSigmaSteps);
376 template <
typename TInputImage,
377 typename THessianImage,
378 typename TOutputImage>
382 <TInputImage,THessianImage,TOutputImage>
383 ::GetHessianOutput()
const
390 template <
typename TInputImage,
391 typename THessianImage,
392 typename TOutputImage>
396 <TInputImage,THessianImage,TOutputImage>
397 ::GetScalesOutput()
const
402 template <
typename TInputImage,
403 typename THessianImage,
404 typename TOutputImage>
407 <TInputImage,THessianImage,TOutputImage>
408 ::PrintSelf(std::ostream& os,
Indent indent)
const
410 Superclass::PrintSelf(os, indent);
412 os << indent <<
"SigmaMinimum: " << m_SigmaMinimum << std::endl;
413 os << indent <<
"SigmaMaximum: " << m_SigmaMaximum << std::endl;
414 os << indent <<
"NumberOfSigmaSteps: " << m_NumberOfSigmaSteps << std::endl;
415 os << indent <<
"SigmaStepMethod: " << m_SigmaStepMethod << std::endl;
416 os << indent <<
"HessianToMeasureFilter: " << m_HessianToMeasureFilter << std::endl;
417 os << indent <<
"NonNegativeHessianBasedMeasure: " << m_NonNegativeHessianBasedMeasure << std::endl;
418 os << indent <<
"GenerateScalesOutput: " << m_GenerateScalesOutput << std::endl;
419 os << indent <<
"GenerateHessianOutput: " << m_GenerateHessianOutput << std::endl;