17 #ifndef __itkLaplacianRecursiveGaussianImageFilter_txx
18 #define __itkLaplacianRecursiveGaussianImageFilter_txx
29 template <
typename TInputImage,
typename TOutputImage >
34 m_NormalizeAcrossScale =
false;
36 m_ProgressCommand = CommandType::New();
37 m_ProgressCommand->SetCallbackFunction(
this, & Self::ReportProgress );
40 for(
unsigned int i = 0; i<ImageDimension-1; i++ )
42 m_SmoothingFilters[ i ] = GaussianFilterType::New();
43 m_SmoothingFilters[ i ]->SetOrder( GaussianFilterType::ZeroOrder );
44 m_SmoothingFilters[ i ]->SetNormalizeAcrossScale( m_NormalizeAcrossScale );
45 m_SmoothingFilters[ i ]->AddObserver(
ProgressEvent(), m_ProgressCommand );
46 m_SmoothingFilters[ i ]->ReleaseDataFlagOn();
49 m_DerivativeFilter = DerivativeFilterType::New();
50 m_DerivativeFilter->SetOrder( DerivativeFilterType::SecondOrder );
51 m_DerivativeFilter->SetNormalizeAcrossScale( m_NormalizeAcrossScale );
52 m_DerivativeFilter->AddObserver(
ProgressEvent(), m_ProgressCommand );
54 m_DerivativeFilter->SetInput( this->GetInput() );
56 m_SmoothingFilters[0]->SetInput( m_DerivativeFilter->GetOutput() );
58 for(
unsigned int i = 1; i<ImageDimension-1; i++ )
60 m_SmoothingFilters[ i ]->SetInput(
61 m_SmoothingFilters[i-1]->GetOutput() );
64 m_CumulativeImage = CumulativeImageType::New();
66 this->SetSigma( 1.0 );
73 template <
typename TInputImage,
typename TOutputImage>
83 const float filterProgress = internalFilter->
GetProgress();
84 const float weightedProgress = filterProgress / ImageDimension;
85 m_Progress += weightedProgress;
86 this->UpdateProgress( m_Progress );
93 template <
typename TInputImage,
typename TOutputImage>
99 for(
unsigned int i = 0; i<ImageDimension-1; i++ )
101 m_SmoothingFilters[ i ]->SetSigma( sigma );
103 m_DerivativeFilter->SetSigma( sigma );
112 template <
typename TInputImage,
typename TOutputImage>
118 m_NormalizeAcrossScale = normalize;
120 for(
unsigned int i = 0; i<ImageDimension-1; i++ )
122 m_SmoothingFilters[ i ]->SetNormalizeAcrossScale( normalize );
124 m_DerivativeFilter->SetNormalizeAcrossScale( normalize );
134 template <
typename TInputImage,
typename TOutputImage>
141 Superclass::GenerateInputRequestedRegion();
147 image->SetRequestedRegion( this->GetInput()->GetLargestPossibleRegion() );
155 template <
typename TInputImage,
typename TOutputImage>
160 TOutputImage *out =
dynamic_cast<TOutputImage*
>(output);
164 out->SetRequestedRegion( out->GetLargestPossibleRegion() );
171 template <
typename TInputImage,
typename TOutputImage >
177 itkDebugMacro(<<
"LaplacianRecursiveGaussianImageFilter generating data ");
181 const typename TInputImage::ConstPointer inputImage( this->GetInput() );
183 typename TOutputImage::Pointer outputImage( this->GetOutput() );
185 outputImage = this->GetOutput();
187 outputImage->SetRegions( inputImage->GetBufferedRegion() );
189 outputImage->Allocate();
191 m_CumulativeImage->SetRegions( inputImage->GetBufferedRegion() );
192 m_CumulativeImage->Allocate();
193 m_CumulativeImage->FillBuffer( NumericTraits< InternalRealType >::Zero );
195 m_DerivativeFilter->SetInput( inputImage );
197 for(
unsigned int dim=0; dim < ImageDimension; dim++ )
201 while( i< ImageDimension)
207 m_SmoothingFilters[ i ]->SetDirection( j );
211 m_DerivativeFilter->SetDirection( dim );
215 lastFilter->Update();
224 derivativeImage->GetRequestedRegion() );
228 m_CumulativeImage->GetRequestedRegion() );
230 const RealType spacing = inputImage->GetSpacing()[ dim ];
231 const RealType spacing2 = spacing*spacing;
235 while( !it.IsAtEnd() )
237 const RealType value = it.Get() / spacing2;
238 const RealType cumulated = ot.Get() + value;
250 outputImage->GetRequestedRegion() );
254 m_CumulativeImage->GetRequestedRegion() );
258 while( !it.IsAtEnd() )
260 ot.Set( static_cast<OutputPixelType>( it.Get() ) );
267 template <
typename TInputImage,
typename TOutputImage>
272 Superclass::PrintSelf(os,indent);
273 os <<
"NormalizeAcrossScale: " << m_NormalizeAcrossScale << std::endl;