[ITK-users] Proper chaining of filters

Joël Schaerer joel.schaerer at laposte.net
Thu Oct 2 05:33:06 EDT 2014


Hi all,

I've noticed a couple times that when building a pipeline with ITK, you 
need to keep a reference to all filters before the pipeline is updated. 
This seems a little counter-intuitive to me, so I would like to better 
understand the issue and see if there is a way around it.

As an example, the following code doesn't work:

   DilateType::Pointer dilate = DilateType::New();
   dilate->SetInput(thresh->GetOutput());
   dilate->SetKernel(kernel);

   dilate_filters.push_back(dilate);
   for (int i=0; i<14; ++i) {
     DilateType::Pointer temp = DilateType::New();
     temp->SetInput(dilate->GetOutput());
     temp->SetKernel(kernel);
     dilate = temp;
   }
   dilate->Update();

Regions don't get propagated properly and I get the following exception 
when writing the output:

C++ exception with description 
"/home/joel/workspace/ITK/Modules/IO/ImageBase/include/itkImageFileWriter.hxx:290:
itk::ERROR: ImageFileWriter(0x3130460): Largest possible region does not 
fully contain requested paste IO regionPaste IO region: ImageIORegion 
(0x7fff9bb72cc0)
   Dimension: 3
   Index: 0 0 0
   Size: 0 0 0
Largest possible region: ImageRegion (0x7fff9bb72bc0)
   Dimension: 3
   Index: [0, 0, 0]
   Size: [0, 0, 0]
" thrown in the test body.

My guess is that the filters get destroyed before they get a chance to 
be executed. If I explicitely keep references to each filter, it works:

   DilateType::Pointer dilate = DilateType::New();
   dilate->SetInput(thresh->GetOutput());
   dilate->SetKernel(kernel);
   // We need to keep a reference to each filter in the pipeline before 
it is updated
   std::vector<DilateType::Pointer> dilate_filters;
   dilate_filters.push_back(dilate);
   for (int i=0; i<14; ++i) {
     DilateType::Pointer temp = DilateType::New();
     temp->SetInput(dilate_filters.back()->GetOutput());
     temp->SetKernel(kernel);
     dilate = temp;
     dilate_filters.push_back(temp);
   }
   dilate_filters.back()->Update();

My question is, why doesn't a filter keep a reference to the previous 
filter in the pipeline? Is there a way around this?

Thanks!

Joël


More information about the Insight-users mailing list