[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