为什么Python ITK的PyBuffer不接受我的numpy数组?

4 投票
1 回答
1389 浏览
提问于 2025-04-17 05:38

我正在使用Python 2.6和ITK的封装(来自PythonXY 2.6.6.2)。我想把一个3D图像从numpy/scipy发送到itk进行处理。

import itk
imageType = itk.Image.F3
buf =  scipy.zeros( (100,100,100), dtype = float) 
itkImage = itk.PyBuffer[imageType].GetImageFromArray(buf)

使用GetImageFromArray()时出现了以下错误:

RuntimeError: Contiguous array couldn't be created from input python object

但是,如果我不自己创建缓冲区,而是让ITK自己创建图像,GetImageFromArray()就突然可以用了:

import itk
imageType = itk.Image.F3
itkImage1 = imageType.New(Regions=[256, 256, 256])
buf = itk.PyBuffer[imageType].GetArrayFromImage(itkImage1)
itkImage2 = itk.PyBuffer[imageType].GetImageFromArray(buf)

我该如何自己创建一个numpy数组,使GetImageFromArray()能够接受呢?

1 个回答

6

这个答案很简单:

  • 在Python中,“float”通常是64位的(在C语言中叫做double)。
  • 而在itk中,F3是32位的浮点数。

指定正确的ndarray类型就能让它正常工作:

import itk
imageType = itk.Image.F3
buf =  scipy.zeros( (100,100,100), dtype = numpy.float32)
itkImage = itk.PyBuffer[imageType].GetImageFromArray(buf)

撰写回答