[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