【问题标题】:Writing ITK (insight Toolkit) results to local buffer将 ITK (insight Toolkit) 结果写入本地缓冲区
【发布时间】:2016-05-09 23:34:58
【问题描述】:

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

Insight Software Guide 有一个示例Book 1:第 4.1.7 章:“从缓冲区导入图像数据”WikiExamples 中也有相同的示例。

它展示了如何通过使用 ImportImageFilter 对象将 ITK 指针包装在 C++ 数组周围以进一步使用它。 但是,此示例随后使用 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()吗?

非常感谢您提供一个小代码示例或指向相应示例的链接。 (简单的“将图像数据导出到缓冲区”相当于给定的导入示例。)

【问题讨论】:

    标签: c++ itk


    【解决方案1】:
    ImageType::Pointer output = filter->GetOutput();
    ImageType::PixelContainer * outputContainer = output->GetPixelContainer();
    ImageType::PixelContainer::Element * resultBuffer = outputContainer->GetBufferPointer();
    

    请参阅 Image 文档和 ImportImageContainer 文档。

    【讨论】:

    • 谢谢。我会试一试。我假设假设我已经有一个指向我的 resultBuffer 的指针(来自我的应用程序),我可以使用 outputContainer->GetBufferPointer() 直接分配吗? (当然假设匹配类型和写入顺序。)[不过,我会阅读文档。 ]
    • 据我了解,*resultBuffer 现在是结果指针,但缓冲区仍然是与我事先准备好的不同的内存位置。假设我已经分配了一个结果内存(来自我的应用程序),我如何告诉 itk 将此内存用作缓冲区? (当然内存大小需要正确。)即我有一个 (float *) dst 目标指针,指向适当大小的连续内存。
    • 如果您使用的过滤器是 InPlaceImageFilter,itk.org/Doxygen/html/classitk_1_1InPlaceImageFilter.html,则可以重新使用输入内存。否则,可能可以使用 SetOutput 方法。在过滤器上调用 UpdateOutputInformation() 将使用正确的参数填充图像上的输出信息。
    • 我觉得应该编辑成“ImageType::PixelContainer * outputContainer = output->GetPixelContainer();”
    • 我也有同样的问题,容器可以复用分配的缓冲区吗?如果想使用分配的图像作为结果图像im=filter->GetOutput(),ITK 会重用 im 而不是创建临时图像,复制到 im 并销毁临时图像?
    【解决方案2】:

    这是对我的补救措施:

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

    这是可行的,因为当过滤器被销毁时,缓冲区已经被解析为“缓冲区”,它是指向数据的指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多