如何在 Python 中使用 ITK 类

Posted

技术标签:

【中文标题】如何在 Python 中使用 ITK 类【英文标题】:How do I use an ITK class in Python 【发布时间】:2015-05-15 15:00:25 【问题描述】:

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

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

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

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())

【问题讨论】:

您能否详细说明您已经尝试过什么以及 SWIG 的模板支持缺少什么?与 SWIG 类似,Boost.Python 不能包装模板,但它可以包装模板实例。集成两个绑定库即使不是不可能也是极其困难的,因为大多数绑定库在类型提取和分派方面具有独占控制权。此外,git 存储库链接 404s。 好吧,我尝试过使用 SWIG 实例化模板类,但用法却大不相同(例如,在上面的过滤器中,Python 的用法将是 itk.NaryMeanImageFilter_UC() 等,用于不同的数据类型)。我希望用法与不同的 ITK 模块保持一致 【参考方案1】:

主要思想是使用 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

这就是我要找的。

【讨论】:

【参考方案2】:

在 Itk 软件指南卷中。 1 (http://itk.org/ITKSoftwareGuide/html/Book1/ITKSoftwareGuide-Book1ch3.html#x34-410003.7) 他们解释说他们正在使用自己的包装,包括:

    gccxml,从C++程序生成xml文件 一个名为 igenerator.py 的脚本,它为 swig 生成 .i 文件 痛饮

我以前从未这样做过,但是您可以尝试通过他们的包装管道来查看生成的 *.i 文件的外观(或者甚至可以在本地 ITK 存储库中包含您的过滤器并查看是否自动包装作品)

【讨论】:

感谢您的回复,但这不是我想要的(我正在寻找开发细节,解释了我发布的链接)。 @scap3y 你删除了链接吗? 不,在版主删除后用“正确的描述”更新了答案。

以上是关于如何在 Python 中使用 ITK 类的主要内容,如果未能解决你的问题,请参考以下文章

java 父类如何在运行期动态获取子类类名

serversocket 类如何在同一个端口上服务多个客户端连接?

idea java中Jformdesigner自动生成的类如何在public static void main(String[] args)}中引用

如何在 Python 中使用 ITK 类

如何在 Python 中实现 itk 图像和 SimpleITK 图像之间的转换?

如何在配置了 ITK 的 Visual Studio 中使用 C++ 读取和写入图像