将ITK(insight Toolkit)写入本地缓冲区

时间:2014-10-10 10:05:52

标签: c++ itk

应用ITK过滤器管道后,如何将结果写回要使用的缓冲区(ITK外部)?

Insight Software Guide有一个示例第1册:第4.1.7节:“从缓冲区导入图像数据”,同样的示例也可在WikiExamples中找到

它显示了如何使用ImportImageFilter对象围绕C ++数组包装ITK指针以进一步使用它。 但是,此示例然后使用Writer对象将筛选结果写入文件。

如何将过滤后的结果写入另一个C ++数组?或者我如何覆盖我用作输入的数组?

本质上,我有一个应用程序,它在缓冲区(localBuffer)中包含一个图像,我可以按照示例代码进行包装:

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

然后我可以在任何itk管道中使用它并在某个阶段“更新”它:

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

我现在如何确保localbuffer具有过滤值?或者,或者,如何为输出值设置不同的resultbuffer?我是否必须手动使用图像迭代器并在缓冲区上“循环”?或者我可以直接使用filter->GetOutput()吗?

非常感谢一个小代码示例或指向示例的链接。 (只需将“将图像数据导出到缓冲区”等同于给定的导入示例。)

2 个答案:

答案 0 :(得分:2)

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

请参阅Image文档和ImportImageContainer文档。

答案 1 :(得分:0)

以下是我的补救措施:

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

这是有效的,因为在销毁过滤器时,缓冲区已经被解析为" buffer",这是指向数据的指针。