[Insight-users] Graft error: cannot cast: is it a mini pipeline problem?

Bill Lorensen bill.lorensen at gmail.com
Sun Jul 26 08:18:09 EDT 2009


Richard,

It is a bug. I think we could place a CastImageFilter at the end of
the minipipeline before the graft's. The cast can run inplace and will
do nothing if the i/o types are the same.

Please file a bug report.

Bill

On Sun, Jul 26, 2009 at 3:30 AM, Richard Beare<richard.beare at gmail.com> wrote:
> Hi,
>
> On closer examination it looks to me like there is something wrong
> with the HMinima filter. The class has two template parameters - input
> and output image types, but the internal erode filter is instantiated
> using only the input type. This looks like a bug to me.
>
> On Sat, Jul 25, 2009 at 8:44 PM, Richard Beare<richard.beare at gmail.com> wrote:
>> The error seems to be coming from the HMinima filter (determined by
>> updating each filter in your pipeline individually and asking the
>> debugger where the crash happens), but I can't see any obvious problem
>> with it. Perhaps there is some problem with reconstruction by erosion
>> filter, used by the HMinima filter.
>>
>>
>> On Sat, Jul 25, 2009 at 5:38 PM, <lynx.abraxas at freenet.de> wrote:
>>> Hello!
>>>
>>>
>>> Looking  at the other threads about Graft() I wonder if my "cannot cast" error
>>> has something to do with some minipipeline somewhere in the filters I use.  As
>>> far  as  I  understand  MorphologicalWatershedImageFilter  has a mini pipeline
>>> where as MorphologicalWatershedFromMarkersImageFilter has not.
>>> Another idea I have: Could the filters I connect in my program  be  the  wrong
>>> ones  and they don't fit to each other? Contrary they are pretty much the same
>>> as in segGel.cxx (from the watershed insight publication).
>>> How can I find out what PKN3itk10DataObjectE and  PKN3itk5ImageIsLj2EEE  stand
>>> for?
>>>
>>> Many thanks for any hints or help
>>> Lynx
>>>
>>> On 23/07/09 23:31:21, lynx.abraxas at freenet.de wrote:
>>>> Hello!
>>>>
>>>>
>>>> I've written the little test program below but it only works if I use MorphologicalWatershedImageFilter directly but not if I use MorphologicalWatershedFromMarkersImageFilter and hm, rm and cc as discribed in the publication. I used segGel.cxx as an example.
>>>> What is wrong with my test in long form?
>>>> What is causing:
>>>> terminate called after throwing an instance of 'itk::ExceptionObject'
>>>>   what():  /usr/local/include/InsightToolkit/Common/itkImage.txx:135:
>>>> itk::ERROR: Image(0x85dd268): itk::Image::Graft() cannot cast PKN3itk10DataObjectE to PKN3itk5ImageIsLj2EEE
>>>>
>>>> Many thanks for any hints or help
>>>> Lynx
>>>>
>>>>
>>>>
>>>>
>>>> #include <iostream>
>>>> #include "itkSignedDanielssonDistanceMapImageFilter.h"
>>>> #include "itkWatershedImageFilter.h"
>>>> #include "itkMorphologicalWatershedImageFilter.h"
>>>> #include "itkMorphologicalWatershedFromMarkersImageFilter.h"
>>>> #include "itkMaskImageFilter.h"
>>>> #include "itkRegionalMinimaImageFilter.h"
>>>> #include "itkHMinimaImageFilter.h"
>>>> #include "itkConnectedComponentImageFilter.h"
>>>>
>>>> //#include "itkImage.h"
>>>> #include "itkImageFileReader.h"
>>>> #include "itkImageFileWriter.h"
>>>> #include "itkRescaleIntensityImageFilter.h"
>>>> #include "itkInvertIntensityImageFilter.h"
>>>> #include "itkScalarToRGBPixelFunctor.h"
>>>> #include "itkUnaryFunctorImageFilter.h"
>>>> #include "itkLabelOverlayImageFilter.h"
>>>>
>>>>
>>>> int main( int argc, char * argv[] )
>>>> {
>>>>   if( argc < 3 )
>>>>     {
>>>>     std::cerr << "Usage: " << argv[0];
>>>>     std::cerr << " inputImageFile outputDistanceMapImageFile ";
>>>>     std::cerr << " outputVoronoiMapImageFile ";
>>>>     std::cerr << std::endl;
>>>>     return EXIT_FAILURE;
>>>>     }
>>>>
>>>>   typedef  unsigned char   InputPixelType;
>>>>   //typedef  float          FilterPixelType;
>>>>   typedef  signed short SDDMPType; // has to support negative values!
>>>>   typedef  unsigned char  OutputPixelType;
>>>>   const unsigned int Dimension = 2;
>>>>
>>>>   typedef itk::Image<InputPixelType,  Dimension>   InputImageType;
>>>>   typedef itk::Image<SDDMPType,  Dimension>   SDDMIType;
>>>>   typedef itk::Image<OutputPixelType, Dimension>   OutputImageType;
>>>>
>>>>   typedef itk::ImageFileReader<InputImageType>  ReaderType;
>>>>   typedef itk::ImageFileWriter<OutputImageType>  WriterType;
>>>>
>>>>   ReaderType::Pointer reader = ReaderType::New();
>>>>   WriterType::Pointer writer = WriterType::New();
>>>>
>>>>   reader->SetFileName(argv[1]);
>>>>
>>>>
>>>>
>>>>   typedef itk::SignedDanielssonDistanceMapImageFilter<InputImageType,  SDDMIType>  FilterType;
>>>>
>>>>   FilterType::Pointer sddm = FilterType::New();
>>>>   sddm->SetSquaredDistance(true);
>>>>   FilterType::Pointer sddm2 = FilterType::New();
>>>>   sddm2->SetSquaredDistance(true);
>>>>
>>>>
>>>>   typedef itk::HMinimaImageFilter<SDDMIType, OutputImageType> HMType;
>>>>   HMType::Pointer hm= HMType::New();
>>>>   hm->SetHeight(atoi(argv[5]));
>>>>   HMType::Pointer hm2= HMType::New();
>>>>   hm2->SetHeight(atoi(argv[5]));
>>>>
>>>>
>>>>   typedef itk::RegionalMinimaImageFilter<OutputImageType, OutputImageType> RegMinType;
>>>>   RegMinType::Pointer rm = RegMinType::New();
>>>>   rm->SetFullyConnected(atoi(argv[6]));
>>>>   RegMinType::Pointer rm2 = RegMinType::New();
>>>>   rm2->SetFullyConnected(atoi(argv[6]));
>>>>
>>>>
>>>>   typedef itk::ConnectedComponentImageFilter<OutputImageType, OutputImageType> LabelType;
>>>>   LabelType::Pointer cc = LabelType::New();
>>>>   cc->SetFullyConnected(atoi(argv[6]));
>>>>
>>>>
>>>>   typedef itk::MorphologicalWatershedFromMarkersImageFilter<SDDMIType, OutputImageType> MWatershedType;
>>>> //  typedef itk::MorphologicalWatershedImageFilter<SDDMIType, OutputImageType> MWatershedType;
>>>>   MWatershedType::Pointer ws = MWatershedType::New();
>>>>   ws->SetMarkWatershedLine(true);
>>>>   ws->SetFullyConnected(atoi(argv[6]));
>>>>
>>>>
>>>>   typedef itk::MaskImageFilter<OutputImageType, InputImageType, OutputImageType> MaskType;
>>>>   MaskType::Pointer mask = MaskType::New();
>>>>   mask->SetInput(1, reader->GetOutput());
>>>>
>>>>   typedef itk::RGBPixel<unsigned char>   RGBPixelType;
>>>>   typedef itk::Image<RGBPixelType, Dimension>    RGBImageType;
>>>>   typedef itk::Image<unsigned long, Dimension>   LabeledImageType;
>>>>
>>>>   typedef itk::Functor::ScalarToRGBPixelFunctor<OutputPixelType> ColorMapFunctorType_v;
>>>>   typedef itk::UnaryFunctorImageFilter<OutputImageType, RGBImageType, ColorMapFunctorType_v> ColorMapFilterType_v;
>>>>   ColorMapFilterType_v::Pointer colormapper_v = ColorMapFilterType_v::New();
>>>>
>>>>   typedef itk::Functor::ScalarToRGBPixelFunctor<unsigned long> ColorMapFunctorType;
>>>>   typedef itk::UnaryFunctorImageFilter<LabeledImageType, RGBImageType, ColorMapFunctorType> ColorMapFilterType;
>>>>   ColorMapFilterType::Pointer colormapper = ColorMapFilterType::New();
>>>>
>>>>   typedef itk::ImageFileWriter<RGBImageType> RGBFileWriterType;
>>>>   RGBFileWriterType::Pointer writer_rgb = RGBFileWriterType::New();
>>>>
>>>>
>>>>   typedef itk::LabelOverlayImageFilter<SDDMIType, OutputImageType, RGBImageType > OverlayType;
>>>>   OverlayType::Pointer overlay = OverlayType::New();
>>>>
>>>>
>>>>
>>>>
>>>> /////distmap
>>>>   std::cout << "signed danielson distance map..." << std::endl;
>>>>   sddm->SetInput(reader->GetOutput());
>>>>
>>>>
>>>>
>>>> ////Watershed
>>>>   std::cout << "Morphological watershed..." << std::endl;
>>>>   const char * watershedFileName = argv[4];
>>>>
>>>>  hm->SetInput(sddm->GetOutput());
>>>>  rm->SetInput(hm->GetOutput());
>>>>  cc->SetInput(rm->GetOutput());
>>>>
>>>> //  ws->SetInput(sddm->GetOutput());
>>>>   ws->SetMarkerImage(cc->GetOutput());
>>>>
>>>>   std::cout << "Creating first pre-output..." << std::endl;
>>>>   writer->SetFileName(argv[2]);
>>>>   writer->SetInput(rm->GetOutput());
>>>>   writer->Update();
>>>>
>>>>   std::cout << "Creating second pre-output..." << std::endl;
>>>>   writer->SetFileName(argv[3]);
>>>>   writer->SetInput(cc->GetOutput());
>>>>   writer->Update();
>>>>
>>>>   std::cout << "Creating nice output..." << std::endl;
>>>>   mask->SetInput(0, ws->GetOutput());
>>>>   //writer->SetInput(mask->GetOutput());
>>>>   colormapper_v->SetInput(mask->GetOutput());
>>>>   writer_rgb->SetInput(colormapper_v->GetOutput());
>>>>   writer_rgb->SetFileName(watershedFileName);
>>>>
>>>>   try
>>>>     {
>>>>     writer_rgb->Update();
>>>>     }
>>>>   catch( itk::ExceptionObject exp )
>>>>     {
>>>>     std::cerr << "Exception caught !" << std::endl;
>>>>     std::cerr <<     exp    << std::endl;
>>>>     }
>>>>
>>>>
>>>>   return EXIT_SUCCESS;
>>>> }
>>>>
>>>>
>>>>
>>>> _____________________________________
>>>> Powered by www.kitware.com
>>>>
>>>> Visit other Kitware open-source projects at
>>>> http://www.kitware.com/opensource/opensource.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
>>> _____________________________________
>>> Powered by www.kitware.com
>>>
>>> Visit other Kitware open-source projects at
>>> http://www.kitware.com/opensource/opensource.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
>>>
>>
> _____________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.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
>


More information about the Insight-users mailing list