[Insight-users] [ITK Community] mini-pipeline output region problem

Matt McCormick matt.mccormick at kitware.com
Mon Feb 3 12:56:13 EST 2014


Hi Matthew,

GenerateOutputInformation may need to be implemented:
  http://www.itk.org/Doxygen/html/classitk_1_1ProcessObject.html#abe61fb6b7de8c443e7af1561bd722736

HTH,
Matt

On Mon, Feb 3, 2014 at 12:36 PM, matthew <mrrm at web.de> wrote:
> Hi everyone.
>
> I am trying to set up a mini-pipline in the GenerateData() of a filter.
> Basically, the filter takes a label map, crops and aggregates it and
> produces a binary image.
> If I inspect the output's regions, everything seems to be fine, but when
> passing the output to the file writer, I am getting the following error:
>
> terminate called after throwing an instance of
> 'itk::ImageFileWriterException'
>   what():
> /usr/local/ITK/Modules/IO/ImageBase/include/itkImageFileWriter.hxx:402:
> Did not get requested region!
> Requested:
> ImageRegion (0x7fff25c7a050)
>   Dimension: 3
>   Index: [55, 75, 60]
>   Size: [512, 512, 183]
> Actual:
> ImageRegion (0x7fff25c7a090)
>   Dimension: 3
>   Index: [55, 75, 60]
>   Size: [285, 282, 109]
>
>
> So, for some reason the writer uses the regions from the input labelmap and
> not the regions of the filter's output.
> What's going wrong here and how can I get rid of it?
>
>
> ************from main()******************
>
> inputFileName = ....
> outputFileName = ....
>
> ...
> typedef unsigned char
> BinaryPixelType;
> typedef itk::Image<BinaryPixelType, 3>
> BinaryImageType;
> typedef itk::LabelObject<BinaryPixelType, 3>
> LabelObjectType;
> typedef itk::LabelMap<LabelObjectType>
> LabelMapType;
> typedef itk::BinaryImageToLabelMapFilter<BinaryImageType, LabelMapType>
> ImageToLabelMapFilterType;
> typedef itk::ImageFileReader<BinaryImageType>
> ReaderType;
> typedef itk::ImageFileWriter< BinaryImageType >
> WriterType;
>
> const BinaryPixelType INSIDE  = itk::NumericTraits<BinaryPixelType>::One;
> const BinaryPixelType OUTSIDE = itk::NumericTraits<BinaryPixelType>::Zero;
>
>
> ReaderType::Pointer reader = ReaderType::New();
> reader->SetFileName( inputFileName );
>
> ImageToLabelMapFilterType::Pointer im2LabelMapFilter =
> ImageToLabelMapFilterType::New();
> im2LabelMapFilter->SetInputForegroundValue(INSIDE);
> im2LabelMapFilter->SetOutputBackgroundValue(OUTSIDE);
> im2LabelMapFilter->SetInput(reader->GetOutput());
>
> TestFilter<LabelMapType, BinaryImageType>::Pointer testFilter =
> TestFilter<LabelMapType, BinaryImageType>::New();
> testFilter->SetInput( im2LabelMapFilter->GetOutput() );
> testFilter->Update();
>
> testFilter->Print(std::cout, 3);
>
> testFilter->GetOutput()->Print(std::cout, 3);
>
> typename WriterType::Pointer writer = WriterType::New();
> writer->SetFileName( outputFileName );
> writer->SetInput(  testFilter->GetOutput() );
> writer->Update();
>
>
> ***********HEADER*****************
>
> #ifndef TESTFILTER_H_
> #define TESTFILTER_H_
>
> #include <itkLabelMapToBinaryImageFilter.h>
> #include <itkAutoCropLabelMapFilter.h>
> #include <itkAggregateLabelMapFilter.h>
> #include <itkLabelMapFilter.h>
> #include "itkNumericTraits.h"
> #include "itkObjectFactory.h"
> #include <itkLabelObject.h>
> #include <itkDataObject.h>
>
>
> template<class TLabelMap, class TBinaryImage>
> class TestFilter:
> public itk::LabelMapFilter<TLabelMap, TBinaryImage>
> {
>     public:
>
>         /** standard class typedefs. */
>         typedef TestFilter
> Self;
>         typedef itk::LabelMapFilter<TLabelMap, TBinaryImage>
> Superclass;
>         typedef itk::SmartPointer< Self >
> Pointer;
>
>         /** label map typedefs */
>         typedef TLabelMap
> LabelMapType;
>
>         /** binary output image typedefs **/
>         typedef TBinaryImage
> BinaryImageType;
>
>         /** label map filter typedefs */
>         typedef itk::LabelMapToBinaryImageFilter<LabelMapType,
> BinaryImageType>     LabelMapToBinaryImageFilter;
>         typedef itk::AutoCropLabelMapFilter<LabelMapType>
> AutoCropLabelMapFilterType;
>         typedef itk::AggregateLabelMapFilter<LabelMapType>
> AggregateLabelMapFilterType;
>
>         /** Run-time type information (and related methods). */
>         itkTypeMacro( TestFilter, LabelMapFilter);
>
>         /** Method for creation through the object factory. */
>         itkNewMacro(Self);
>
>     protected:
>
>          TestFilter(){ };
>         ~TestFilter(){ };
>         virtual void GenerateData();
>
>     private:
>
>         TestFilter(const Self &); //purposely not implemented
>         void operator=(const Self &);
> //purposely not implemented
> };
>
> #include "TestFilter.cpp"
>
> #endif /* TESTFILTER_H_ */
>
>
>
>
> **********SOURCE*****************
>
> #ifndef TESTFILTER_CPP_
> #define TESTFILTER_CPP_
>
> #include "TestFilter.h"
>
> template<class TLabelMap, class TBinaryImage>
> void
> TestFilter<TLabelMap, TBinaryImage>
> ::GenerateData()
> {
>         // allocate the output
>         this->AllocateOutputs();
>
>         // auto crop the input label map
>         typename AutoCropLabelMapFilterType::Pointer autoCropLabelMapFilter
> = AutoCropLabelMapFilterType::New();
>         autoCropLabelMapFilter->SetInput( this->GetInput() );
>
>         // aggregate croped input label map
>         typename AggregateLabelMapFilterType::Pointer
> aggregateLabelMapFilter = AggregateLabelMapFilterType::New();
>
> aggregateLabelMapFilter->SetInput(autoCropLabelMapFilter->GetOutput());
>
>         // generate a binary image from the label map
>         typename LabelMapToBinaryImageFilter::Pointer
> labelMapToBinaryImageFilter = LabelMapToBinaryImageFilter::New();
>         labelMapToBinaryImageFilter->SetInput(
> aggregateLabelMapFilter->GetOutput() );
>
> labelMapToBinaryImageFilter->SetForegroundValue(itk::NumericTraits<typename
> TBinaryImage::PixelType>::One);
>
> labelMapToBinaryImageFilter->SetBackgroundValue(itk::NumericTraits<typename
> TBinaryImage::PixelType>::Zero);
>
>         // Graft this filters output onto the mini-pipeline so the
> mini-pipeline
>         // has the correct region ivars and will write to this filters bulk
> data
>         // output.
>         labelMapToBinaryImageFilter->GraftOutput( this->GetOutput() );
>
>         // Update the filter
>         labelMapToBinaryImageFilter->Update();
>
>         // Graft the last output of the mini-pipeline onto this filters
> output so
>         // the final output has the correct region ivars and a handle to the
> final
>         // bulk data
>         this->GraftOutput(labelMapToBinaryImageFilter->GetOutput());
> }
>
> #endif
>
>
> **********testFilter->Print(std::cout, 3)*****************
>
>    TestFilter (0x1de60c0)
>      RTTI typeinfo:
> TestFilter<itk::LabelMap<itk::LabelObject<unsigned char, 3u> >,
> itk::Image<unsigned char, 3u> >
>      Reference Count: 1
>      Modified Time: 87
>      Debug: Off
>      Observers:
>        none
>      Inputs:
>        Primary: (0x1de5d60) *
>      Indexed Inputs:
>        0: Primary (0x1de5d60)
>      Required Input Names: Primary
>      NumberOfRequiredInputs: 1
>      Outputs:
>        Primary: (0x1dea5b0)
>      Indexed Outputs:
>        0: Primary (0x1dea5b0)
>      NumberOfRequiredOutputs: 1
>      Number Of Threads: 4
>      ReleaseDataFlag: Off
>      ReleaseDataBeforeUpdateFlag: Off
>      AbortGenerateData: Off
>      Progress: 0
>      Multithreader:
>        RTTI typeinfo:   itk::MultiThreader
>        Reference Count: 1
>        Modified Time: 76
>        Debug: Off
>        Observers:
>          none
>        Thread Count: 4
>        Global Maximum Number Of Threads: 128
>        Global Default Number Of Threads: 4
>      CoordinateTolerance: 1e-06
>      DirectionTolerance: 1e-06
>
>
> **********testFilter->GetOutput()->Print(std::cout, 3)*****************
>
>    Image (0x1dea5b0)
>      RTTI typeinfo:   itk::Image<unsigned char, 3u>
>      Reference Count: 1
>      Modified Time: 46718
>      Debug: Off
>      Observers:
>        none
>      Source: (0x1de60c0)
>      Source output name: Primary
>      Release Data: Off
>      Data Released: False
>      Global Release Data: Off
>      PipelineMTime: 246
>      UpdateMTime: 46719
>      RealTimeStamp: 0 seconds
>      LargestPossibleRegion:
>        Dimension: 3
>        Index: [55, 75, 60]
>        Size: [285, 282, 109]
>      BufferedRegion:
>        Dimension: 3
>        Index: [55, 75, 60]
>        Size: [285, 282, 109]
>      RequestedRegion:
>        Dimension: 3
>        Index: [55, 75, 60]
>        Size: [285, 282, 109]
>      Spacing: [0.74219, 0.74219, 1.5]
>      Origin: [0, 0, 0]
>      Direction:
> 1 0 0
> 0 1 0
> 0 0 1
>
>      IndexToPointMatrix:
> 0.74219 0 0
> 0 0.74219 0
> 0 0 1.5
>
>      PointToIndexMatrix:
> 1.34736 0 0
> 0 1.34736 0
> 0 0 0.666667
>
>      Inverse Direction:
> 1 0 0
> 0 1 0
> 0 0 1
>
>      PixelContainer:
>        ImportImageContainer (0x1dea870)
>          RTTI typeinfo:   itk::ImportImageContainer<unsigned long, unsigned
> char>
>          Reference Count: 1
>          Modified Time: 46709
>          Debug: Off
>          Observers:
>            none
>          Pointer: 0x7f37a41ee010
>          Container manages memory: true
>          Size: 8760330
>          Capacity: 47972352
>
>
>
>
> --
> View this message in context: http://itk-users.7.n7.nabble.com/mini-pipeline-output-region-problem-tp33314.html
> Sent from the ITK - Users mailing list archive at Nabble.com.
> _____________________________________
> 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.php
>
> 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
> _______________________________________________
> Community mailing list
> Community at itk.org
> http://public.kitware.com/cgi-bin/mailman/listinfo/community


More information about the Insight-users mailing list