[Insight-users] FastMarchingImageFilter seg fault = Negative Spacing

Luis Ibanez luis.ibanez@kitware.com
Sat, 25 Jan 2003 00:27:20 -0500


Hi Mathieu,

The short answer is that ITK is quite unhappy
with the negative spacing in your image.


The long answer is that the RecursiveGaussianImageFilter
used to compute the Gradient Magnitude, takes the spacing
into consideration for the computation. ITK is assuming
positive spacings all over the place.



Now, just to recover your faith on the beauty of the
FastMarchingImageFilter, please do the following
exercise:


1) Take the simple program ImageReadWrite.cxx

    In the directory

        Insight/Examples/IO

    Modify the code to make Dimension = 3
    instead of Dimension = 2.

    Recompile it.

    Then, you get for free a file format converter
    from MetaImage to VTK and back.

    Not bad for 5 minutes of work     :-)


2) Take any of the BrainWeb volumes in the ftp site

     ftp://public.kitware.com/pub/itk/Data/

     download it, expand the tgz.

     and execute (for example):

     ImageReadWrite  brainweb010102.mha  brainweb010102.vtk

     This command line will read the BrainWeb
     volume from the MetaImage format and save it
     in VTK format.


3)  Execute again FastMarchingImageFilter

     You may want to update your CVS version of ITK
     (if you are using one.)

     Some recent improvement have been made to the
     FastMarchingLevelSet demo-app in the past days.

     The most significant of these changes is the introduction
     of a Sigmoid for computing the speed image (a negative
     exponential was used before). This makes much easier
     to control the generation of an appropriate speed image.
     The justification is explained in detail on the document:

     http://www.itk.org/ItkSoftwareGuide.pdf
     (updated 9 minutes ago  :-)


4)  Load the volume in VTK format, it will take about 30
     seconds to load. Then, click on the "display" button
     after "Gradient Magnitude". The gradient computation
     will take about 30 seconds. A viewer will appear with
     the gradient magnitude of the volume.


     Now click on the "Display" button just after the
     "Linear + Sigmoid" button. It will take about 10 sec.
     Another viewer should appear with the result of
     passing the gradient magnitude through the sigmoid.
     If you clidck with the mouse on the image you will see
     intensity values in the lower right corner. Homogeneous
     regions should have values close to 1.0 and contour regions
     should have values close to 0.0

     Now click on the "Display" button just below the "Load"
     button. This will show a viewer with the original input image.
     By clicking in this image with the mouse you will select
     seed points. A red pixel is overlayed on top of every seed
     point you selected.  If you want to clear the list of seed
     points, there is a button "Clear Seeds" below the FastMarching
     button.  You don't need many seed for this excercise.

     Just go, for example, to slice 97 and click a seed point in
     the middle of each one of the ventricles. That should be enough.

     Now, click on the "Time-Crosssing Map" button just after
    "FastMarching". It will take about 5 seconds to compute the map.
     A viewer should appear with the result of the time-crossing map.
     By moving the slider at the right of the viewer you should be
     able to walk through the slices, and find black regions on the
     ventricles (around slices 70 to 100),


     Finally, click on the "Overlay" button on the top right of
     the GUI. It will compute the threshold of the time-crosssing map
     and overlay it in red on top of the input image. You can control
     the transparency of the overlay with the menu bar option on the
     viewer:  Click on "Overlay" in the menu bar and then in "Opacity",
     a small window with a slider will popup. Moving the slider you
     can change the opacity = (1-tranparency) of the red overlay.
     If you move now the slice-slider on the right of the viewer you
     will be able to visit all the slices.

     Time for Coffee !



     Now, while drinking your coffee, You will notice that the
     segmentation always falls short on touching the actual border of
     the ventricles. This is natural in Level Sets and it is mainly
     due to the width of the contour bands produced by the Gradient
     Magnitude filter. A smaller sigma could help to get closer to the
     contour,... but it will never be possible to get to it since a
     gradient will always have some width.

     In practice it could make sense to just apply a couple of
     Mathematical Morphology Dilations on the final binary mask.
     The size of the structurant element should be correlated with the
     sigma used in the gaussian.





