[Insight-users] fast marching behavior

Luca Antiga luca.antiga at gmail.com
Fri Jan 8 11:44:59 EST 2010


Hi Dan,
  not at all, I was just referring to addressing the latest comments  
by Siqi.
I have the file on my desktop, waiting for me to handle it :-)

Luca


On Jan 8, 2010, at 5:18 PM, Dan Mueller wrote:

> Hi Luca,
>
> Is there anything wrong with the "FastMarching.patch" file attached to
> the bug entry?
>    http://public.kitware.com/Bug/view.php?id=8990
>
> 2010/1/8 Luca Antiga <luca.antiga at gmail.com>:
>> Hi Siqi,
>>  I understand your points. We have to find a solution that guarantees
>> backwards compatibility, we cannot switch to setting Alive points
>> altogether.
>> My proposal is to use the distinction between Trial points and  
>> InitialTrial
>> points in Dan's patch, and to add a flag that will decide whether
>> InitialTrial points should be updated or not. This will solve the  
>> problem
>> maintaining backwards compatibility. With no updating allowed,  
>> InitialTrial
>> points will behave just like you wish, and we won't have to write  
>> extra code
>> for computing the initial layer around Alive points.
>> Let me know if you agree with this.
>> Dan, I appreciate the lack of time, and I must say we're pretty  
>> much on the
>> same boat. However, this issue carries some weight. As soon as we  
>> devise an
>> acceptable solution, I'm willing to put in some time to commit the  
>> patch and
>> take care of the rest.
>> Best regards
>> Luca
>>
>>
>>
>> On Jan 8, 2010, at 4:06 PM, siqi chen wrote:
>>
>> The reason I suggest to let the algorithm compute the initial trial  
>> is the
>> following:
>>
>> If we want to compute a distance map to a perfect circle. The first  
>> thing we
>> do is to discretize the circle, of course, most of the points will be
>> non-integer coordinates. To initialize the algorithm, we need to  
>> find the 4
>> neighbor lattice of the discretized circle points and calculate the  
>> exact
>> distance from these lattice to the circle. In my humble opinion, in  
>> the
>> current ITK implementation, the algorithm accepts these lattice  
>> points as
>> "TrialPoints". As I illustrated before, since the FMM method will  
>> update the
>> values of trial points if the new value is smaller, it is very  
>> likely that
>> after the FMM sweeping, the value of the these lattice (the  
>> immediate 4
>> neighbors of the circle) will change. This will introduce large  
>> errors if we
>> compare the zero iso curve of the result distance to the initial  
>> circle.
>>
>> To fix this problem, there are two options:
>> 1. Distinguish between the user input trial and the algorithm  
>> generated
>> trial as you guys mentioned before. If it's a user input trial,  
>> then don't
>> update the value at all.
>> 2. Set these immediate 4 neighbors as KnownPoints, and let the user  
>> compute
>> another layer outside these knownpoints and set them as trial  
>> points. This
>> is quite tedious for the user, since they need to figure out the  
>> "upwind"
>> themselves. Again, according to the FMM algorithm itself, this  
>> initial trial
>> computation should be done by the algorithm, not the user. That's  
>> why I
>> think we should let the algorithm to compute the initial trial.
>>
>> Thanks
>> Siqi
>>
>> On Thu, Jan 7, 2010 at 6:07 PM, Luca Antiga <luca.antiga at gmail.com>  
>> wrote:
>>>
>>> Hi Siqi,
>>>  this sounds like a perfect contribution for the Insight Journal.
>>> I suggest to write a new class for the second-order implementation.
>>> As for the minheap, I agree with you, it would save some memory.
>>> As for setting trial points: in the current implementation, if you  
>>> don't
>>> set trial points you won't have anything to process in the  
>>> TrialHeap.
>>> I understand your point, but I am kind of in favor of the current  
>>> way of
>>> working. Setting alive points doesn't necessarily mean that you want
>>> the solution to propagate automatically starting from their boundary
>>> with far points.
>>> This could indeed be an option, but it's not
>>> necessarily always practically
>>> convenient. Is there any particular reason why you wouldn't want  
>>> to set
>>> your
>>> initial points as trial?
>>>
>>> Luca
>>>
>>> On Jan 7, 2010, at 11:47 PM, siqi chen wrote:
>>>
>>> It definitely should be committed. I also have several suggestions  
>>> about
>>> fastmarching implementation in ITK.
>>>
>>> 1. I think it's quite misleading to say that "In order for the  
>>> filter to
>>> evolve, at least some trial points must be specified." I think it  
>>> should be
>>> "at least some alive points must be specified". The initial trial  
>>> points
>>> should be calculated by the algorithm itself, not by the user. For  
>>> example,
>>> when I start with FastMarchingImageFilter, I want to try a simple  
>>> example of
>>> calculating a distance map to [50,50], Mr. Kevin Hobbs told me the  
>>> right way
>>> is to set [50,50] as trial point. However, I think it is not right
>>> description. The right way is to set [50,50] as alive points, and  
>>> the
>>> algorithm computes the initial trial points and start the iteration.
>>>
>>> 2. Another thing is about heap implementation. Currently,
>>> std::priority_queue is used, and there is some issue as Doxygen  
>>> described.
>>> I think we can use a minheap as the basic data structure. I wrote  
>>> a VTK fast
>>> maching filter yesterday and I used this min heap data structure.
>>>
>>> 3. Possible improvements. Current implementation is based on Prof.
>>> Sethian' s work, which is actually a first order approximation of  
>>> distance
>>> map. This implementation will introduce large errors in the diagonal
>>> direction. With a little bit change of code, we can implement a  
>>> higher order
>>> accuracy FMM method. The detail can be found here:
>>> http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=841 .
>>>
>>> Thanks
>>> Siqi



More information about the Insight-users mailing list