[Insight-users] Gradient vector flow calculation

Arunachalam Kana Kana.Arunachalam at fh-wels.at
Thu Feb 11 11:31:18 EST 2010


Hi Alberto,

 

Thank you for your code. At this point i just want to visualise the vector to understand what the algorithm is doing and not creating a display window. So, i am trying to look at the vector field using paraview, which is going pretty good.

There are some tutorial which help to load data and view the vector fields. 

 

Regards,

Kana 

 

From: Gomez, Alberto [mailto:alberto.gomez at kcl.ac.uk] 
Sent: 11 February 2010 12:14
To: Kishore Mosaliganti
Cc: Arunachalam Kana; insight-users at itk.org
Subject: Re: [Insight-users] Gradient vector flow calculation

 


Hi,

You can visualize the vector field as arrows (or any other shape) using vtkGlyph. I found it quite unclear when I first did it and I don't know if I am doing it the best way, but here is an example of what works for me.

You need to provide a set of points and a set of vectors corresponding to those points (in world coords). I store them in two std::vector , "directions" and "positions":


//positions
    int num_pts = directions.size();
    vtkSmartPointer<vtkPoints> pts = vtkSmartPointer<vtkPoints>::New();
    pts->SetNumberOfPoints(num_pts);

    //directions
    vtkSmartPointer<vtkDoubleArray> vecArr = vtkSmartPointer<vtkDoubleArray>::New();
    vecArr->SetNumberOfComponents(3);
    vecArr->SetNumberOfTuples(num_pts);

    for( int i=0; i < num_pts; i++)
    {
        pts->InsertPoint(i, positions[i][0], positions[i][1], positions[i][2]);
        vecArr->InsertTuple3(i, directions[i][0]*sf, directions[i][1]*sf, directions[i][2]*sf);
    }

    // put vectors and positions into a grid which will be the glyph's input
    vtkSmartPointer<vtkUnstructuredGrid> uGrid = vtkSmartPointer<vtkUnstructuredGrid>::New();
        uGrid->SetPoints(pts);
        uGrid->GetPointData()->SetVectors(vecArr);



    // glyph construction
    // build arrow
    vtkSmartPointer<vtkArrowSource> arrow = vtkSmartPointer<vtkArrowSource>::New();
 
    //build arrow Field
    vtkSmartPointer<vtkGlyph3D> glyph = vtkSmartPointer<vtkGlyph3D>::New();
        glyph->SetInput(uGrid);
        glyph->SetSource(arrow->GetOutput());
        glyph->SetScaleModeToScaleByVector();

   //display
        vtkSmartPointer<vtkPolyDataMapper> gMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
            gMapper->SetInput( glyph->GetOutput());
            gMapper->ScalarVisibilityOn();
            gMapper->SetScalarRange(uGrid->GetScalarRange());

        vtkSmartPointer<vtkActor> gactor = vtkSmartPointer<vtkActor>::New();
            gactor->SetMapper(gMapper);
            gactor->GetProperty()->SetColor(color);
        ren->AddActor(gactor);


Hope this helps,


Alberto






Kishore Mosaliganti wrote: 

For 2, you can use Paraview to visualize the vector field.
 
Kishore
 
On Wed, Feb 10, 2010 at 8:35 AM, Arunachalam Kana
<Kana.Arunachalam at fh-wels.at> <mailto:Kana.Arunachalam at fh-wels.at>  wrote:
  

	Hi User,
	 
	 
	 
	My goal is to implement insight journal paper:
	 
	"Edge based tube detection for coronary artery centerline extraction"
	 
	 
	 
	From the paper i understood that i have to calculate the following:
	 
	1. Gradient vector field
	 
	2. Anisotropic diffusion of gradient vector
	 
	3. Gradient vector flow
	 
	4. Hessian matrix
	 
	 
	 
	I calculate the gradientimage using itkGradientImageFilter. I use
	itkGradientVectorFlowImageFilter
	 
	to directly calculate the gradient vector flow as it is given the diffusion
	is already inbuilt in
	 
	itkGradientVectorFlowImageFilter.
	 
	 
	 
	I use QVTK for visualisation. The image is loaded as vtk image. To apply
	 
	itk algorithm, i convert the vtk image to itk image using vtkKWEITKImage.cxx
	 
	from vtkedge. The same file is used for itk image to vtk image for display.
	 
	 
	 
	typedef itk::Image< T, 3 >   InputImageType; //input image type
	 
	typedef itk::Image< float, 3 >   OutputImageType; //outputimage type
	 
	 
	 
	/// cast filter which converts any inputimage type to outputimage type
	 
	typedef itk::CastImageFilter <InputImageType, OutputImageType> castType;
	 
	castType::Pointer castfilter = castType::New();
	 
	 
	 
	// image is vtkKWEITKImage object
	 
	castfilter->SetInput( dynamic_cast< InputImageType * >( image->GetITKImage()
	) );
	 
	 
	 
	//itk vector image declaration
	 
	typedef itk::CovariantVector<float, 3> VectorPixelType;
	 
	typedef itk::Image<VectorPixelType, 3> VectorImageType;
	 
	 
	 
	//calculate the gradient vector of image
	 
	typedef itk::GradientImageFilter <OutputImageType, float, float>
	GradientType;
	 
	GradientType::Pointer gradient = GradientType::New();
	 
	gradient->SetInput(castfilter->GetOutput());
	 
	gradient->Update();
	 
	 
	 
	//calculation of gradient vector flow from diffused gradient vector
	 
	typedef itk::GradientVectorFlowImageFilter<VectorImageType, VectorImageType,
	double> VectorFlowType;
	 
	VectorFlowType::Pointer flowfilter = VectorFlowType::New();
	 
	flowfilter->SetInput(gradient->GetOutput());
	 
	 
	 
	//observer of algorithm execution for time
	 
	p->Observe( flowfilter );
	 
	 
	 
	//the image object is updated with output image from flowfilter
	 
	image->SetImage( flowfilter->GetOutput( ) );
	 
	image->Modified();
	 
	 
	 
	flowfilter->ReleaseDataFlagOn();
	 
	return EXIT_SUCCESS;
	 
	 
	 
	Questions:
	 
	 
	 
	1. I would like to know whether itkGradientVectorFlowImageFilter computes
	anisotropic diffusion or gaussian diffusion ?
	 
	 
	 
	2. I want to visualise the gradient vector flow as arrows. How can i achieve
	this visualisation?
	 
	 
	 
	3. If there is any example, which would help me fully or partially I would
	like to know.
	 
	 
	 
	Thank you in advance.
	 
	 
	 
	Regards,
	 
	Kana
	 
	 
	 
	_____________________________________
	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://www.kitware.com/products/protraining.html
	 
	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-users
	 
	 
	    

_____________________________________
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://www.kitware.com/products/protraining.html
 
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-users
  

 

-- 

Alberto Gómez

Division of Imaging Sciences 
The Rayne Institute
4th Floor, Lambeth Wing
St Thomas' Hospital
London SE1 7EH 

phone: +44 (0) 20 718 88364
email: alberto.gomez at kcl.ac.uk 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20100211/bcdb608e/attachment-0001.htm>


More information about the Insight-users mailing list