5)  About the version of FLTK... just go with FLTK 1.1.1rc4
     you can download it from our "related software page"

   http://public.kitware.com/Insight/Web/HTML/DownloadRelatedSoftware.htm

   For windows
   http://public.kitware.com/Insight/Web/HTML/fltk-1.1.0rc4-source.zip

   For Unix
   http://public.kitware.com/Insight/Web/HTML/fltk-1.1.0rc4-source.tar.gz

   It is not the latest FLTK version, (and that's why we like it :-)



-------------------



    Please let us know if you find any problem,


     Thanks


       Luis



                    Enjoy ITK !




----------------------------------------------------


Hi all,
    I have tried FastMarchingImageFilter on a 3D image:

$ head image.vtk
# vtk DataFile Version 3.0
vtk output
ASCII
DATASET STRUCTURED_POINTS
DIMENSIONS 512 64 512
SPACING -0.878906 -2.10938 -0.878906
ORIGIN 222.035 78.857 231.947
CELL_DATA 16450623
POINT_DATA 16777216
SCALARS scalars short

I load it ok. I then press 'Gradient Magnitude' (default paramater 1.2).
And when I press 'Dsiplay', it segafults.

Here is the backtrace of gdb:

[malat@localhost Bin]$ gdb ./FastMarchingLevelSet
GNU gdb Red Hat Linux (5.1.90CVS-5)
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain
conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux"...
(gdb) run
Starting program: /home/malat/Kitware/InsightBin/Bin/FastMarchingLevelSet
[New Thread 1024 (LWP 7125)]
[New Thread 2049 (LWP 7140)]
[New Thread 1026 (LWP 7141)]

Program received signal SIGABRT, Aborted.
[Switching to Thread 1024 (LWP 7125)]
0x42029241 in kill () from /lib/i686/libc.so.6
(gdb) bt
#0  0x42029241 in kill () from /lib/i686/libc.so.6
#1  0x40039c4b in raise () from /lib/i686/libpthread.so.0
#2  0x4202a7d2 in abort () from /lib/i686/libc.so.6
#3  0x412e8fab in __default_terminate () at ../../gcc/libgcc2.c:-1
#4  0x412e8fca in __terminate () from /usr/local/lib/libfltk.so.1.1
#5  0x412e9d05 in throw_helper (eh=0x811cb80, pc=0x4128375c,
my_udata=0xbfffec30, offset_p=0xbfffec2c)
    from /usr/local/lib/libfltk.so.1.1
#6  0x412e9fff in __rethrow (index=0x80ba474) from
/usr/local/lib/libfltk.so.1.1
#7  0x0807439c in
itk::GradientMagnitudeRecursiveGaussianImageFilter<itk::Image<float, 3>,
itk::Image<float, 3> >::GenerateData (this=0x80cb2f0) at
/home/malat/Kitware/Insight/Code/Common/itkSmartPointer.h:74
#8  0x403941f1 in itk::ProcessObject::UpdateOutputData ()
    from /home/malat/Kitware/InsightBin/Lib/libITKCommon.so
#9  0x4037320b in itk::DataObject::UpdateOutputData () from
/home/malat/Kitware/InsightBin/Lib/libITKCommon.so
#10 0x40372d7e in itk::DataObject::Update () from
/home/malat/Kitware/InsightBin/Lib/libITKCommon.so
#11 0x40393773 in itk::ProcessObject::Update () from
/home/malat/Kitware/InsightBin/Lib/libITKCommon.so
#12 0x08066976 in FastMarchingLevelSetBase::ComputeGradientMagnitude
(this=0x80c90d0)
     at /home/malat/Kitware/Insight/Code/Common/itkSmartPointer.h:79
#13 0x08063ecf in FastMarchingLevelSetGUI::cb_Gradient (o=0x80d3818, v=0x0)
     at
