[Insight-developers] Comments please: Prototype DTI fiber tracking in ITK

Torsten Rohlfing torsten at synapse.sri.com
Fri Aug 5 19:49:17 EDT 2005


Greetings everyone!

Just before the weekend, here's the result of my work week. It's a 
prototype implementation of a simple eigenvector-based DTI fiber 
tracking algortihm. I would appreciate any comments and suggestions.

The code is here:

http://www.stanford.edu/~rohlfing/itk_fiber_tracking_2005-08-05.tar.gz

A few remarks:

Basically, the core tracking functionality is implemented in 
itk::TensorImageStreamlineConstIterator, which is an iterator that moves 
along a tracked fiber. The iterator is initialized at a given pixel 
index in a tensor image and tracks from there by following dominant 
eigenvectors to either side. Tracking terminates when a 
segment-to-segment angle threshold is exceeded, an FA threshold is not 
met, or the FOV boundary is reached.

When the iterator is initialized at a given index in the tensor image, 
it immediately tracks the fiber through that point to both sides and 
stores all line segments (or rather - the points along the fiber) in a 
double-ended queue. This way, the iterator can subsequently move along 
the fiber bi-directionally without additional computations and with no 
numerical problems that may otherwise occur when backtracking along a fiber.

This iterator is used by itk::StreamlineFiberTrackingFilter, which takes 
a tensor image and a source and a target mask image, all of the same 
dimensions. For every non-zero pixel in the source mask image, tracking 
is performed from the corresponding tensor image pixel. All fibers are 
kept that run through at least one non-zero pixel in the target mask 
image. If there is no source mask, tracking starts from every pixel in 
the tensor image. If there is no target mask, all fibers are kept. If 
there is neither source nor target mask image, you're screwed. Nah, just 
kidding ;))

The tracking filter inherits from itk::SpatialObjectSource (also 
included in aforementioned archive) and generates an 
itk::GroupSpatialObject as its output. The group object contains all 
fibers as its children, where each fiber is represented by an 
itk::DTITubeSpatialObject object.

I also include a first, simple test in itkFiberTrackingTest.cxx, which 
basically constructs a 5x5x5 tensor volume with a single straight 
"fiber" in z-direction in the center of the volume. Note that since the 
tensors are all exactly vertical, you'll basically get five identical 
fibers as output. I am not saying it's particularly creative test case.

A final note - for the code to compile, a method needs to be added to 
itkImage that computes the Voronoi region around any given pixel. Code 
for this method is included in the archive as itkImage_patch.cxx.

Additional details, references etc. are in the source code comments 
(doxygen as usual).

As I said above, I welcome any comments and suggestions.

Best,
  Torsten

-- 
Torsten Rohlfing, PhD          SRI International, Neuroscience Program
 Research Scientist             333 Ravenswood Ave, Menlo Park, CA 94025
  Phone: ++1 (650) 859-3379      Fax: ++1 (650) 859-2743
   torsten at synapse.sri.com        http://www.stanford.edu/~rohlfing/

     "Though this be madness, yet there is a method in't"



More information about the Insight-developers mailing list