Dear All,
I am trying to look through the
itkGradientMagnitudeRecursiveGaussianImageFilter to figure out the pipeline
of this filter to visualize the computation process of image gradient
calculation from a CT volume dataset using this filter. However, the source
code of this filter makes me confused about the pipeline in this filter due
to my limited programming skill.
This filter consists of two major steps as far as I know: 1) image smoothing
using itkRecursiveGaussianImageFilter, and 2) image gradient calculation
using a finite difference method (Does anybody know what formula was used
for the finite difference method? I checked the source code but could not
get it).
For step 1, I wrote a code to get the smoothed image. But I am not sure
whether my code would get the same smoothed image as
itkGradientMagnitudeRecursiveGaussianImageFilter or not. Please check my
code and point out which part I missed or is not correct. Thank you very
much!
// Setup types
typedef itk::Image< float, 3 > FloatImageType;
typedef itk::Image< unsigned char, 3 > UnsignedCharImageType;
typedef itk::ImageFileReader< FloatImageType > readerType;
typedef itk::RecursiveGaussianImageFilter<
FloatImageType, FloatImageType > filterType;
// Create and setup a reader
readerType::Pointer reader = readerType::New();
reader->SetFileName( "D:/Hybrid Method/Hybrid/LEJ/Diffusion_filter/3D.dcm"
);
// Create and setup a gaussian filter
filterType::Pointer m_DerivativeFilter = filterType::New();
m_DerivativeFilter->SetInput( reader->GetOutput() );
//m_DerivativeFilter->SetDirection(1); // "x" axis
m_DerivativeFilter->SetFirstOrder();
m_DerivativeFilter->SetSigma(1.3);
m_DerivativeFilter->SetNormalizeAcrossScale(true);
m_DerivativeFilter->ReleaseDataFlagOn();
filterType::Pointer m_SmoothingFilters[2];
for( unsigned int i = 0; i< 2; i++ )
{
m_SmoothingFilters[ i ] = filterType::New();
m_SmoothingFilters[ i ]->SetZeroOrder();
m_SmoothingFilters[ i ]->SetNormalizeAcrossScale( true );
m_SmoothingFilters[ i ]->SetSigma( 1.3 );
}
m_SmoothingFilters[0]->SetInput( m_DerivativeFilter->GetOutput() );
for( unsigned int i = 1; i< 2; i++ )
{
m_SmoothingFilters[ i ]->SetInput(
m_SmoothingFilters[i-1]->GetOutput() );
}
typedef itk::CastImageFilter< FloatImageType, UnsignedCharImageType >
CastFilterType;
CastFilterType::Pointer caster1 = CastFilterType::New();
caster1->SetInput( m_SmoothingFilters[1]->GetOutput() );
typedef itk::ImageFileWriter< UnsignedCharImageType > WriterType;
WriterType::Pointer writer1 = WriterType::New();
writer1->SetFileName( "RecusiveGaussian.dcm" );
writer1->SetInput(caster1->GetOutput());
writer1->Update();
return EXIT_SUCCESS;
Best regards,
Xiaopeng
_______________________________________________
Powered by www.kitware.com
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Kitware offers ITK Training Courses, for more information visit:
http://kitware.com/products/protraining.php
Please keep messages on-topic and check the ITK FAQ at:
http://www.itk.org/Wiki/ITK_FAQ
Follow this link to subscribe/unsubscribe:
http://www.itk.org/mailman/listinfo/insight-developers