[Insight-users] compute an abs. and rel. distance-field image based on a start front, an obstacle image and a finish front

Dan Mueller dan.muel at gmail.com
Tue Aug 20 07:57:03 EDT 2013


Hi Roman,

Concerning your question specifying Fast Marching starting points from
a binary image, you may find some inspiration from the following file:
https://code.google.com/p/manageditk/source/browse/trunk/Source/Modules/LevelSetFilters/itkFastMarchingImageFilter.txx?r=2
(see SetTrialPointsFromImage method).

Good luck.

Regards, Dan

On 19 August 2013 19:58, Dr. Roman Grothausmann
<grothausmann.roman at mh-hannover.de> wrote:
> Hello Dan,
>
>
> Thank You very much for Your answer. It's Your publication I got the idea
> from (as You had suggested before, I had already used it trying to compute
> center-lines in tomograms), however, if I understand it correctly, it seems
> that SpeedFunctionToPathFilter expects start points to be set. How can I
> specify start points via a binary image? Would I have to iterate over the
> image and for each fg value add its coordinates as start point?
> As currently I'm not interested in "center lines" but in a kind of distance
> map would itkFastMarchingImageFilter be the right choice?
>
> Below is my current code which compiles fine but does not yield the desired
> output (only a binary image in float format).
> My guess is that SetBinaryMask is not meant for setting the start front,
> however I could not find what it is actually meant for in the docs.
> I only found one example where SetBinaryMask is used but it also sets
> AlivePoints TrialPoints:
> http://webcache.googleusercontent.com/search?q=cache:seDik6jwW0MJ:https://itk.icts.uiowa.edu/fisheye/browse/~raw,r%3D8cefdc7bbda0183442666f236866ba25bcda853f/ITK/Testing/Code/Algorithms/itkFastMarchingTest2.cxx+itk+FastMarchingImageFilter+%22SetBinaryMask%22&cd=7&hl=de&ct=clnk&gl=de
>
> What do I have to do to set the start front (and if necessary the trial
> front) to consist of the border pixels of the first binary image. As it says
> in the docs: the trial points "can for instance be specified as the layer of
> pixels around the alive points". What would be the best way to do that?
>
>
> Thanks for any help or hints
> Roman
>
> _____________________________________
>
>
> template<typename InputPixelType, size_t Dimension>
> //int DoIt(std::string ifn, std::string ofn){
> int DoIt(int argc, char *argv[]){
>
>     typedef float SpeedPixelType;
>     //typedef float OutputPixelType;
>     //typedef unsigned char OutputPixelType;
>     //typedef unsigned int OutputPixelType;
>     //typedef InputPixelType OutputPixelType;
>     typedef SpeedPixelType OutputPixelType;
>     //typedef TLevelSet OutputPixelType;
>     // typedef float ScalarPixelType;
>
>     // typedef itk::Image< ScalarPixelType, Dimension > LevelSetImageType;
>
>     typedef itk::Image<InputPixelType, Dimension>  InputImageType;
>     typedef itk::Image<SpeedPixelType, Dimension>  SpeedImageType;
>     typedef itk::Image<OutputPixelType, Dimension>  OutputImageType;
>
>     typedef itk::ImageFileReader<InputImageType> ReaderType;
>     typename ReaderType::Pointer reader = ReaderType::New();
>     typename ReaderType::Pointer reader2 = ReaderType::New();
>
>     reader->SetFileName(argv[1]);
>     FilterWatcher watcherI(reader, "reading");
>     try
>         {
>         reader->Update();
>         }
>     catch (itk::ExceptionObject &ex)
>         {
>         if (!strcmp(ex.GetDescription(), "Filter does not have progress.")){
>             std::cerr << ex << std::endl;
>             //std::cerr << ex.GetDescription() << std::endl;
>             return EXIT_FAILURE;
>             }
>         }
>
>     reader2->SetFileName(argv[2]);
>     FilterWatcher watcherI2(reader2, "reading");
>     try
>         {
>         reader2->Update();
>         }
>     catch (itk::ExceptionObject &ex)
>         {
>         if (!strcmp(ex.GetDescription(), "Filter does not have progress.")){
>             std::cerr << ex << std::endl;
>             //std::cerr << ex.GetDescription() << std::endl;
>             return EXIT_FAILURE;
>             }
>         }
>
>
>     ////convert binary image to speed image, i.e. scale to [0; 1]
>     typedef itk::RescaleIntensityImageFilter<InputImageType, SpeedImageType>
> RescaleType;
>     typename RescaleType::Pointer rescaler = RescaleType::New();
>     rescaler->SetInput(reader->GetOutput());
>     rescaler->SetOutputMinimum(0);
>     rescaler->SetOutputMaximum(1);
>     rescaler->Update();
>
>     ////convert binary image to speed image, i.e. scale to [0; 1]
>     typedef itk::RescaleIntensityImageFilter<InputImageType, SpeedImageType>
> RescaleType;
>     typename RescaleType::Pointer rescaler2 = RescaleType::New();
>     rescaler2->SetInput(reader2->GetOutput());
>     rescaler2->SetOutputMinimum(0);
>     rescaler2->SetOutputMaximum(1);
>     rescaler2->Update();
>
>
>     //typedef itk::FastMarchingImageFilter<InputImageType, SpeedImageType>
> FilterType;
>     typedef itk::FastMarchingImageFilter<SpeedImageType, SpeedImageType>
> FilterType;
>     typename FilterType::Pointer filter = FilterType::New();
>     //filter->SetBinaryMask(reader->GetOutput());//setting the start front
> via an image
>     filter->SetBinaryMask(rescaler->GetOutput());//setting the start front
> via an image
>     filter->SetInput(rescaler2->GetOutput());//setting the speed image
>
>     filter->SetStoppingValue( 100.0 );
>
>
>     FilterWatcher watcher(filter, "FastMarchingImageFilter");
>     try {
>         filter->Update();
>         //std::cout << std::endl;
>         }
>     catch (itk::ExceptionObject &ex)
>         {
>         std::cout << ex << std::endl;
>         return EXIT_FAILURE;
>         }
>
>
>
>     typedef itk::ImageFileWriter<OutputImageType>  WriterType;
>     typename WriterType::Pointer writer = WriterType::New();
>
>     FilterWatcher watcherO(writer, "writing");
>     writer->SetFileName(argv[3]);
>     writer->SetInput(filter->GetOutput());
>     try
>         {
>         writer->Update();
>         }
>     catch (itk::ExceptionObject &ex)
>         {
>         std::cout << ex << std::endl;
>         return EXIT_FAILURE;
>         }
>
>
>
>
>     return EXIT_SUCCESS;
>
>
>     }
>
>
>
>
> On 16/08/13 23:01, Dan Mueller wrote:
>>
>> Hi Roman,
>>
>> This can be achieved with Fast Marching: the start front image will be
>> your
>> trial points, and the obstacle image the speed function (0.0 for
>> obstacles, 1.0
>> for areas the front can expand).
>>
>> You may be interested in the following Insight Journal publication: Fast
>> Marching Minimal Path Extraction
>> http://www.insight-journal.org/browse/publication/213
>>
>> One of the examples shows how to extract a continuous directed path front
>> a
>> starting point and avoiding obstacles.
>>
>> HTH
>>
>> Cheers, Dan
>>
>> On 16 Aug 2013 22:46, "Dr. Roman Grothausmann"
>> <grothausmann.roman at mh-hannover.de
>> <mailto:grothausmann.roman at mh-hannover.de>>
>>
>> wrote:
>>
>>     Dear mailing list members,
>>
>>
>>     Starting with two binary images, I want to compute a distance-field
>> image
>>       in a way that the first binary image is regarded as the start front
>> and
>>     the second binary image represents obstacles in the way of the
>> propagation
>>     front. From what I've read about similar problems either fast-marching
>> or
>>     geodesic filters can supply the output I'm looking for.
>>     What itk-filter do I need for that? The
>>     itkReconstructionByDilationIma__geFilter seems only to take one input
>> image
>>
>>     although in the description a marker and a mask image are mentioned.
>> The
>>     itkFastMarchingImageFilter seems to need a speed image, can that be
>>     constant, i.e. can it be the binary image containing the obstacles or
>> would
>>     I have to supply a distance-map of the obstacle image?
>>
>>     In a second step I'd like to normalize the absolute distance field
>> image of
>>     the previous result. For that I want to supply a third binary image.
>> The
>>     normalization should be done in a way that the abs. distance field
>> image is
>>     adjusted such that it contains relative distance, i.e. between 0 and
>> 1. The
>>     values of the abs. distance field should be adjusted such that the
>> pixels of
>>     the shortest paths from any of the pixels making up the propagation
>> start
>>     front to the finish front (contained in the third binary image) should
>>     linearly increase from 0 to 1. I'm not sure if this can be done
>> because
>>     possibly the solution is not well/uniquely defined.
>>     Any ideas or comments on this are very welcome.
>>
>>     Thanks for any help or hints
>>     Roman
>>
>>
>>
>>     --
>>     Dr. Roman Grothausmann
>>
>>     Tomographie und Digitale Bildverarbeitung
>>     Tomography and Digital Image Analysis
>>
>>     Institut für Funktionelle und Angewandte Anatomie, OE 4120
>>     Medizinische Hochschule Hannover
>>     Carl-Neuberg-Str. 1
>>     D-30625 Hannover
>>
>>     Tel. +49 511 532-9574 <tel:%2B49%20511%20532-9574>
>>     _______________________________________
>>     Powered by www.kitware.com <http://www.kitware.com>
>>
>>
>>     Visit other Kitware open-source projects at
>>     http://www.kitware.com/__opensource/opensource.html
>>
>>     <http://www.kitware.com/opensource/opensource.html>
>>
>>     Kitware offers ITK Training Courses, for more information visit:
>>     http://www.kitware.com/__products/protraining.php
>>
>>     <http://www.kitware.com/products/protraining.php>
>>
>>     Please keep messages on-topic and check the ITK FAQ at:
>>     http://www.itk.org/Wiki/ITK___FAQ <http://www.itk.org/Wiki/ITK_FAQ>
>>
>>
>>     Follow this link to subscribe/unsubscribe:
>>     http://www.itk.org/mailman/__listinfo/insight-users
>>     <http://www.itk.org/mailman/listinfo/insight-users>
>>
>
> --
> Dr. Roman Grothausmann
>
> Tomographie und Digitale Bildverarbeitung
> Tomography and Digital Image Analysis
>
> Institut für Funktionelle und Angewandte Anatomie, OE 4120
> Medizinische Hochschule Hannover
> Carl-Neuberg-Str. 1
> D-30625 Hannover
>
> Tel. +49 511 532-9574


More information about the Insight-users mailing list