我如何在Python中使用ITK类

sca*_*p3y 5 c++ python swig boost-python itk

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

我之前曾尝试使用Swig来包装模板代码,但根据swig文档,它没有模板支持,并且需要明确指定类型名称.但是当我在Python中使用ITK时,界面与我对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();
Run Code Online (Sandbox Code Playgroud)

可以在Git存储库中看到该类的代码.我没有使用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())
Run Code Online (Sandbox Code Playgroud)

sca*_*p3y 3

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

基本思想:

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

参考:http ://www.itk.org/Wiki/ITK/Release_4/Wrapping/BuildProcess

这就是我一直在寻找的。