python - 我如何在 Python 中使用 ITK 类

标签 python c++ swig boost-python itk

我在 CPP 中使用 ITK 编写了一个类,它读取目录中的所有文件,然后对它们进行平均。我想在使用 Python 构建的管道中使用此类。

我之前曾尝试使用 Swig 来包装模板代码,但根据 swig documenation ,它没有模板支持,需要明确指定类型名称。但是当我使用 ITK in Python ,接口(interface)与我期望的 Swig 生成的模板代码非常不同(函数/类名称中根本没有指定类型名称,这与 Swig 文档所说的相反)。

我的代码中的一小段说明了该类的用法,如下所示:

typedef unsigned char PixelType;
typedef itk::Image<PixelType, 2> ImageType;
typedef itk::NaryMeanImageFilter< ImageType, ImageType > FilterType; // custom class
typedef itk::ImageFileReader<ImageType> ReaderType;
typedef itk::ImageFileWriter<ImageType> WriterType;

ImageType::Pointer image = ImageType::New();
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
FilterType::Pointer filter = FilterType::New(); // custom class

for (unsigned int i = 0; i< fileNames.size(); ++i)
{
  reader->SetFileName(fileNames[i]);
  filter->SetInput(i, reader->GetOutput()); // custom class
}

writer->SetFileName(outName);
writer->SetInput(filter->GetOutput());
writer->Update();

该类的代码可以在 Git repository 中看到.我对使用 Boost::Python 增加项目的依赖性没有问题,但我需要一个起点才能继续。任何帮助将不胜感激。

谢谢。

更新:

在 Python 中的预期用法是,

readerType=itk.ImageFileReader[inputImageType]
reader=readerType.New()
filterType=itk.NaryMeanImageFilter[inputImageType,inputImageType]
filter=filterType.New()

for i in range(0, fileNames.size()):
    reader.SetFileName(fileNames[i])
    filter.SetInput(i, reader->GetOutput())

最佳答案

主要思想是使用 WrapITK 模块。它基本上使用内部 ITK 包装和解析机制(使用 GCCXML 进行 C++ 到 XML 解析——将来会移动到 CastXML)来生成 *.i 文件,SWIG 使用这些文件来生成 Python 包装代码。

基本思路:

  • 假设您有一个 ITK 过滤器“itkDummy.h”,它想从 Python 脚本中使用
  • 编写一个文件“itkDummy.wrap”,提供有关像素类型和模板初始化的信息。
  • 使用 WrapITK 模块(与 ITK Python 绑定(bind)一起使用)- 需要验证,因为每次尝试此操作时,我都会收到错误
  • 很高兴 itkDummy 可以从 Python 调用

引用:http://www.itk.org/Wiki/ITK/Release_4/Wrapping/BuildProcess

这就是我要找的。

关于python - 我如何在 Python 中使用 ITK 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30262773/

相关文章:

c++ - C++ 中带或不带花括号的初始化差异

node.js - 如何更改 .twig 的 node.js swig 模块扩展名

python - 具有外生变量矩阵的 statsmodels SARIMAX 大小不同

python - 在python中定义未知大小的矩阵

python - PyAudio - 将stream.read转换为int以获得幅度

javascript - 如何在 PPAPI 中将变量从 JavaScript 传递到 C++?

python - 将相同的操作应用于不同的数据帧

c++ - 为什么我可以在 constexpr 函数中修改 const_cast-ed 对象?

python - Swig - 包装 C 结构

java - SWIG 生成 Java 包装器私有(private)方法