[Insight-users] CastImageFilter BUG???

Lars Friedrich Lars lars-friedrich at gmx.net
Sun Apr 18 12:26:36 EDT 2010


Hi Luis,

yes, I already replaced the code-fragments with ExtractImageFilter which works without problems :)

OK, the new documentation clearly explains what we have to do if we liked to reduce dimension (though without specified region-requests)!

Thank you!

regards,

lars


-------- Original-Nachricht --------
> Datum: Sun, 18 Apr 2010 12:16:02 -0400
> Von: Luis Ibanez <luis.ibanez at kitware.com>
> An: Lars Friedrich Lars <lars-friedrich at gmx.net>
> CC: Insight-users at itk.org, Bradley Lowekamp <blowekamp at mail.nih.gov>
> Betreff: Re: [Insight-users] CastImageFilter BUG???

> Hi Lars,
> 
> It looks like this is a case in which:
> 
> 
> 1) The documentation incorrectly recommended a misuse of the class.
> 2) The misuse was later detected as a buggy behavior
> 3) The buggy behavior has been identified and fixed.
> 
> 
> The "feature" of reducing 3D to 2D dimensions only
> works in this filter due to a happy coincidence resulting
> from the way in which the image iterators are implemented.
> 
> Note for example, that the extracted slice can only be the
> one corresponding to the slowest changing index.
> 
> 
> Instead of using the CastImageFilter, you should use the
> 
>                           ExtractImageFilter
> 
> which is explicitly designed for dealing with dimensionality
> reduction between the input image and the output image.
> 
> For example, extracting one 2D slice from a 3D image,
> as illustrated in the Example:
> 
>     Insight/Examples/IO/ImageReadExtractWrite.cxx
> 
> Note that the ExtractImageFilter will do both the pixel
> casting and the dimensionality reduction.
> 
> In the meantime we have fixed the documentation
> of the itkCastImageFilter.
> http://public.kitware.com/cgi-bin/viewcvs.cgi/Code/BasicFilters/itkCastImageFilter.h?root=Insight&view=log
> 
> with the following diff:
> http://public.kitware.com/cgi-bin/viewcvs.cgi/Code/BasicFilters/itkCastImageFilter.h?root=Insight&r1=1.16&r2=1.17
> 
> 
> 
>       Regards,
> 
> 
>            Luis
> 
> 
> ----------------------------------------------------------------------------------------------------
> On Sun, Apr 18, 2010 at 10:52 AM, Lars Friedrich Lars <
> lars-friedrich at gmx.net> wrote:
> 
> > Hello,
> >
> > as can be retrieved from itk::CastImageFilter's Doxygen-entry, this
> filter
> > can obviously be used for casting a 3D-volume to a 2D-slice
> > (dimension-reduction).
> >
> > "... If you attempt to cast an image to a lower dimension, the first
> > "slice" (or line or volume) will be extracted. ..."
> >
> > I've been using this functionality for a while in an application.
> However,
> > today I changed something in the code (at completely different
> > code-fragment) and from this point my application started to throw
> segfaults
> > when executing it.
> > I traced the bug (in current ITK-CVS-version) and found out that casting
> > from a 3D-slice to a 2D-image causes the segfault. Inspecting the code
> of
> > itk::CastImageFilter and its superclass itk::UnaryFunctorImageFilter
> showed
> > me that the code lines 97-112 of itkUnaryFunctorImageFilter.txx seem to
> > cause the segfault:
> >
> >  for (i=0; i < Superclass::InputImageDimension; ++i)
> >      {
> >      outputSpacing[i] = inputSpacing[i];
> >      outputOrigin[i] = inputOrigin[i];
> >      for (j=0; j < Superclass::OutputImageDimension; j++)
> >        {
> >        if (j < Superclass::InputImageDimension)
> >          {
> >          outputDirection[j][i] = inputDirection[j][i];
> >          }
> >        else
> >          {
> >          outputDirection[j][i] = 0.0;
> >          }
> >        }
> >      }
> >
> > When casting from 3D to 2D the InputImageDimension=3, but the
> > OutputImageDimension=2. Writing to the 3rd elements of outputSpacing,
> > outputOrigin and outputDirection causes the memory-violation.
> >
> > Please correct me if I am wrong.
> >
> > However, it is scary and funny at the same time that my application has
> > worked without throwing segfaults and without any obvious errors for a
> few
> > weeks ...
> >
> > The example program below shows the bug (if it is a bug).
> >
> > regards,
> >
> > lars
> >
> >
> > // TestReductionCasting.cxx
> >
> > #include <iostream>
> > #include <stdlib.h>
> > #include <time.h>
> >
> > #include <itkCastImageFilter.h>
> > #include <itkImage.h>
> > #include <itkImageRegionIterator.h>
> >
> > int main(int argc, char *argv[])
> > {
> >  std::cerr << "Constructing 3D image ...";
> >  typedef itk::Image<float, 3> Image3DType;
> >  typedef itk::ImageRegionIterator<Image3DType> IteratorType;
> >
> >  Image3DType::RegionType region;
> >  Image3DType::SizeType size;
> >  Image3DType::IndexType start;
> >  Image3DType::SpacingType spacing;
> >  Image3DType::PointType origin;
> >  Image3DType::DirectionType orientation;
> >
> >  size[0] = 100; size[1] = 200; size[2] = 1;
> >  start.Fill(0);
> >  region.SetIndex(start);
> >  region.SetSize(size);
> >  spacing[0] = 0.25; spacing[1] = 0.5; spacing[2] = 1;
> >  origin[0] = 100; origin[1] = 200; origin[2] = -50;
> >  orientation.SetIdentity();
> >  Image3DType::Pointer image = Image3DType::New();
> >  image->SetRegions(region);
> >  image->SetSpacing(spacing);
> >  image->SetOrigin(origin);
> >  image->SetDirection(orientation);
> >  image->Allocate();
> >
> >  srand(time(NULL));
> >  IteratorType it(image, region);
> >  for (it.GoToBegin(); !it.IsAtEnd(); ++it)
> >  {
> >    it.Set(static_cast<float>(rand() % 100));
> >  }
> >  std::cerr << " DONE\n";
> >
> >  std::cerr << "Casting to 2D image (cast image filter) ...";
> >  typedef itk::Image<unsigned char, 2> Image2DType;
> >  typedef itk::CastImageFilter<Image3DType, Image2DType> CasterType;
> >
> >  CasterType::Pointer caster = CasterType::New();
> >  caster->SetInput(image);
> >  try
> >  {
> >    caster->Update(); // CAUSES SEGFAULT!!!
> >    std::cerr << " DONE\n";
> >  }
> >  catch (itk::ExceptionObject &e)
> >  {
> >    std::cerr << " ERROR\n";
> >  }
> >
> >  return EXIT_SUCCESS;
> > }
> >
> > --
> > GRATIS für alle GMX-Mitglieder: Die maxdome Movie-FLAT!
> > Jetzt freischalten unter http://portal.gmx.net/de/go/maxdome01
> > _____________________________________
> > Powered by www.kitware.com
> >
> > Visit other Kitware open-source projects at
> > http://www.kitware.com/opensource/opensource.html
> >
> > Kitware offers ITK Training Courses, for more information visit:
> > http://www.kitware.com/products/protraining.html
> >
> > Please keep messages on-topic and check the ITK FAQ at:
> > http://www.itk.org/Wiki/ITK_FAQ
> >
> > Follow this link to subscribe/unsubscribe:
> > http://www.itk.org/mailman/listinfo/insight-users
> >

-- 
GRATIS für alle GMX-Mitglieder: Die maxdome Movie-FLAT!
Jetzt freischalten unter http://portal.gmx.net/de/go/maxdome01


More information about the Insight-users mailing list