[Insight-users] BSpline deformable transform Helper class

Luis Ibanez luis.ibanez at kitware.com
Mon May 12 13:09:52 EDT 2008


Hi Federico,

Thanks a lot for your additional detailed explanation.

Given that you are registering a line (actually a sequence of points)
to an image,  The BSpline deformable transform is probably not what
you want to use here, basically because it this transform is defined
over a grid in the image and will result in an over-parameterization
of your problem.

That is, in order to use this transform you have to define it in a
grid that is large enough to cover your curve (the coronary artery)
and that will result in having many "unused" cells of the grid.


You should consider to use instead any of the KernelTransform and
making it start with some of the key points in your curve (e.g.
points of max curvature) to be "source" landmarks. In this way your 
optimizer will be able to focus on only those N landmarks that will
actually guide the position of the curve. The "target" landmarks could
be initialized to be the same points mapped in to the image, and then
the optimizer will explore new positions of the "source" landmarks.


The bad news... is that we never got to implement the Jacobian of
the KernelTransforms, so currently you can't use them along with
Metrics that compute their derivatives by composing the Transform
Jacobian with the gradient of the moving image.


You could however use optimizers such as:


         * Amoeba optimizer
         * OnePlusOneEvolutionary optimizer


since they do not require your metric to compute derivatives.


Please let us know if you run into any problems when trying
the KernelTransforms.


     Regards,


        Luis


--------------------
fjlb at duke.edu wrote:
> Hi Luis,
> 
> Thanks for the reply. Here's a quick overview on what I'm doing. My main 
> goal is
> to track motion of the coronary artery tree (axis) from images obtained 
> from CT
> angiography. In order to do so, I have an initial model of the axis 
> represented
> by a line spatial object. I also use a vessel enhancing filter that 
> enhances
> bright tubular structures (creates vesselness images).  So these two are 
> the
> inputs of my registration process.
> 
> Initially I used a parametric curve transform (wrote ourself - basically
> transforms each point in the line spatial object by itself), gradient 
> descent
> optimizer, and I wrote the metric too (metric calculates fitness based on
> snakes energy function). The registration moves the points/curve to 
> points of
> max vesselness points. I have an initial estimate of the curve (which is 
> pretty
> accurate) and I register it to my first frame (I have 10 frames through the
> cardiac cycle), I use the results of this registration process as the 
> initial
> estimate of the 2nd frame and so on. The algorithm works decently, 
> however when
> there's a lot of motion the algorithm fails and the curve slides too. I 
> suspect
> that the problem is the transformation. Therefore, I want to implement the
> Bspline transform to solve this problem.
> 
> When I run the code with my new parameters the transformed points look 
> as if
> they never move, and after a few iterations the algorithm crashes. Now, 
> I don't
> know if the problem is the way the optimizer is set up or how the grid 
> is set up
> either. Should I use two images instead of an image and a spatial object?
> Anyway, I hope this gives you an insight on what I'm working on. I 
> copied and
> paste the code below if you're interested.
> 
> Thanks,
> 
> Federico
> 
> 
>
> 
> 
> Quoting Luis Ibanez <luis.ibanez at kitware.com>:
> 
>>
>> Hi Federico,
>>
>> Could you please elaborate a little bit more on what you
>> are trying to do ?
>>
>> From your description, it seems that you have a curve in 3D
>> that you want to deform in order to match a feature of a
>> 3D image.  Is that right ?
>>
>> Is this like trying to fit a 3D curve to a blood vessel in
>> a 3D image ?
>>
>> If you only need to map the point of the 3D curve into the
>> image, then using a BSpline deformable transform for this
>> purpose may be an overkill.
>>
>> You may find more useful to apply the any of the KernelTransforms
>> that are basically landmark-based transforms. You could select
>> key point from the 3D curve and map them to key locations in the
>> 3D image. Then use this collection of point-pairs as fixed and
>> moving landmarks to feed a KernelTransform. Finally use that
>> transform form mapping all the intermediate points form the curve.
>>
>> Please let us know if this may make sense in the context of your
>> application.
>>
>>
>>    Thanks
>>
>>
>>       Luis
>>
>>
>> ------------------
>> fjlb at duke.edu wrote:
>>
>>> Hi all,
>>>
>>> I've been trying to implement the bspline transform regularly and now 
>>> with the
>>> helper class published a couple of days ago. Basically I have a curve 
>>> in 3D
>>> represented by a line spatial object that I want to register to a 
>>> fixed image.
>>> I'm using the spatial object to image registration framework to align 
>>> the curve
>>> to the image. My main problem is how to create the grid in which the 
>>> curve to be
>>> deformed sits. Ideally I want to have the same number of control 
>>> points than
>>> pixels within  the grid. Say, if I have a 3x3x3 cubic grid then I 
>>> want 4x4x4
>>> control points. I want to know how to initialize this type of 
>>> procedure and if
>>> the helper class would be useful for my usage.
>>>
>>> Thanks,
>>>
>>>
>>> Federico
>>>
>>> _______________________________________________
>>> Insight-users mailing list
>>> Insight-users at itk.org
>>> http://www.itk.org/mailman/listinfo/insight-users
>>>
>>
> 
> 
> 
> 


More information about the Insight-users mailing list