BmyGuest
BmyGuest

Reputation: 2949

Writing ITK (insight Toolkit) results to local buffer

After applying an ITK filter pipeline, how do I write back the result to a buffer to be used (outside ITK)?

The Insight Software Guide has an example Book 1: Chapter 4.1.7: "Importing Image Data from a Buffer", and the same example is also found in the WikiExamples.

It shows how one can wrap a ITK pointer around a C++ array to use it further by using the ImportImageFilter object. However, this example then uses a Writer object to write the filtered result to a file.

How do I write the filtered result into another C++ array instead? Or how do I overwrite the array I've used as input?

In essence, I've an application which contains an image in a buffer (localBuffer) which I can wrap following the example code:

 [...]
 const bool filterOwnsBuffer= false;    
 importFilter->SetImportPointer( localBuffer, size[0]*size[1], filterOwnsBuffer );

I can then use it it in any itk pipeline and 'update' it at a certain stage:

[...]
FilterType::Pointer filter = FilterType::New();
filter->SetInput( importFilter->GetOutput() );
filter->Update();

How do I now ensure that localbuffer has the filtered values? Or, alternatively, how do I set a different resultbuffer to the output values? Do I have to use the image iterator and 'loop' over my buffer manually? Or can I use the filter->GetOutput() more directly?

A little code example or a link to an according example would be very much appreciated. (Simply the "Exporting Image Data to a Buffer" equivalent to the given import example.)

Upvotes: 1

Views: 1282

Answers (2)

colddie
colddie

Reputation: 1049

Here is the remedy for me:

memcpy( buffer, filter->GetOutput()->GetBufferPointer(),
         size[0]*size[1]*sizeof(InputPixelType));

This works because by the time the filter is destroyed the buffer was already parsed to "buffer", which is the pointer to your data.

Upvotes: 0

Matt McCormick
Matt McCormick

Reputation: 314

ImageType::Pointer output = filter->GetOutput();
ImageType::PixelContainer * outputContainer = output->GetPixelContainer();
ImageType::PixelContainer::Element * resultBuffer = outputContainer->GetBufferPointer();

See the Image documentation and ImportImageContainer documentation.

Upvotes: 2

Related Questions