/home/malat/Kitware/InsightBin/Applications/FastMarchingLevelSet/FastMarchingLevelSetGUI.cxx:69
#14 0x4128375d in Fl_Widget::do_callback (this=0x80d3818) at
../FL/Fl_Widget.H:179
#15 0x4128b62d in Fl_Button::handle (this=0x80d3818, event=2) at
Fl_Button.cxx:101
#16 0x4128235a in send (event=2, to=0x80d3818, window=0x80d2c50) at
Fl.cxx:531
#17 0x412826dd in Fl::handle (event=2, window=0x80d2c50) at Fl.cxx:606
#18 0x412d7165 in fl_handle (xevent=@0xbffff430) at Fl_x.cxx:884
#19 0x412d549b in do_queued_events () at Fl_x.cxx:170
#20 0x412d58d3 in fd_callback () at Fl_x.cxx:287
#21 0x412d57e0 in fl_wait (time_to_wait=1e+20) at Fl_x.cxx:236
#22 0x4128190b in Fl::wait (time_to_wait=1e+20) at Fl.cxx:273
#23 0x4128194e in Fl::run () at Fl.cxx:280
#24 0x08099dae in main ()
     at
/home/malat/Kitware/Insight/Applications/FastMarchingLevelSet/FastMarchingLevelSet.cxx:486
#25 0x42017499 in __libc_start_main () from /lib/i686/libc.so.6
(gdb) The program is running.  Exit anyway? (y or n) y



Any idea ?

Thanks a lot,
Mathieu
Ps: By the way ldd seems ok:
[malat@localhost Bin]$ ldd ./FastMarchingLevelSet
         libpthread.so.0 => /lib/i686/libpthread.so.0 (0x40031000)
         libdl.so.2 => /lib/libdl.so.2 (0x40046000)
         libITKAlgorithms.so => 
/home/malat/Kitware/InsightBin/Lib/libITKAlgorithms.so (0x40049000)
         libVXLNumerics.so => 
/home/malat/Kitware/InsightBin/Lib/libVXLNumerics.so (0x40063000)
         libITKCommon.so => 
/home/malat/Kitware/InsightBin/Lib/libITKCommon.so (0x40334000)
         libITKBasicFilters.so => 
/home/malat/Kitware/InsightBin/Lib/libITKBasicFilters.so (0x403c4000)
         libITKNumerics.so => 
/home/malat/Kitware/InsightBin/Lib/libITKNumerics.so (0x403ca000)
         libITKIO.so => /home/malat/Kitware/InsightBin/Lib/libITKIO.so
(0x40413000)
         libITKFltkImageViewer.so => 
/home/malat/Kitware/InsightBin/Lib/libITKFltkImageViewer.so (0x40495000)
         libITKVtkFltk.so => 
/home/malat/Kitware/InsightBin/Lib/libITKVtkFltk.so (0x404d1000)
         libvtkRendering.so => 
/home/malat/Kitware/VTKBin/Lib/libvtkRendering.so (0x404d8000)
         libvtkGraphics.so => 
/home/malat/Kitware/VTKBin/Lib/libvtkGraphics.so (0x4071b000)
         libvtkHybrid.so => 
/home/malat/Kitware/VTKBin/Lib/libvtkHybrid.so (0x409c0000)
         libvtkImaging.so => 
/home/malat/Kitware/VTKBin/Lib/libvtkImaging.so (0x40b3c000)
         libvtkIO.so => /home/malat/Kitware/VTKBin/Lib/libvtkIO.so
(0x40ddd000)
         libvtkFiltering.so => 
/home/malat/Kitware/VTKBin/Lib/libvtkFiltering.so (0x40fed000)
         libvtkCommon.so => 
/home/malat/Kitware/VTKBin/Lib/libvtkCommon.so (0x4105f000)
         libfltk.so.1.1 => /usr/local/lib/libfltk.so.1.1 (0x4125a000)
         libfltk_gl.so.1.1 => /usr/local/lib/libfltk_gl.so.1.1 (0x412fa000)
         libfltk_forms.so.1.1 => /usr/local/lib/libfltk_forms.so.1.1
