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

Karthik Krishnan Karthik.Krishnan at kitware.com
Mon Aug 8 15:38:16 EDT 2005



Torsten Rohlfing wrote:

>
> 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 like the idea of having a SpatialObjectSource. For consistency, I 
think the SpaitialObjectReader should also derive from this. With the 
current layout, of the class hierarchy, it doesn't really fit in that 
well. Julien will have more to say on that.

> 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.

If you are ok with it, we could commit this to ITK.

>
> 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
>


More information about the Insight-developers mailing list