(0x4130d000)
         libfltk_images.so.1.1 => /usr/local/lib/libfltk_images.so.1.1
(0x4131d000)
         libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x4132e000)
         libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x41403000)
         libGLU.so.1 => /usr/X11R6/lib/libGLU.so.1 (0x41410000)
         libGL.so.1 => /usr/lib/libGL.so.1 (0x4148b000)
         libitkpng.so => /home/malat/Kitware/InsightBin/Lib/libitkpng.so
(0x414d9000)
         libitkzlib.so => 
/home/malat/Kitware/InsightBin/Lib/libitkzlib.so (0x41501000)
         libITKMetaIO.so => 
/home/malat/Kitware/InsightBin/Lib/libITKMetaIO.so (0x41512000)
         libDICOMParser.so => 
/home/malat/Kitware/InsightBin/Lib/libDICOMParser.so (0x41547000)
         libITKGlut.so => 
/home/malat/Kitware/InsightBin/Lib/libITKGlut.so (0x4156e000)
         libglut.so.3 => /usr/lib/libglut.so.3 (0x41572000)
         libXmu.so.6 => /usr/X11R6/lib/libXmu.so.6 (0x415a6000)
         libXi.so.6 => /usr/X11R6/lib/libXi.so.6 (0x415bb000)
         libvtkftgl.so => /home/malat/Kitware/VTKBin/Lib/libvtkftgl.so
(0x415c3000)
         libvtkfreetype.so => 
/home/malat/Kitware/VTKBin/Lib/libvtkfreetype.so (0x415cc000)
         libXt.so.6 => /usr/X11R6/lib/libXt.so.6 (0x4160e000)
         libvtkpng.so => /home/malat/Kitware/VTKBin/Lib/libvtkpng.so
(0x4165a000)
         libvtktiff.so => /home/malat/Kitware/VTKBin/Lib/libvtktiff.so
(0x41685000)
         libvtkzlib.so => /home/malat/Kitware/VTKBin/Lib/libvtkzlib.so
(0x416d6000)
         libvtkjpeg.so => /home/malat/Kitware/VTKBin/Lib/libvtkjpeg.so
(0x416e7000)
         libvtkexpat.so => /home/malat/Kitware/VTKBin/Lib/libvtkexpat.so
(0x4170d000)
         libstdc++.so.5 => /usr/local/lib/libstdc++.so.5 (0x4173a000)
         libm.so.6 => /lib/i686/libm.so.6 (0x417ea000)
         libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
         libstdc++-libc6.2-2.so.3 => /usr/lib/libstdc++-libc6.2-2.so.3
(0x4180d000)
         libXft.so.1 => /usr/X11R6/lib/libXft.so.1 (0x41850000)
         libpng.so.2 => /usr/lib/libpng.so.2 (0x4187a000)
         libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x4189b000)
         libz.so.1 => /usr/lib/libz.so.1 (0x418ba000)
         libGLcore.so.1 => /usr/lib/libGLcore.so.1 (0x418c8000)
         libSM.so.6 => /usr/X11R6/lib/libSM.so.6 (0x41d5a000)
         libICE.so.6 => /usr/X11R6/lib/libICE.so.6 (0x41d62000)
         libgcc_s.so.1 => /usr/local/lib/libgcc_s.so.1 (0x41d79000)
         /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
         libXrender.so.1 => /usr/X11R6/lib/libXrender.so.1 (0x41d82000)
         libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x41d87000)


And finally (if someone reach that point), I am not sure about which
fltk verion I need:
According to the ITK FAQ:
http://www.itk.org/cgi-bin/InsightFAQ/InsightFAQ?query=fltk&querytype=simple&casefold=yes&req=search
I need rc6.
But according to http://itk.org/HTML/DownloadRelatedSoftware.htm
The only one available is rc4

Thanks again !
mathieu